Python sci-kit learn(metrics):r2_score和explain_variance_score之间的区别?

mon*_*iz7 15 python scikit-learn

我注意到'r2_score'和'explain_variance_score'都是用于回归问题的内置sklearn.metrics方法.

我一直认为r2_score是模型解释的百分比差异.它与'explain_variance_score'有什么不同?

你何时会选择一个而不是另一个?

谢谢!

Yah*_*hya 12

我发现的大多数答案(包括此处)都强调R 2解释方差得分之间的差异,即:平均残差(即误差均值)。

但是,还存在一个重要的问题,那就是:为什么我到底需要考虑“误差均值”?


刷新:

R 2:是确定系数,其测量由(最小二乘)线性回归解释的变化量。

您可以从不同的角度看待它,以便评估这样的预测值y

方差actual_y × R 2实际_y = 方差预测_y

因此从直觉上讲,R 2越接近1,实际_y和预测_y将具有相同的方差(即,相同的扩展


如前所述,主要区别在于均值误差;如果我们看一下公式,就会发现这是真的:

R2 = 1 - [(Sum of Squared Residuals / n) / Variancey_actual]

Explained Variance Score = 1 - [Variance(Ypredicted - Yactual) / Variancey_actual]
Run Code Online (Sandbox Code Playgroud)

其中:

Variance(Ypredicted - Yactual) = (Sum of Squared Residuals - Mean Error) / n 
Run Code Online (Sandbox Code Playgroud)

因此,显然唯一的区别是我们要从第一个公式中减去平均误差!... 但是为什么呢?


当比较R 2得分解释方差得分时,我们基本上是在检验平均误差 ; 因此,如果R 2 =解释方差得分,则意味着:平均误差=

均值误差反映了我们的估计量的趋势,即:有偏估计与无偏估计


综上所述:

如果您希望使用无偏估计量,因此我们的模型不会低估或高估,则可以考虑将误差均值考虑在内。

  • 我不认为“方差(Y预测 - Y实际)=(残差平方和 - 平均误差)/ n”是正确的。它应该是“sum((Y预测-估计-平均误差)**2)/N”。检查源代码:https://github.com/scikit-learn/scikit-learn/blob/95119c13af77c76e150b753485c662b7c52a41a2/sklearn/metrics/_regression.py#L557 (2认同)

CT *_*Zhu 10

好的,看看这个例子:

In [123]:
#data
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print metrics.explained_variance_score(y_true, y_pred)
print metrics.r2_score(y_true, y_pred)
0.957173447537
0.948608137045
In [124]:
#what explained_variance_score really is
1-np.cov(np.array(y_true)-np.array(y_pred))/np.cov(y_true)
Out[124]:
0.95717344753747324
In [125]:
#what r^2 really is
1-((np.array(y_true)-np.array(y_pred))**2).sum()/(4*np.array(y_true).std()**2)
Out[125]:
0.94860813704496794
In [126]:
#Notice that the mean residue is not 0
(np.array(y_true)-np.array(y_pred)).mean()
Out[126]:
-0.25
In [127]:
#if the predicted values are different, such that the mean residue IS 0:
y_pred=[2.5, 0.0, 2, 7]
(np.array(y_true)-np.array(y_pred)).mean()
Out[127]:
0.0
In [128]:
#They become the same stuff
print metrics.explained_variance_score(y_true, y_pred)
print metrics.r2_score(y_true, y_pred)
0.982869379015
0.982869379015
Run Code Online (Sandbox Code Playgroud)

因此,当平均残差为0时,它们是相同的.根据您的需求选择哪一个,即平均残留假设为0?