当我使用xgboost为2-cates classification problem
训练我的数据时,我想使用早期停止来获得最佳模型,但我很困惑在我使用哪一个预测早期停止将返回3种不同的选择。
例如,我应该使用
preds = model.predict(xgtest, ntree_limit=bst.best_iteration)
或者我应该使用
preds = model.predict(xgtest, ntree_limit=bst.best_ntree_limit)
或两者都正确,它们应该适用于不同的情况?如果是这样,我该如何判断使用哪一个?
以下是xgboost文档的原始引用,但它没有说明原因,我也没有找到这些参数之间的比较:
提前停止
如果您有验证集,可以使用提前停止查找 最佳助推数。提前停止至少需要 一套在逃避。如果有多个,它将使用最后一个。
训练(...,evals = evals,early_stopping_rounds = 10)
该模型将进行训练,直到验证分数停止改善。 验证错误至少需要减少 early_stopping_rounds继续训练。
如果提前停止,模型将有三个额外的字段: bst.best_score,bst.best_iteration和bst.best_ntree_limit。注意 train()将从最后一次迭代返回一个模型,而不是最好的模型。 镨 ediction
已经训练或加载的模型可以执行预测 数据集。
# 7 entities, each contains 10 features data = np.random.rand(7, 10) dtest = xgb.DMatrix(data) ypred = bst.predict(dtest)
如果提早停止 在培训期间启用,您可以从最佳状态获得预测 与bst.best_ntree_limit迭代:
ypred = bst.predict(dtest,ntree_limit=bst.best_ntree_limit)
提前致谢。
答案 0 :(得分:1)
在我看来,这两个参数指的是相同的想法,或者至少有相同的目标。但我宁愿使用:
preds = model.predict(xgtest, ntree_limit=bst.best_iteration)
从源代码中,我们可以看到 here best_ntree_limit
将被放弃而支持 best_iteration
。
def _get_booster_layer_trees(model: "Booster") -> Tuple[int, int]:
"""Get number of trees added to booster per-iteration. This function will be removed
once `best_ntree_limit` is dropped in favor of `best_iteration`. Returns
`num_parallel_tree` and `num_groups`.
"""
此外,best_ntree_limit
已从 EarlyStopping 文档页面中删除。
所以我认为这个属性存在只是为了向后兼容的原因。因此,根据此代码片段和文档,我们可以假设 best_ntree_limit
已被弃用或将被弃用。