9. 回归模型评价与检验#

9.1. 介绍#

目前为止,我们已经掌握了回归分析与预测的相关方法,并了解了多种模型评价的标准。不过,对于回归分析的结果,往往还需要经历一个流程,那就是:假设检验,而这个过程就会运用到数理统计学的相关知识。

9.2. 知识点#

  • 拟合优度检验

  • 变量显著性检验

对于回归预测结果,通常会有平均绝对误差(MAE),均方误差(MSE),平均绝对百分比误差(MAPE)等 3 个指标进行评价。其中,MAE 和 MSE 在线性回归和多项式回归的实验中已经有所介绍,下面重新回顾并补充 MAPE 的计算公式。

平均绝对误差(MAE)就是绝对误差的平均值,它的计算公式如下:

\[ \operatorname{MAE}(y, \hat{y})=\frac{1}{n} \sum_{i=1}^{n}\left|y_{i}-\hat{y}_{i}\right| \tag{1} \]

均方误差(MSE)表示误差的平方的期望值,它的计算公式如下:

\[ \textrm{MSE}(y, \hat{y} ) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_{i})^{2} \tag{2} \]

平均绝对百分比误差(MAPE)。MAPE 是 MAD 的变形,它是一个百分比值,因此比其他统计量更容易理解。例如,如果 MAPE 为 \(5\),则表示预测结果较真实结果平均偏离 \(5%\)。MAPE 的计算公式如下:

\[ \textrm{MAPE}(y, \hat{y} ) = \frac{\sum_{i=1}^{n}{|\frac{y_{i}-\hat y_{i}}{y_{i}}|}}{n} \times 100 \tag{3} \]

对于以上 3 个公式,\(y_{i}\) 表示真实值,\(\hat y_{i}\) 表示预测值,\(n\) 则表示值的个数。3 个评估值越小,说明预测模型拥有更好的精确度。

其中,scikit-learn 提供了 MAE 和 MSE 计算方法如下:

sklearn.metrics.mean_absolute_error(y_true, y_pred)  # MAE 计算
sklearn.metrics.mean_squared_error(y_true, y_pred)  # MSE 计算

而关于 MAPE 的计算方法,虽然 scikit-learn 未直接提供,但我们已经学会了如何用公式实现。

上面的三个公式,实际上往往仅能用于评价模型的相对优劣,比如多项式回归比线性回归应用于同一组数据结果更好。但如果我们要评价某模型是否真能够很好地解释样本数据,就需要通过一系列的 假设检验 手段来完成了。

9.3. 拟合优度检验#

当我们使用回归分析拟合数据时,实际上是通过样本所估计的参数来代替了总体的真实参数。尽管从统计性质上可知,当进行足够多的重复抽样操作后,参数估计值的期望就等于其总体的真实参数。但实际上,单次抽样过程中,参数的估计值和真实值可能存在差异。

那么,单次抽样后,参数的估计值与真实值差异是否显著,就需要进行统计检验。实际上,在一元线性回归模型中,一般需要:拟合优度检验、变量的显著性检验及参数的区间估计。在多元线性回归模型中,往往会有:拟合优度检验、变量的显著性检验(T 检验)、方程的显著性检验(F 检验)及参数的置信区间。其中,一元线性回归中的 T 检验和 F 检验一致。

一元线性回归的拟合优度检验,指的是对样本回归拟合直线与样本观测值之间拟合程度进行检验。我们一般会使用判定系数 \(R^2\) 作为度量拟合优度的指标。

假设,我们有一组样本观测值 \((x_i,y_i)\) ,其得到线性回归拟合直线为:

\[ \hat{y}_{i}=w x_{i}+b \tag{4} \]

此时,如果样本观测值的均值(观测均值)为:\({\displaystyle{\bar{y}}={\frac{1}{n}}\sum_{i=1}^{n}y_{i}}\),我们定义第\(i\)个观测值与样本均值之间的「离差」为:\(Y_{i}=y_{i}-\overline{y}\)

「离差」进而可以分解为:

\[ Y_{i}=y_{i}-\overline{y}=\left(y_{i}-\hat{y}_{i}\right)+\left(\hat{y}_{i}-\overline{y}\right)=e_{i}+\hat{Y}_{i} \tag{5} \]

其中,\(\hat{Y}_{i}=\left(\hat{y}_{i}-\overline{y}\right)\) 是样本回归拟合值与观测均值之差。我们可以认为这是由回归直线解释的部分。

而,\(e_{i}=\left(y_{i}-\hat{y}_{i}\right)\) 是实际观测值与样本回归拟合值之差,也就是「残差」。当 \(y_{i}=\hat{y}_{i}\) 时,即实际观测值正好落在样本回归拟合直线上,这是最佳拟合状态。可认为,「离差」全部来自回归线,而与「残差」无关。我们可以认为这是由回归直线不能解释的部分。

image

那么,我们就记作:

\[ TSS=\sum_{i=1}^{n} Y_{i}^{2}=\sum_{i=1}^{n}\left(y_{i}-\overline{y}\right)^{2} \tag{6} \]
\[ E S S=\sum_{i=1}^{n} \hat{Y}_{i}^{2}=\sum_{i=1}^{n}\left(\hat{y}_{i}-\overline{y}\right)^{2} \tag{7} \]
\[ RSS=\sum_{i=1}^{n} e_{i}^{2}=\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2} \tag{8} \]

我们可以继续推导上述三者之间得关系。其中:

\[ TSS=\sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2} = \sum_{i=1}^{n}\left(\left(y_{i} - \hat{y}_{i}\right) + \left(\hat{y}_{i} -\bar{y}\right)\right)^{2} \]
\[ =\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}+\sum_{i=1}^{n}\left(\hat{y}_{i}-\bar{y}\right)^{2}+2 \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)\left(\hat{y}_{i}-\bar{y}\right) \tag{9} \]

对于线性回归模型 \(y_i=w x_{i}+b\),当使用最小二乘法估计参数时:

\[ Q\left(b, w\right)=\min _{b, w} Q\left(b, w\right)=\sum_{i=1}^{n}\left(y_{i}-b-w x_{i}\right)^{2} \tag{10} \]

那么,公式 \((10)\) 存在极小值的必要条件为:

\[ \frac{\partial Q}{\partial b}=-2 \sum_{i=1}^{n}\left(y_{i}-b-w x_{i}\right)=0 \tag{11} \]
\[ \frac{\partial Q}{\partial w}=-2 \sum_{i=1}^{n} x_{i} \left(y_{i}-b-w x_{i}\right)=0 \tag{12} \]

现在重新回到公式 \((9)\) 的第三项,我们省去常数系数继续推导。由于:

\[ \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)\left(\hat{y}_{i}-\bar{y}\right)=\sum_{i=1}^{n}\left(y_{i}-b-w x_{i}\right)\left(b+w x_{i}-\bar{y}\right) \]
\[ =b\sum_{i=1}^{n}\left(y_{i}-b-w x_{i}\right) + w\sum_{i=1}^{n}x_{i}\left(y_{i}-b-w x_{i}\right)-\bar{y}\sum_{i=1}^{n}\left(y_{i}-b-w x_{i}\right) \tag{13} \]

公式 \((13)\) 中,第一项和第三项根据公式 \((11)\) 可知为 0,第二项根据公式 \((12)\) 可知为 0。所以,公式 \((13)\) 同样为 0。

因此,公式 \((9)\) 可以写作:

\[ \sum_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}=\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}+\sum_{i=1}^{n}\left(\hat{y}_{i}-\bar{y}\right)^{2} \tag{14} \]

即证得:

\[ TSS=ESS+RSS \tag{15} \]

其中,TSS 被称之为总体平方和 Total Sum of Squares,ESS 被称之为回归平方和 Explained Sum of Squares,而 RSS 则是残差平方和 Residual Sum of Squares。于是,对于 \(y\) 的观测值围绕其均值的总离差可分解为两部分:一部分来自回归拟合线 ESS,另一部分则来自随机势力 RSS。

在给定样本中,TSS 不变,如果实际观测点离样本回归拟合线越近,则 ESS 在 TSS 中占的比重越大。因此,我们定义拟合优度等于回归平方和 ESS 与 \(y\) 的总离差 TSS 的比值。

\[ R^{2}=\frac{ESS}{TSS}=1-\frac{RSS}{TSS} \tag{16} \]

简而言之,当 RSS 越小时,\(R^{2}\) 就越趋近于 1,那么代表模型的解释力越强。反之,模型的解释力就越弱。

所以,一般情况下,\(R^{2}\) 的有效取值范围在 \([0, 1]\) 之间。值越大,就代表模型的拟合优度越好。

接下来,我们通过一个例子,来计算线性回归的模型拟合优度。

import numpy as np

# 生成 2 组 x 相同的示例数据
x = np.array([4, 8, 12, 25, 32, 43, 58, 63, 69, 79]).reshape(-1, 1)
y1 = np.array([9, 17, 23, 51, 62, 83, 115, 125, 137, 159]).reshape(-1, 1)
y2 = np.array([20, 33, 50, 56, 42, 31, 33, 46, 65, 75]).reshape(-1, 1)
from matplotlib import pyplot as plt

%matplotlib inline

# 两组数据分别绘制子图
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(x, y1)
axes[1].scatter(x, y2)
<matplotlib.collections.PathCollection at 0x115e14310>
../_images/66d902983c0c897fd83116d509ff9e7dadd4f9b8642999af5d12fa6f172b6ca3.png
from sklearn.linear_model import LinearRegression

model1 = LinearRegression()  # 线性模型 1
model1.fit(x, y1)

model2 = LinearRegression()  # 线性模型 2
model2.fit(x, y2)
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
# 绘制拟合直线到原散点图中
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 模型 1
axes[0].scatter(x, y1)
axes[0].plot(
    [0, 90], [model1.intercept_, model1.coef_[0] * 90 + model1.intercept_], "r"
)
# 模型 2
axes[1].scatter(x, y2)
axes[1].plot(
    [0, 90], [model2.intercept_, model2.coef_[0] * 90 + model2.intercept_], "r"
)
[<matplotlib.lines.Line2D at 0x16c1c7c70>]
../_images/06d71ff55f7388d48968d1d9dde419f2b1593627f00ea337410d26123e9082aa.png

接下来,我们可以使用 scikit-learn 提供的 \(R^{2}\) 计算方法计算两个模型对应的 \(R^{2}\) 结果。

from sklearn.metrics import r2_score

# 分别传入真实观测值和模型预测值
r2_score(y1, model1.predict(x)), r2_score(y2, model2.predict(x))
(0.9993315719475073, 0.3740615194558855)

我们可以使用上面的公式计算方法验证 scikit-learn 计算结果。

# 使用公式计算方法验证 model1 计算结果
rss = np.sum(pow((y1 - model1.predict(x)), 2))
tss = np.sum(pow((y1 - np.mean(y1)), 2))
1 - rss / tss
0.9993315719475073

可以看到,模型 1 的 \(R^{2}\) 结果趋近于 1,而模型 2 的 \(R^{2}\) 的值则小很多。这代表线性回归模型对第一组数据的解释力较强,而对第二组数据解释力不足。实际上,通过肉眼也可以发现,第二组数据其实更适合于多项式回归模型,而非线性回归模型。这也印证了 \(R^{2}\) 值的结果。

所以说,虽然采用普通最小二乘估计方法已经能保证模型拟合结果最优,但是依然需要通过「拟合优度检验」来判断该模型是不是能很好地解释数据分布。

这里需要说明的一点,虽然上面说到 \(R^{2}\) 的有效取值范围在 \([0, 1]\) 之间。但 scikit-learn 提供的 API 有可能计算出 \(R^{2}\) 值为负数的情况。例如下面我们人为设定一条拟合线与样本趋势正好相反,所计算得到的 \(R^{2}\) 则为负数。这种情况下,\(TSS=ESS+RSS\) 的公式也将失去意义。

plt.scatter(x, y1)
plt.plot([0, 90], [200, -2 * 90 + 200], "r")  # 线性函数为:y = -2x + 200
plt.title("r2_score: {}".format(r2_score(y1, -2 * x + 200)))
Text(0.5, 1.0, 'r2_score: -3.7404627174607548')
../_images/db430f520131ff2a0a2ef0482397249e80809d1560e3f26bc0791c34fbb1cd26.png

那么,你可能会想知道 \(R^{2}\) 取值为多少时,我们认为模型通过了拟合优度检验。实际上,这里并没有确定的数值区间,不同问题会有不同的标准,你可以阅读关于 \(R^{2}\) 数值的一些 讨论

9.4. 变量显著性检验#

变量显著性检验是回归分析中判断解释变量 \(x\) 是否是被解释变量 \(y\) 的一个显著性的影响因素,其将应用到数理统计学中的假设检验知识。假设检验的原理就是,通过事先对总体参数或总体分布形式作出假设。然后,利用样本信息来判断原假设是否合理。也就是说,通过判断样本信息与原假设是否有显著差异,从而决定是否接受或否定原假设。

由于涉及到大量的数理统计知识,这里不再对假设检验相关原理进行讨论。具体可以 参考相关材料

下面,我们就直接来看如何使用 Python 完成变量显著性检验,并说明参数代表的含义。这里,我们不再使用 scikit-learn 提供的线性回归算法建模,而是使用数理统计常用库 statsmodels 完成。

首先,使用上文第二组数据重新建立普通最小二乘法线性回归模型。

import statsmodels.api as sm

x = sm.add_constant(x)  # 添加截距项系数 1
model = sm.OLS(endog=y2, exog=x)  # 普通最小二乘法, endog 因变量, exog 自变量
results = model.fit()
results.params  # 输出拟合后系数
array([30.12973186,  0.38092285])
x
array([[ 1.,  4.],
       [ 1.,  8.],
       [ 1., 12.],
       [ 1., 25.],
       [ 1., 32.],
       [ 1., 43.],
       [ 1., 58.],
       [ 1., 63.],
       [ 1., 69.],
       [ 1., 79.]])

接下来,我们直接可以输出模型的摘要信息,这也是 statsmodels 的一大特色。

import warnings

warnings.filterwarnings("ignore")

results.summary2(alpha=0.05)  # 输出模型摘要, 95% 置信度
Model: OLS Adj. R-squared: 0.296
Dependent Variable: y AIC: 83.1646
Date: 2023-11-09 14:47 BIC: 83.7698
No. Observations: 10 Log-Likelihood: -39.582
Df Model: 1 F-statistic: 4.781
Df Residuals: 8 Prob (F-statistic): 0.0602
R-squared: 0.374 Scale: 200.68
Coef. Std.Err. t P>|t| [0.025 0.975]
const 30.1297 8.1820 3.6824 0.0062 11.2620 48.9975
x1 0.3809 0.1742 2.1865 0.0602 -0.0208 0.7827
Omnibus: 2.455 Durbin-Watson: 0.832
Prob(Omnibus): 0.293 Jarque-Bera (JB): 0.895
Skew: -0.056 Prob(JB): 0.639
Kurtosis: 1.538 Condition No.: 86

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

重点查看第二个表格,依次得到了拟合系数,标准误差,t 值,p 值,以及置信区间。

-

Coef.

Std.Err.

t

P>abs(t)

[0.025]

[0.975]

const

30.1297

8.1820

3.6824

0.0062

11.2620

48.9975

x1

0.3809

0.1742

2.1865

0.0602

-0.0208

0.7827

其中,我们要查看的就是 P 值,如果 P 值很小,那么说明该变量通过显著性检验,需要保留在模型中。实际上,当我们做多元回归建模时,就可以通过查看 P 值,把不显著的变量剔除。

实际上,上面的表格中同时给出了参数检验的置信区间估计。最后两列表示,截距项和自变量系数在 97.5% 的置信度下,置信区间分别为 \((11.2620, 48.9975)\)\((-0.0208, 0.7827)\)

由于置信区间反映了样本参数估计值与总体参数真值的接近程度,因此置信区间越小越好。通常,我们可以通过增大样本容量以及提供模型拟合优度来缩小置信区间。

9.5. 总结#

本次实验中,我们复习了前面使用过的回归模型评价指标。但这些指标往往仅能用于模型直接的对比,如果要进一步评价模型的表现就需要对模型进行检验。所以,实验学习了回归模型拟合优度检验和变量显著性检验两类方法。希望大家能对二者有一定的认识,学有余力的同学可以通过文中给出的相关资料,充分了解数理统计学中的相关假设检验原理和方法。

相关链接