关于Python中XGBRegressor早停轮次工作机制的疑问
XGBRegressor早停机制疑问:为何最优轮次后仍训练到62轮?
我正在使用XGBRegressor开发模型,对早停轮次(early_stopping_rounds)的工作机制存在技术疑问。以下是我的代码:
model = XGBRegressor(n_jobs=-1, n_estimators=1000, early_stopping_rounds=50, random_state=42) model.fit(X_train, y_train, eval_set=[(X_train, y_train),(X_val,y_val)])
训练输出如下:
[0] validation_0-rmse:12740.82085 validation_1-rmse:14354.43509 [1] validation_0-rmse:9487.04070 validation_1-rmse:10616.13605 [2] validation_0-rmse:7283.04039 validation_1-rmse:8239.62752 [3] validation_0-rmse:5858.70801 validation_1-rmse:6670.77442 [4] validation_0-rmse:4965.48363 validation_1-rmse:5681.79305 [5] validation_0-rmse:4385.77247 validation_1-rmse:5110.99709 [6] validation_0-rmse:4043.46385 validation_1-rmse:4774.20268 [7] validation_0-rmse:3763.10815 validation_1-rmse:4635.01149 [8] validation_0-rmse:3591.72373 validation_1-rmse:4561.27221 [9] validation_0-rmse:3459.59007 validation_1-rmse:4520.31052 [10] validation_0-rmse:3364.49960 validation_1-rmse:4493.90137 [11] validation_0-rmse:3292.77090 validation_1-rmse:4488.63371 [12] validation_0-rmse:3261.68385 validation_1-rmse:4477.47174 [13] validation_0-rmse:3194.66407 validation_1-rmse:4479.46967 [14] validation_0-rmse:3131.46617 validation_1-rmse:4483.96315 [15] validation_0-rmse:3105.17158 validation_1-rmse:4496.17191 [16] validation_0-rmse:2980.64759 validation_1-rmse:4513.39312 [17] validation_0-rmse:2969.50538 validation_1-rmse:4515.67529 [18] validation_0-rmse:2928.73793 validation_1-rmse:4514.08650 [19] validation_0-rmse:2885.23440 validation_1-rmse:4512.02239 [20] validation_0-rmse:2877.47452 validation_1-rmse:4511.70923 [21] validation_0-rmse:2775.98275 validation_1-rmse:4541.79559 [22] validation_0-rmse:2665.77462 validation_1-rmse:4555.71092 [23] validation_0-rmse:2636.37427 validation_1-rmse:4549.20621 [24] validation_0-rmse:2562.55110 validation_1-rmse:4556.94927 ... [58] validation_0-rmse:1443.62609 validation_1-rmse:4736.20431 [59] validation_0-rmse:1423.84305 validation_1-rmse:4746.66728 [60] validation_0-rmse:1387.68330 validation_1-rmse:4747.30871 [61] validation_0-rmse:1367.73335 validation_1-rmse:4747.11801
我理解到模型共训练了62棵树,最优树数为13,但既然13是最优值,为什么在RMSE持续上升的情况下,模型仍会训练到62轮?
解答
核心原因是你设置的early_stopping_rounds=50的规则是:只有当验证集性能连续50轮没有出现新的最优值时,才会触发早停终止训练。
结合你的训练日志分析:
- 第12轮时,验证集RMSE(
validation_1-rmse)达到了当前最小值4477.47174,这才是真正的最优轮次(XGBoost轮次从0开始计数)。 - 从第13轮开始,每一轮的验证集RMSE都没有低于第12轮的最优值,这个“无提升”的计数开始累积。
- 当累积到第12+50=62轮时,连续50轮都没有出现更优的验证集性能,触发早停条件,训练停止。
另外需要明确:XGBRegressor在触发早停后,会自动保留最优轮次(第12轮)的模型参数,后续预测默认使用的是这个最优模型,而非最后训练的62轮模型。你可以通过model.best_iteration查看最优轮次编号,model.best_score_查看对应的最优分数。
内容的提问来源于stack exchange,提问作者Flavio Brienza
相关产品推荐
相关产品推荐

