回归模型评价与检验

4055 字 · 665 阅读 · 2023 年 05 月 05 日

本文已更新,你可以访问 AI By Doing 以获得更好的阅读体验。
本篇文章需 特别授权许可,内容版权归作者所有,未经授权,禁止转载。

介绍

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

知识点

  • 拟合优度检验
  • 变量显著性检验

对于回归预测结果,通常会有平均绝对误差(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})^{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 未直接提供,但我们已经学会了如何用公式实现。

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

拟合优度检验

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

那么,单次抽样后,参数的估计值与真实值差异是否显著,就需要进行统计检验。实际上,在一元线性回归模型中,一般需要:拟合优度检验、变量的显著性检验及参数的区间估计。在多元线性回归模型中,往往会有:拟合优度检验、变量的显著性检验(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}$ 时,即实际观测值正好落在样本回归拟合直线上,这是最佳拟合状态。可认为,「离差」全部来自回归线,而与「残差」无关。我们可以认为这是由回归直线不能解释的部分。

那么,我们就记作:

$$ 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)
from sklearn.linear_model import LinearRegression

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

model2 = LinearRegression()  # 线性模型 2
model2.fit(x, y2)
# 绘制拟合直线到原散点图中
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 模型 1
axes[0].scatter(x, y1)
axes[0].plot([0, 90], [model1.intercept_,
                       model1.coef_ * 90 + model1.intercept_], 'r')
# 模型 2
axes[1].scatter(x, y2)
axes[1].plot([0, 90], [model2.intercept_,
                       model2.coef_ * 90 + model2.intercept_], 'r')

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

from sklearn.metrics import r2_score

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

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

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

可以看到,模型 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)))

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

变量显著性检验

变量显著性检验是回归分析中判断解释变量 $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  # 输出拟合后系数
x

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

import warnings
warnings.filterwarnings('ignore')

results.summary2(alpha=0.05)  # 输出模型摘要, 95% 置信度

重点查看第二个表格,依次得到了拟合系数,标准误差,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)$ 。

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

小结

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


系列文章

本篇文章需 特别授权许可,内容版权归作者所有,未经授权,禁止转载。