scikit-learn和caret GBM结果之间的区别?

时间:2017-07-30 01:05:29

标签: python r machine-learning scikit-learn r-caret

我使用scikit-learn和caret输入相同的数据得到了截然不同的F1分数。以下是我为每个人运行GBM模型的方法。

scikit-learn(F1是默认输出)

est = GradientBoostingClassifier(n_estimators = 4000, learning_rate = 0.1, max_depth = 5, max_features = 'log2', random_state = 0)
cv = StratifiedKFold(y = labels, n_folds = 10, shuffle = True, random_state = 0)
scores = cross_val_score(est, data, labels, scoring = 'f1', cv, n_jobs = -1)

插入符号(必须定义和调用F1):

f1 <- function(data, lev = NULL, model = NULL) {
      f1_val <- F1_Score(y_pred = data$pred, y_true = data$obs, positive = lev[1])
      c("F1" = f1_val)
 }
set.seed(0)
gbm <- train(label ~ ., 
           data = data, 
           method = "gbm",
           trControl = trainControl(method = "repeatedcv", number = 10, repeats = 3, 
                                    summaryFunction = f1, classProbs = TRUE),
           metric = "F1",
           verbose = FALSE)

从上面的代码中,我使用scikit-learn获得了~0.8的得分,使用插入符得到了~0.25。一个微小的差异可能归因于算法的差异,但我必须对插入符号建模做错了,以获得我在这里看到的巨大差异。我不想发布我的数据集,所以希望可以从代码中诊断出问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

GBT是决策树的集合。差异来自:

  • 整体中的决策树数量(n_estimators = 4000n.trees = 100)。
  • 各个决策树的形状(广度,深度)(max_depth = 5interaction.depth = 1)。

目前,您要将100 MB GradientBoostingClassifier对象的F1得分与100 kB gbm对象进行比较 - 一个GBT模型包含的信息量是其他信息的数千倍。

您可能希望使用sklearn2pmmlr2pmml包将两个模型导出到标准化PMML表示中,并查看生成的PMML文件(纯文本,因此可以在任何文本编辑器中打开)到更好地掌握其内部结构。