【问题标题】:Python sci-kit learn (metrics): difference between r2_score and explained_variance_score?Python sci-kit 学习(指标):r2_score 和 explain_variance_score 之间的区别?
【发布时间】:2014-08-14 05:11:45
【问题描述】:

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

我一直认为r2_score 是模型解释的百分比方差。和explained_variance_score有什么区别?

你什么时候会选择一个而不是另一个?

谢谢!

【问题讨论】:

    标签: python scikit-learn regression


    【解决方案1】:

    我找到的大多数答案(包括此处)都强调R2Explained 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


    总结:

    如果您希望获得无偏估计量,以使我们的模型不会低估或高估,您可以考虑考虑 平均误差

    【讨论】:

    • 所以你推荐使用 explain_variance 分数而不是 r2 分数?
    • 不是吗:解释方差分数的 V(Yactual - Ypredicted)
    • @msarafzadeh 看看一般方差公式,你会发现这两种方法都没有关系。
    • @msarafzadeh 是 Var(X+Z) = Var(X)+Var(Z) 以及 Var(aZ) = a^2 * Var(Z),其中 'a' 是一个常数那么 Var(Y-Yp)=Var(-1(Yp-Y))=(-1)^2 * Var(Yp-Y) = Var(Yp-Y)。
    • 我不认为Variance(Ypredicted - Yactual) = (Sum of Squared Residuals - Mean Error) / n 是正确的。应该是sum((Ypredicted - Yestimated - Mean Error)**2) / N。查看源代码:github.com/scikit-learn/scikit-learn/blob/…
    【解决方案2】:

    好的,看这个例子:

    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
    猜你喜欢
    • 2014-07-16
    • 2013-05-23
    • 2020-10-15
    • 2017-02-05
    • 1970-01-01
    • 2017-04-20
    • 2013-10-13
    • 2020-07-17
    • 2015-02-14
    相关资源
    最近更新 更多