为什么XGBoost无法向我显示正确的best_iteration和ntree_limit?

问题描述 投票:2回答:1

[我正在使用XGBoostClassifier创建二进制分类模型,但是在将正确的值设置为best_iterationntree_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-得分比低迭代的得分低。

python validation xgboost xgbclassifier
1个回答
0
投票

我认为您应该利用early_stopping_rounds参数。但是,您仍将获得上一次迭代的模型。检出xgboost方法的docs xgboost.XGBRegressior.fit(),它在early_stopping_rounds下显示:

该方法从上次迭代返回模型(不是最佳迭代)。

解决方法是在第一轮训练后创建一个新的分类器,并将n_estimators设置为使其完全停在以前的位置。

classifier = xgb.XGBClassifier(
    n_estimators=10000,
    early_stopping_rounds=50
    )
classifier.fit(X_train, y_train, 
               eval_metric=xgb_f1, 
               eval_set=[(X_test, y_test)], 
               verbose=True)
classifier_new = xgb.XGBClassifier(
    n_estimators=classifier.best_iteration
    )
classifier_new.fit(X_train, y_train,
                   eval_metric=xgb_f1, 
                   eval_set=[(X_test, y_test)], 
                   verbose=True)
© www.soinside.com 2019 - 2024. All rights reserved.