Scikit-Learn 给出错误的 R 平方值

Nan*_*ain 3 python statistics python-3.x scikit-learn

我正在 Python 上训练机器学习模型,并使用 Scikit Learn 中的 R 平方度量来评估它们。Id 决定使用 Scikit 的 r2_score 函数,为其提供一个与输入 y_true 值相同的随机数组,以及与 y_predict 略有不同但值相同的数组。当数组的输入长度为 10 或更大时,我得到任意大(负)值;当输入长度小于 10 时,我得到 0。

from sklearn.metrics import r2_score
r2_score([213.91666667,  213.91666667,  213.91666667,  213.91666667,  213.91666667, 
      213.91666667, 213.91666667,  213.91666667,  213.91666667,  213.91666667],
    [213,  214,  214,  214,  214,  214,  214,  214,  214,  214])

>>> -1.1175847590636849e+26

r2_score([213.91666667,  213.91666667,  213.91666667,  213.91666667, 
      213.91666667, 213.91666667,  213.91666667,  213.91666667,  213.91666667],
    [213,  214,  214,  214,  214,  214,  214,  214,  214])

>>> 0
Run Code Online (Sandbox Code Playgroud)

nic*_*met 5

您注意到r2_score输出不正确是正确的。然而,这是一个更简单的计算问题的结果,而不是 scikit-learn 包的问题。

尝试跑步

>>> input_list = [213.91666667,  213.91666667,  213.91666667,  213.91666667,  213.91666667, 
  213.91666667, 213.91666667,  213.91666667,  213.91666667,  213.91666667]
>>> sum(input_list)/len(input_list)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,输出并不完全是 213.91666667(有限的精度误差;您可以在此处阅读更多相关信息)。为什么这很重要?

嗯,scikit-learn用户指南的部分给出了用于计算的具体公式r2_score

r2 公式

正如您所看到的,它r2_score只是 1 -(残差平方和)/(总平方和)。

在您指定的第一种情况下,残差平方和等于某个数字......并不重要。你可以很容易地计算出来;大约是0.09,看起来并不是很高。然而,由于上述浮点误差,总平方和并不完全为 0,而是一些非常非常小的数字(想想 10^-28 左右——非常小)。

因此,当您将残差平方和(大约 0.09)除以总平方和(一个非常小的数字)时,您将得到一个非常大的数字。由于从 1 中减去这个大数,因此您将得到一个高幅度的负数作为r2_score输出。

在第二种情况下,不会出现总平方和计算中的这种不精确性,因此分母为 0,并且函数在计算中看到未定义的值时应返回 0。