gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:15:47 24 4
gpt4 key购买 nike

下面是一个关于 xgboost 提前停止回合参数的问题,以及它如何提供或不提供最佳迭代,这是拟合结束的原因。

在 xgboost 文档中,可以在 scikit learn api 部分 ( link ) 中看到,当拟合因提前停止回合参数而停止时:

Activates early stopping. Validation error needs to decrease at least every "early_stopping_rounds" round(s) to continue training. Requires at least one item in evals. If there’s more than one, will use the last. Returns the model from the last iteration (not the best one).

当读到这个的时候,似乎返回的模型,在这种情况下,不是最好的,而是最后一个。它说,要在预测时访问最好的一个,可以使用 ntree_limit 参数调用预测,并在拟合结束时给出 bst.best_ntree_limit。

从这个意义上说,它应该与 xgboost 的训练一样工作,因为 scikitlearn api 的拟合似乎只是训练和其他的嵌入。

这里讨论得很激烈stack overflow discussion或这里 another discussion

但是当我试图解决这个问题并检查它如何处理我的数据时,我没有找到我认为应该有的行为。事实上,我遇到的行为根本不是那些讨论和文档中描述的行为。

我这样称呼:

reg = xgb.XGBRegressor(n_jobs=6, n_estimators = 100, max_depth= 5)

reg.fit(
X_train,
y_train,
eval_metric='rmse',
eval_set=[(X_train, y_train), (X_valid, y_valid)],
verbose=True,
early_stopping_rounds = 6)

这是我最后得到的:

[71]    validation_0-rmse:1.70071   validation_1-rmse:1.9382
[72] validation_0-rmse:1.69806 validation_1-rmse:1.93825
[73] validation_0-rmse:1.69732 validation_1-rmse:1.93803
Stopping. Best iteration:
[67] validation_0-rmse:1.70768 validation_1-rmse:1.93734

当我检查我使用的验证值时:

y_pred_valid = reg.predict(X_valid)
y_pred_valid_df = pd.DataFrame(y_pred_valid)
sqrt(mse(y_valid, y_pred_valid_df[0]))

我明白了

1.9373418403889535

如果拟合返回的是最后一次迭代而不是最佳迭代,它应该给出 1.93803 左右的 rmse,但它给出的 rmse 为 1.93734,恰好是最好的分数。

我通过两种方式再次检查:[编辑] 我已经根据@Eran Moshe 的回答编辑了下面的代码

y_pred_valid = reg.predict(X_valid, ntree_limit=reg.best_ntree_limit)
y_pred_valid_df = pd.DataFrame(y_pred_valid)
sqrt(mse(y_valid, y_pred_valid_df[0]))

1.9373418403889535

即使我只用 68 个估计量来调用拟合(知道最好的 iter 是第 67 个),所以我确信最后一个是最好的:

reg = xgb.XGBRegressor(n_jobs=6, n_estimators = 68, max_depth= 5)

reg.fit(
X_train,
y_train,
eval_metric='rmse',
eval_set=[(X_train, y_train), (X_valid, y_valid)],
verbose=True,
early_stopping_rounds = 6)

结果是一样的:

1.9373418403889535

所以这似乎导致了这样的想法,与文档和关于它的大量讨论不同,告诉 xgboost 的拟合,当被早期停止轮参数停止时,确实给出了最好的 iter,而不是最后一个.

我错了吗?如果错了,在哪里,你如何解释我遇到的行为?

感谢关注

最佳答案

我认为,这不是错误,而是不一致

predict 方法的文档是正确的(例如参见 here )。要 100% 确定最好查看代码:xgb github ,因此 predict 的行为与其文档中所述的一样,但 fit 文档已过时。请将其作为问题发布到 XGB github 上,他们将修复文档,或者您将成为 XGB 贡献者:)

关于python - xgboost 文档有误吗? (早期停止轮次以及最佳和最后一次迭代),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53483648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com