在统计学中,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
"""