- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
下面是一个关于 xgboost 提前停止回合参数的问题,以及它如何提供或不提供最佳迭代,这是拟合结束的原因。
在 xgboost 文档中,可以在 scikit learn api 部分 ( liên kết ) 中看到,当拟合因提前停止回合参数而停止时:
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,而不是最后一个.
我错了吗?如果错了,在哪里,你如何解释我遇到的行为?
感谢关注
câu trả lời hay nhất
我认为,这不是错误,而是不一致。
predict
方法的文档是正确的(例如参见 đây )。要 100% 确定最好查看代码:xgb github ,因此 predict
的行为与其文档中所述的一样,但 fit
文档已过时。请将其作为问题发布到 XGB github 上,他们将修复文档,或者您将成为 XGB 贡献者:)
关于python - xgboost 文档有误吗? (早期停止轮次以及最佳和最后一次迭代),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53483648/
我有一个经典的 ASP 页面 (VBscript),它在服务器端生成 XML,然后 Response.Writes。该页面根本没有客户端。 但是我需要将其转换为 JSON。由于我找不到有效的 ASP
我想从客户端应用程序的 HDFS 中读取特定的 SequenceFile。我可以使用 SequenceFile.Reader 来做到这一点,它工作正常。但是是否也可以通过分析抛出的 IOExcepti
Tôi là một lập trình viên xuất sắc, rất giỏi!