我使用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。一个微小的差异可能归因于算法的差异,但我必须对插入符号建模做错了,以获得我在这里看到的巨大差异。我不想发布我的数据集,所以希望可以从代码中诊断出问题。任何帮助将不胜感激。
答案 0 :(得分:1)
GBT是决策树的集合。差异来自:
n_estimators = 4000
与n.trees = 100
)。max_depth = 5
与interaction.depth = 1
)。目前,您要将100 MB GradientBoostingClassifier
对象的F1得分与100 kB gbm
对象进行比较 - 一个GBT模型包含的信息量是其他信息的数千倍。
您可能希望使用sklearn2pmml和r2pmml包将两个模型导出到标准化PMML表示中,并查看生成的PMML文件(纯文本,因此可以在任何文本编辑器中打开)到更好地掌握其内部结构。