设置 XGBoost 提前停止的 Tol

Posted

技术标签:

【中文标题】设置 XGBoost 提前停止的 Tol【英文标题】:Setting Tol for XGBoost Early Stopping 【发布时间】:2017-10-02 00:39:45 【问题描述】:

我正在使用带有提前停止功能的 XGBoost。在大约 1000 个 epoch 之后,模型仍在改进,但改进的幅度非常低。即:

 clf = xgb.train(params, dtrain, num_boost_round=num_rounds, evals=watchlist, early_stopping_rounds=10)

是否可以为提前停止设置“tol”?即:不触发提前停止所需的最低改进水平。

Tol 是 SKLearn 模型中的常用参数,例如 MLPClassifier 和 QuadraticDiscriminantAnalysis。谢谢你。

【问题讨论】:

【参考方案1】:

我认为 xgboost 中没有参数tol,但您可以将early_stopping_round 设置得更高。这个参数意味着如果测试集的性能没有提高early_stopping_round 次,那么它就会停止。如果您知道在 1000 个 epoch 之后您的模型仍在改进但非常缓慢,例如将 early_stopping_round 设置为 50,这样它会更“容忍”性能的微小变化。

【讨论】:

您是说将early_stopping_round 设置得更低(而不是更高)?低值会比高值更早终止。【参考方案2】:

issue 仍然在 XGBoost Github 的 repo 中打开,因此即使 sklearnh2o 等包装器似乎已经具有此功能,xgboost 本身仍然缺少 stopping_tolerance 超参数。 .

让我们投票it here 以加快速度,好吗?

【讨论】:

【参考方案3】:

这个选项has been implemented。

只需将值传递给tolerance

    early_stop = xgb.callback.EarlyStopping(tolerance=1e5)

    booster = xgb.train(
        'objective': 'binary:logistic',
         'eval_metric': ['error', 'rmse'],
        D_train,
        evals=[(D_train, 'Train'), (D_valid, 'Valid')],
        callbacks=[early_stop],
        )

【讨论】:

以上是关于设置 XGBoost 提前停止的 Tol的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 提前停止给出 KeyError: 'best_msg'

XGBoost CV 和提前停止

XGBoost:在默认指标上提前停止,而不是自定义评估函数

在 SciKit-Learn 中使用 XGBoost 交叉验证进行网格搜索和提前停止

xgboost 文档有错吗? (早期停止轮次以及最佳和最后一次迭代)

如何从 xgboost 中的最佳迭代中保存模型?