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

使用numpy与sklearn计算R²(决定系数)结果不一致原因求解

R²计算结果差异原因

两个自定义实现结果不一致的核心是my_r2_score_var的实现逻辑不符合R²的标准定义,具体问题如下:

  • 首先,R²的标准公式为 $R^2 = 1 - \frac{SS_{res}}{SS_{tot}}$,其中$SS_{res}$是残差平方和,即$\sum (y_{true} - y_{pred})^2$,$SS_{tot}$是总平方和,即$\sum (y_{true} - \overline{y_{true}})^2$。你实现的my_r2_score完全符合这个定义,所以和sklearn的r2_score输出结果一致。
  • 而my_r2_score_var用np.var(y_true - y_pred)代替了$\frac{SS_{res}}{N}$的逻辑,这只有在残差均值为0的前提下才能成立。因为np.var计算的是变量相对于自身均值的方差:$\text{var}(x) = \frac{\sum (x - \overline{x})^2}{N}$,只有当残差$x = y_{true} - y_{pred}$的均值$\overline{x}=0$时,$\sum x^2 = \sum (x - \overline{x})^2$,此时两个实现的结果才会相等。
  • 你的测试样例中,残差为[-0.5, -0.5, -0.5, -5, 0],均值为-1.3,显然不等于0,因此用残差的方差计算得到的结果和标准R²存在明显偏差。

补充说明:如果你的预测值是带截距项的线性回归输出,此时残差均值必然为0,my_r2_score和my_r2_score_var的输出结果就会完全一致。另外注意np.var默认自由度参数ddof=0,如果手动修改为ddof=1计算样本方差,哪怕残差均值为0,也会因为除数从N变为N-1导致结果出现微小差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:04