XGBoost 迭代中的训练和测试误差都在减少

数据挖掘 xgboost 训练 评估
2022-02-28 02:55:01

我在训练 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)。

我得到的一个图(黄色是我的截止点,几乎是通过对独立集的测试确定的):

在此处输入图像描述

2个回答

这是一种常见情况,可能由多种原因引起,例如:

  1. 模型中的差异太大(例如,超参数调整是否识别出 eta、alpha、lambda、gamma、子采样/列采样/行采样、最小子权重和/或深度和叶子数量的高值?)
  2. 具有高方差的小数据集。XGBoost 容易过度拟合,当没有太多数据时,这种情况会加剧。
  3. 不打乱数据,以使验证集的方差低于训练集和测试集(或分布不同)。 train_test_split默认情况下会随机播放,因此如果您按照问题中的指示使用它来生成验证集,这应该不是问题。

提前停止训练是增加模型偏差的一种完全有效且常见的方法,并且基于验证集这样做是可以接受的。最好根据测试集停止训练。为此,您可以解决上述潜在问题。在不了解更多关于数据和验证集是如何生成的情况下,我能给出的最可靠的建议是改变超参数以增加模型偏差。

只是您正在使用训练集进行提前停止。

通过设置尝试

watchlist =  [(dtrain, 'train'), (dtest, 'eval')] # the last one is used for early stopping