先来看一组代码:
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