这个博客我想讲三个内容,第一是R2的计算公式,第二是如何通过python计算R2。
**
第一 :R2的计算公式
**
最近一直在纠结一个问题,那就是在回归中,得到的估测结果,和实际值之间的相关性是多少?用什么值来衡量呢?
很自然的想到了R2,毕竟在各种文献中,大家看到的都是这个指标。
那么这个指标怎么计算呢,网上也是有一大堆公式,基本上都是一样的,我这里放几个给大家参考一下。
第一个:https://blog.youkuaiyun.com/grape875499765/article/details/78631435
第二个:https://blog.youkuaiyun.com/snowdroptulip/article/details/79022532
第三个:https://blog.youkuaiyun.com/theonegis/article/details/85991138
注意,在第二个的连接中,R2的计算公式(见下图),右边有两个等于号,也就是说这两个公式,都能计算出来R2,而且计算出来的值应该是一样的。
然而我通过代码,将两个公式都计算了一下,但是计算出来的值并不相同。这是我不明白的第一个问题,有清楚的小伙伴,可以帮忙解释一下吧。
**
第二:如何通过python计算R2
**
废话不多说,咱们直接上代码,这是Python版本的。第一个和第二个是按照公式写的版本,第三个是SKLearn中计算R2的版本,这三个函数计算出来的R2都是一样的值。
注意:SKLearn中的计算R2,这里有一个大坑,那就是顺序问题,这个函数中有两个参数,分别是真值和估测值,注意第一个是真值,第二个是估测值,别把顺序弄反了,不然计算出来的结果,是不对的。
```python
def calR_and_R2(y_true,y_predict):
mean_y_true=np.mean(y_true)
mean_y_predict=np.mean(y_predict)
# 计算分子
print str(len(y_true))
print str(len(y_predict))
sigmaFenZi=0
for i in range(len(y_true)):
sigmaFenZi=sigmaFenZi+np.square(y_true[i]-y_predict[i])
# 计算分母
sigmaFenMu=0
for i in range(len(y_true)):
sigmaFenMu=sigmaFenMu+np.square(y_true[i]-mean_y_true)
# 计算相关系数R2
R2=1-sigmaFenZi/sigmaFenMu
print "R2 is "+str(R2)
```python
def performance_metric2(y_true, y_predict):
"""计算并返回预测值相比于预测值的分数"""
import numpy as np
arr_true = np.array(y_true)
y_mean = np.mean(arr_true)
ssreg = 0
sstotal = 0
ssres = 0
for item in y_predict:
ssreg += (item - y_mean)**2
for item in y_true:
sstotal += (item - y_mean)**2
for index,item in enumerate(y_true):
ssres += (item - y_predict[index])**2
score = 1-(ssres/sstotal)
print "from net R2 "+str(score)
return score
```python
def performance_metric(y_true, y_predict):
from sklearn.metrics import r2_score
score = r2_score(y_true, y_predict)
print "from net R2 " + str(score)
return score
注意:好多同学都会在excel中,将实际值和估测值,通过绘制散点图,然后显示出来公式和R2,但是这里显示的R2和我们用代码计算的R2会有一点细小的差别。下面是用代码计算出来的值为:0.5356349099507338,但是在excel中的结果如下图所示。