Python sci-kit learn(指标):r2_score 和 explained_variance_score 的区别是什么?

31 投票
2 回答
19547 浏览
提问于 2025-04-18 10:50

我注意到,r2_scoreexplained_variance_score 都是 sklearn.metrics 里内置的方法,用于回归问题。

我一直以为 r2_score 是模型解释的方差百分比。那么它和 explained_variance_score 有什么不同呢?

在什么情况下你会选择其中一个而不是另一个呢?

谢谢!

2 个回答

38

我找到的大部分答案(包括这里的内容)都强调了 R2解释方差得分 之间的区别,也就是:平均残差(也就是误差的平均值)。

不过,有一个重要的问题没有被提到,那就是:我为什么要考虑误差的平均值呢?


简单回顾一下:

R2决定系数,它衡量的是线性回归(最小二乘法)解释的变化量。

为了评估 预测值 y,我们可以从另一个角度来看这个问题:

实际值的方差actual_y × R2actual_y = 预测值的方差predicted_y

所以直观上来说,R2 越接近 1,实际值和预测值的方差就会越 相同(也就是 分布相似)。


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

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

Explained Variance Score = 1 - [Variance(Ypredicted - Yactual) / Variancey_actual]

其中:

Variance(Ypredicted - Yactual) = (Sum of Squared Residuals - Mean Error) / n 

所以,很明显,唯一的区别就是我们在第一个公式中减去了 平均误差!……但是为什么呢?


当我们比较 R2 得分解释方差得分 时,实际上是在检查 平均误差;所以如果 R2 = 解释方差得分,那就意味着:平均误差 =

平均误差反映了我们估计器的倾向,也就是:有偏估计与无偏估计


总结:

如果你想要一个无偏的估计器,以确保我们的模型不会低估或高估,你可能需要考虑 平均误差

14

好的,看看这个例子:

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

所以,当平均残差为0时,它们是相同的。选择哪个取决于你的需求,也就是说,平均残差应该是0吗?

撰写回答