在统计学中,R2系数又称决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。比如:R2_score=0.8,则表示回归关系可以解释因变量80%的变异,即如果控制自变量不变,则因变量的变异程度会减少80%。对变量进行线性回归分析时,采用最小二乘法进行参数估计时,R2_score越接近于1,回归拟合效果越好,一般认为超过80%的模型拟合度比较高。
R2系数计算
用 y i y_i yi表示真实的观测值, y ˉ \bar y yˉ表示真实观测值的平均值, y ^ i \hat y_i y^i表示预测值
- 回归平方和
S S R = ∑ i = 1 n ( y ^ i − y ˉ i ) 2 SSR = \sum_{i=1}^{n}(\hat y_i - \bar y_i)^2 SSR=i=1∑n(y^i−yˉi)2
估计值与平均值的误差,反映自变量与因变量之间的相关程度的偏差平方和 - 残差平方和
S S E = ∑ i = 1 n ( y i − y ^ i ) 2 SSE = \sum_{i=1}^{n}(y_i - \hat y_i)^2 SSE=i=1∑n(yi−y^i)2
估计值与真实值的误差,反映模型拟合的程度 - 总离差平方和
S S T = S S R + S S E = ∑ i = 1 n ( y i − y ˉ ) 2 SST = SSR + SSE = \sum_{i=1}^{n}(y_i - \bar y)^2 SST=SSR+SSE=i=1∑n(yi−yˉ)2
平均值与真实值的误差,反映真实值与数学期望的偏离程度 - R2_score计算公式
R 2 = 1 − S S E S S T R^2 = 1 - \frac {SSE}{SST} R2=1−SSTSSE
即:
R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i-\hat y_i)^2}{\sum_{i=1}^{n}(y_i-\bar y)^2} R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
进一步化简:
R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 / n ∑ i = 1 n ( y i − y ˉ ) 2 / n = 1 − M S E V a r R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i-\hat y_i)^2/n}{\sum_{i=1}^{n}(y_i-\bar y)^2/n} = 1 - \frac {MSE}{Var} R2=1−∑i=1n(yi−yˉ)2/n∑i=1n(yi−y^i)2/n=1−VarMSE
MSE表示均方误差,Var表示方差。 R 2 R^2 R2可以通俗地理解为使用均值作为误差基准,观察预测误差是否大于或者小于均值基准误差。 - R2_score = 1, 样本中预测值和真实值完全相等。没有任何误差,表示回归分析中自变量对因变量的解释性好;
- R2_score = 0, 此时样本每一项预测值均等于均值。
利用sklearn.metrics求解r2_score
import numpy as np
import sklearn.linear_model as lm
import sklearn.metrics as sm # 模型性能评价模块
train_x = np.array([[0.5], [0.6], [0.8], [1.1], [1.4]])
train_y = np.array([5.0, 5.5, 6.0, 6.8, 7.0])
# 创建线性回归器
model = lm.LinearRegression()
# 训练线性回归器
model.fit(train_x, train_y)
# 根据模型预测输出
pred_y = model.predict(train_x)
print('coef_:', model.coef_) # 系数
print('intercept_:', model.intercept_) # 截距
print('R2_score:', sm.r2_score(train_y, pred_y)) # r2_score
"""
coef_: [2.2189781]
intercept_: 4.107299270072993
R2_score: 0.93951161986865
"""