2017-07-30 81 views
0

我使用scikit-learn和caret获得了相同的输入数据,获得了截然不同的F1分数。以下是我如何为每个模型运行GBM模型。scikit-learn和caret GBM结果之间的区别?

scikit学习(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) 

从上面的代码,我得到的F1得分〜0.8使用scikit-learn和〜0.25使用脱字符号。一个小的差异可能归因于算法的差异,但是我必须在插入符号模型上做一些错误来获得我在这里看到的巨大差异。我不想发布我的数据集,所以希望可以通过代码来诊断问题。任何帮助将非常感激。

+0

是否存在您在插入符号中指定的随机状态参数? – blacksite

+0

@blacksite,不针对脱字符,但我在初始化模型之前设置种子。 –

回答

1

GBT是一个决策树的集合。区别来自:

  • 集合中的决策树数量(n_estimators = 4000n.trees = 100)。
  • 单个决策树的形状(宽度,深度)(max_depth = 5interaction.depth = 1)。

目前,你100 MBGradientBoostingClassifier对象的F1得分为100 KBgbm对象比较 - 一个GBT模型包含着数以千计的时间比其他更多信息。

您可能希望这两个模型导出到使用sklearn2pmmlr2pmml包装标准化PMML表示,并期待得到的PMML文件内(纯文本,这样可以在任何文本编辑器中打开),以更好地把握它们的内部结构。

+0

换句话说,为了让您的GBT对象大小相同,请使用参数'n_estimators = 100'和'max_depth = 1'重新训练您的'GradientBoostingClassifier'。 – user1808924

+0

此外,函数'prSummary'将为您计算F分数。 – topepo