我正在使用 XGBoostClassifier 创建一个二元分类模型,但在获取best_iteration
and的正确值时遇到了一些问题ntree_limit
。
下面的代码是我的自定义评估指标:
def xgb_f1(y, t):
t = t.get_label()
y_bin = [1. if y_cont > 0.5 else 0. for y_cont in y]
return 'f1', f1_score(t, y_bin, average='macro')
这就是我创建和拟合分类器的方式:
classifier = xgb.XGBClassifier(n_estimators=10000)
classifier.fit(X_train, y_train,
eval_metric=xgb_f1,
eval_set=[(X_test, y_test)],
verbose=True)
这些是 XGBoost 在拟合期间显示给我的一些结果:
[1007] validation_0-error:0.181395 validation_0-f1:0.731411
[1355] validation_0-error:0.183721 validation_0-f1:0.735139
[1396] validation_0-error:0.183721 validation_0-f1:0.736116
[1426] validation_0-error:0.182558 validation_0-f1:0.737302
[3568] validation_0-error:0.186047 validation_0-f1:0.737557
[3791] validation_0-error:0.184884 validation_0-f1:0.7378
[9999] validation_0-error:0.210465 validation_0-f1:0.708715
正如您所看到的,由于 f1 得分最高,最佳迭代是迭代编号 3791,但是当我调用classifier.get_booster().best_iteration
它时,表明迭代编号 9999(最后一次迭代)是最好的,但不是。当我调用classifier.get_booster().best_ntree_limit
它时,它告诉我最好的限制是 10000,但我不这么认为,因为它让我的 f1 分数低于较低的迭代次数。