天天看点

回归类的模型评估指标R2

先来看一组代码:

import numpy as np
rng = np.random.RandomState(42)
X = rng.randn(100, 80)
y = rng.randn(100)
cross_val_score(LR(), X, y, cv=5, scoring='r2')
           

运行结果

array([-179.12952605,   -5.692624  ,  -15.61747513,  -78.68042858,
        -59.5311006 ])
           

sklearn真的是设置了太多障碍,均方误差是负的,R2也是负的,这个名字里都带平方了,居然是负的,无论如何,再来看看的计算公式:

R 2 = 1 − ∑ i = 0 m ( y i − y ^ i ) 2 ∑ i = 0 m ( y i − y ˉ i ) 2 = 1 − R S S ∑ i = 0 m ( y i − y ˉ i ) 2 R^2=1-\large{\frac{\sum_{i=0}^m(y_i-\hat{y}_i)^2}{\sum_{i=0}^m(y_i-\bar{y}_i)^2}}\small=1-\large{\frac{RSS}{\sum_{i=0}^m(y_i-\bar{y}_i)^2}} R2=1−∑i=0m​(yi​−yˉ​i​)2∑i=0m​(yi​−y^​i​)2​=1−∑i=0m​(yi​−yˉ​i​)2RSS​

第一次学习机器器学习或者统计学的,可能会感觉没什么问题了, 是1减一个数,后面的部分只要大于1的话完全可以小于0。但是学过机器器学习,尤其是在统计学上有基础的可能会坐不住了:这不对啊!

一直以来,众多的机器学习教材中都有这样的解读:除了RSS之外,还有平方和ESS(Explained Sum of Squares,也叫做SSR回归平方和)以及总离差平方和TSS(Total Sum of Squares,也叫做SST总离差平方和)。

平方和ESS定义了预测值和样本均值之间的差异,而总离差平方和定义了真实值和样本均值之间的差异(就是R2中的分母),两个指标分别写作:

T S S = ∑ i = 0 m ( y i − y ˉ i ) 2 TSS=\sum_{i=0}^m(y_i-\bar{y}_i)^2 TSS=i=0∑m​(yi​−yˉ​i​)2

E S S = ∑ i = 0 m ( y ^ i − y ˉ i ) 2 ESS=\sum_{i=0}^m(\hat{y}_i-\bar{y}_i)^2 ESS=i=0∑m​(y^​i​−yˉ​i​)2

而公式:

T S S = R S S + E S S TSS=RSS+ESS TSS=RSS+ESS

看R2的公式,如果带入TSS和ESS,就有:

R 2 = 1 − R S S T S S = T S S − R S S T S S = E S S T S S R^2=1-\frac{RSS}{TSS}=\frac{TSS-RSS}{TSS}=\frac{ESS}{TSS} R2=1−TSSRSS​=TSSTSS−RSS​=TSSESS​

而ESS和TSS都带平方,所以必然都是正数,R^2怎么可能是负的呢?

因为,公式TSS = RSS + ESS不是永远成立,如何证明:

T S S = ∑ i = 0 m ( y i − y ˉ i ) 2 = ∑ i = 0 m ( y i − y ^ i + y ^ i − y ˉ i ) 2 = ∑ i = 0 m ( y i − y ^ i ) 2 + ∑ i = 0 m ( y ^ i − y ˉ i ) 2 + 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) = R S S + E S S + 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) TSS=\sum_{i=0}^m(y_i-\bar{y}_i)^2 \\ =\sum_{i=0}^m(y_i-\hat{y}_i+\hat{y}_i-\bar{y}_i)^2 \\ =\sum_{i=0}^m(y_i-\hat{y}_i)^2+\sum_{i=0}^m(\hat{y}_i-\bar{y}_i)^2+2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i)\\ =RSS+ESS+2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i) TSS=i=0∑m​(yi​−yˉ​i​)2=i=0∑m​(yi​−y^​i​+y^​i​−yˉ​i​)2=i=0∑m​(yi​−y^​i​)2+i=0∑m​(y^​i​−yˉ​i​)2+2i=0∑m​(yi​−y^​i​)(y^​i​−yˉ​i​)=RSS+ESS+2i=0∑m​(yi​−y^​i​)(y^​i​−yˉ​i​)

两边同时除以TSS,则有:

1 = R S S T S S + E S S T S S + 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) T S S 1=\frac{RSS}{TSS}+\frac{ESS}{TSS}+\frac{2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i)}{TSS} 1=TSSRSS​+TSSESS​+TSS2∑i=0m​(yi​−y^​i​)(y^​i​−yˉ​i​)​

1 − R S S T S S = E S S + 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) T S S 1-\frac{RSS}{TSS}=\frac{ESS+2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i)}{TSS} 1−TSSRSS​=TSSESS+2∑i=0m​(yi​−y^​i​)(y^​i​−yˉ​i​)​

R 2 = E S S + 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) T S S R^2=\frac{ESS+2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i)}{TSS} R2=TSSESS+2∑i=0m​(yi​−y^​i​)(y^​i​−yˉ​i​)​

许多教材和博客中让 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) 2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i) 2∑i=0m​(yi​−y^​i​)(y^​i​−yˉ​i​)这个式子为0,公式TSS=RSS+ESS自然就成立了,但要让这个式子成立是有条件的。现在有了这个式子的存在, R2就可以是一个负数了。只要 ( y i − y ^ i ) (y_i-\hat{y}_i) (yi​−y^​i​)衡量的是真实值到预测值的距离,而 ( y ^ i − y ˉ i ) (\hat{y}_i-\bar{y}_i) (y^​i​−yˉ​i​)衡量的是预测值到均值的距离,只要这两部分的符号不同,式子 2 ∑ i = 0 m ( y i − y ^ i ) ( y ^ i − y ˉ i ) 2\sum_{i=0}^m(y_i-\hat{y}_i)(\hat{y}_i-\bar{y}_i) 2∑i=0m​(yi​−y^​i​)(y^​i​−yˉ​i​)就有可能为负,而R^2也就有可能为负。

看下面这张图,蓝色的横线是均值线 y ˉ \bar{y} yˉ​,橙色的线是模型 y ^ \hat{y} y^​,蓝色的点是样本点。对于 x i x_i xi​,真实标签减预测值的值 ( y i − y ^ i ) (y_i-\hat{y}_i) (yi​−y^​i​)为正,但我们的预测值减均值的值 ( y ^ i − y ˉ i ) (\hat{y}_i-\bar{y}_i) (y^​i​−yˉ​i​)却是一个负数。

这说明,数据本身的均值,比数据的拟合模型本身更接近数据的真实值,模型就是废的,完全没有作用,类似于分类模型中的分类准确率为50%,不如瞎猜。

就是说,当R2的显示为负,证明模型对数据的拟合非常糟糕,模型完全不能使用。所有,一个负的R2是合理的。当然,现实应用中,如果发现线性回归模型出现负的R2,不代表就要接受:首先,检查建模过程和数据处理过程是否正确,也许原始数据处理不当,也许建模过程存在bug。如果是集成模型的回归,检查弱评估器的数量是否不足,随机森林、提升树这些模型在只有两三棵树的时候很容易出现负的R2。如果检查了所有的代码,也确定了预处理没有问题,但R2还是负的,说明线性回归模型不适合此数据,需要尝试其他算法。

继续阅读