You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中XGBoost的Early Stopping Rounds为何未呈现最优结果?

XGBRegressor中early stopping rounds不显示最优结果的常见原因及解决办法
  • 未开启训练日志输出
    XGBoost默认不会打印每一轮的评估指标,你得手动开启verbose参数才能看到每轮的验证集表现和最终的最优轮次。示例代码:

    model = XGBRegressor()
    model.fit(X_train, y_train,
              eval_set=[(X_val, y_val)],
              early_stopping_rounds=10,
              verbose=True)  # 开启后会逐轮输出指标,最后标注最优轮次
    

    开启后控制台会显示类似[95] validation_0-rmse:0.110的日志,其中最优轮次会被单独标记出来(比如best iteration: 85)。

  • 误把停止轮次当成最优轮次
    early stopping触发时,训练会停止,但模型会自动保留最优轮次的权重,而非停止时的轮次。你可以通过模型的内置属性直接获取最优结果:

    print("实际最优轮次:", model.best_iteration)
    print("最优验证集分数:", model.best_score_)
    

    不要只看训练停止时的最后一行日志,最优轮次通常早于停止轮次。

  • 评估指标设置不符合需求
    如果你没指定eval_metric,XGBRegressor默认用RMSE,但如果你的任务需要其他指标(如MAE),或者指标的优化方向搞反了(比如把需要最小化的指标当成最大化),会导致你误以为显示的不是最优结果。务必指定匹配任务的评估指标:

    model.fit(X_train, y_train,
              eval_set=[(X_val, y_val)],
              eval_metric="mae",
              early_stopping_rounds=10,
              verbose=True)
    
  • 验证集数据存在问题
    如果验证集和训练集分布差异大、样本量过小,会导致验证集指标波动剧烈,early stopping选中的轮次可能在训练集上表现一般,但这是模型泛化能力最优的轮次。这种情况下建议检查验证集划分逻辑,比如用更合理的拆分方式(如时间序列任务用时序拆分,而非随机拆分),或者增大验证集比例。

内容的提问来源于stack exchange,提问作者Flavio Brienza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:35:25