【发布时间】:2014-08-14 05:11:45
【问题描述】:
我注意到r2_score 和explained_variance_score 都是用于回归问题的内置sklearn.metrics 方法。
我一直认为r2_score 是模型解释的百分比方差。和explained_variance_score有什么区别?
你什么时候会选择一个而不是另一个?
谢谢!
【问题讨论】:
标签: python scikit-learn regression
我注意到r2_score 和explained_variance_score 都是用于回归问题的内置sklearn.metrics 方法。
我一直认为r2_score 是模型解释的百分比方差。和explained_variance_score有什么区别?
你什么时候会选择一个而不是另一个?
谢谢!
【问题讨论】:
标签: python scikit-learn regression
我找到的大多数答案(包括此处)都强调R2 和Explained Variance Score 之间的区别,即:平均残差(即误差均值)。
但是,还有一个重要的问题,那就是:为什么我需要考虑误差的平均值?
复习:
R2:是确定系数,它衡量由(最小二乘)线性回归解释的变化量。
为了评估y的预测值,您可以从不同的角度查看它,如下所示:
方差actual_y × R2actual_y = 方差predicted_y
所以直观地说,R2 越接近1,actual_y 和 predict_y 的方差就越相同(即相同的价差)
如前所述,主要区别在于平均误差;如果我们查看公式,我们会发现这是真的:
R2 = 1 - [(Sum of Squared Residuals / n) / Variancey_actual]
Explained Variance Score = 1 - [Variance(Ypredicted - Yactual) / Variancey_actual]
其中:
Variance(Y<sub>predicted</sub> - Y<sub>actual</sub>) = (Sum of Squared Residuals - <b>Mean Error</b>) / n
所以,显然唯一的区别是我们从第一个公式中减去了平均误差! ... 但是为什么?
当我们将 R2 得分 与 解释方差得分 进行比较时,我们基本上是在检查 平均误差;因此,如果 R2 = 解释方差分数,则意味着:平均误差 = 零!
平均误差反映了我们估计量的趋势,即:Biased v.s Unbiased Estimation。
如果您希望获得无偏估计量,以使我们的模型不会低估或高估,您可以考虑考虑 平均误差。
【讨论】:
Variance(Ypredicted - Yactual) = (Sum of Squared Residuals - Mean Error) / n 是正确的。应该是sum((Ypredicted - Yestimated - Mean Error)**2) / N。查看源代码:github.com/scikit-learn/scikit-learn/blob/…
好的,看这个例子:
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?
【讨论】:
metrics.r2_score(y_true, y_pred)不等于metrics.r2_score(y_pred, y_true)
np.var 代替np.cov。让我有点困惑。您实际上并不是在计算协方差,而是在计算方差。也取标准差然后平方仅仅意味着取方差:4*np.array(y_true).std()**2 = 4*np.var(y_true) = 29.1875