Xgboost:bst.best_score,bst.best_iteration和bst.best_ntree_limit有什么区别?

时间:2017-04-21 04:54:16

标签: python machine-learning xgboost

当我使用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)

提前致谢。

1 个答案:

答案 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 已被弃用或将被弃用。