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

XGBRegressor score方法返回值异常:与sklearn r2_score结果不符

为什么XGBRegressor的score方法和sklearn r2_score结果不一致?

这个问题我碰到过,核心原因大概率是你调用sklearn的r2_score时参数顺序搞反了,再结合XGBoost v0.7版本的接口细节,给你拆解下:

1. 最直接的问题:参数顺序完全搞反了

sklearn的r2_score要求第一个参数是真实值(y_true),第二个是预测值(y_pred),但你写的是r2_score(y_pred, y_test),这直接颠倒了计算逻辑。

标准R²的计算公式是:

$R^2 = 1 - \frac{\sum (y_{true} - y_{pred})^2}{\sum (y_{true} - \bar{y}_{true})^2}$

如果参数反着传,计算的就变成了:

$1 - \frac{\sum (y_{pred} - y_{true})^2}{\sum (y_{pred} - \bar{y}_{pred})^2}$

两个公式的分母完全不同,结果自然会有明显差距。你只需要把调用改成r2_score(y_test, y_pred),应该就能得到和xgbr.score(x_test, y_test)接近的结果。

2. XGBoost v0.7版本score方法的行为

在v0.7版本中,XGBRegressor的score方法是完全兼容sklearn接口的,它默认计算的就是R²分数,内部逻辑其实就是调用predict得到预测值,再用正确的参数顺序调用sklearn的r2_score计算结果。所以只要你手动调用时参数正确,结果应该一致。

3. 其他可能的影响因素

如果纠正参数顺序后结果还是有差异,那要考虑这几点:

  • 样本权重:如果训练XGBRegressor时使用了sample_weight参数,那么调用score时需要传入测试集对应的sample_weight(xgbr.score(x_test, y_test, sample_weight=test_weights)),手动计算r2_score时也要加上这个参数,否则两边的计算会因为权重不一致产生差异。
  • 数值精度:极端情况下,浮点数计算的微小误差可能导致结果有极细微的差别,但不会像你遇到的0.917 vs 0.903这么大,所以这个可能性很低。

快速验证步骤

  1. 先修正r2_score的调用顺序:
    r2_score(y_test, y_pred)  # 注意y_test在前,y_pred在后
    
  2. 如果训练时用了样本权重,补充权重参数:
    # 假设你有测试集的权重test_sample_weight
    xgbr.score(x_test, y_test, sample_weight=test_sample_weight)
    r2_score(y_test, y_pred, sample_weight=test_sample_weight)
    

另外,XGBoost v0.7确实是比较老的版本了,官方文档当时也不够完善,建议如果条件允许的话升级到较新的稳定版本,不仅文档更全,接口行为也更贴合sklearn的规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:38:55