我在训练 XGBoost 分类器时遇到了问题,即使我使用 1000 个 num 提升轮和 10 个早期停止轮,训练和测试误差只会在更多迭代(num_boost_round)中减少。然后,当我尝试将模型应用于不用于测试和训练的单独集合时,我可以看到经过 100 轮训练的模型比 1000 轮的表现要好得多。我的学习率为 0.01。
我想知道这是否是正常情况(我应该在这个独立的验证集上提前停止)或者我是否做错了什么。从理论上讲,测试误差应该在某个时候开始增加,但这并没有发生。
我正在使用 XGBoost,我在训练/测试中拆分我的数据集,如下所示:
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
他们我用以下方式训练它:
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
progress = dict()
# Train and predict with early stopping
xg_reg = xgb.train(
params=params,
dtrain=dtrain, num_boost_round=boost_rounds,
evals=watchlist, # using validation on a test set for early stopping; ideally should be a separate validation set
early_stopping_rounds=early_stopping,
evals_result=progress)
请注意,我使用网格搜索来找到最佳超参数(params)。
我得到的一个图(黄色是我的截止点,几乎是通过对独立集的测试确定的):
