机器学习:回归模型评价与检验
介绍
目前为止,我们已经掌握了回归分析与预测的相关方法,并了解了多种模型评价的标准。不过,对于回归分析的结果,往往还需要经历一个流程,那就是:假设检验,而这个过程就会运用到数理统计学的相关知识。
知识点
- 拟合优度检验
- 变量显著性检验
对于回归预测结果,通常会有平均绝对误差(MAE),均方误差(MSE),平均绝对百分比误差(MAPE)等 3 个指标进行评价。其中,MAE 和 MSE 在线性回归和多项式回归的文章中已经有所介绍,下面重新回顾并补充 MAPE 的计算公式。
平均绝对误差(MAE)就是绝对误差的平均值,它的计算公式如下:
均方误差(MSE)表示误差的平方的期望值,它的计算公式如下:
平均绝对百分比误差(MAPE)。MAPE 是 MAD 的变形,它是一个百分比值,因此比其他统计量更容易理解。例如,如果 MAPE 为 $5$,则表示预测结果较真实结果平均偏离 $5%$。MAPE 的计算公式如下:
对于以上 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)$ ,其得到线性回归拟合直线为:
此时,如果样本观测值的均值(观测均值)为:${\displaystyle{\bar{y}}={\frac{1}{n}}\sum_{i=1}^{n}y_{i}}$,我们定义第$i$个观测值与样本均值之间的「离差」为:$Y_{i}=y_{i}-\overline{y}$。
「离差」进而可以分解为:
其中,$\hat{Y}_{i}=\left(\hat{y}_{i}-\overline{y}\right)$ 是样本回归拟合值与观测均值之差。我们可以认为这是由回归直线解释的部分。
而,$e_{i}=\left(y_{i}-\hat{y}_{i}\right)$ 是实际观测值与样本回归拟合值之差,也就是「残差」。当 $y_{i}=\hat{y}_{i}$ 时,即实际观测值正好落在样本回归拟合直线上,这是最佳拟合状态。可认为,「离差」全部来自回归线,而与「残差」无关。我们可以认为这是由回归直线不能解释的部分。
那么,我们就记作:
我们可以继续推导上述三者之间得关系。其中:
对于线性回归模型 $y_i=w x_{i}+b$,当使用最小二乘法估计参数时:
那么,公式 $(10)$ 存在极小值的必要条件为:
现在重新回到公式 $(9)$ 的第三项,我们省去常数系数继续推导。由于:
公式 $(13)$ 中,第一项和第三项根据公式 $(11)$ 可知为 0,第二项根据公式 $(12)$ 可知为 0。所以,公式 $(13)$ 同样为 0。
因此,公式 $(9)$ 可以写作:
即证得:
其中,TSS 被称之为总体平方和 Total Sum of Squares,ESS 被称之为回归平方和 Explained Sum of Squares,而 RSS 则是残差平方和 Residual Sum of Squares。于是,对于 $y$ 的观测值围绕其均值的总离差可分解为两部分:一部分来自回归拟合线 ESS,另一部分则来自随机势力 RSS。
在给定样本中,TSS 不变,如果实际观测点离样本回归拟合线越近,则 ESS 在 TSS 中占的比重越大。因此,我们定义拟合优度等于回归平方和 ESS 与 $y$ 的总离差 TSS 的比值。
简而言之,当 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)$ 。
由于置信区间反映了样本参数估计值与总体参数真值的接近程度,因此置信区间越小越好。通常,我们可以通过增大样本容量以及提供模型拟合优度来缩小置信区间。
小结
这篇文章中,我们复习了前面使用过的回归模型评价指标。但这些指标往往仅能用于模型直接的对比,如果要进一步评价模型的表现就需要对模型进行检验。所以,实验学习了回归模型拟合优度检验和变量显著性检验两类方法。希望大家能对二者有一定的认识,学有余力的同学可以通过文中给出的相关资料,充分了解数理统计学中的相关假设检验原理和方法。
相关链接
系列文章
- 机器学习:综述及示例
- 机器学习:线性回归实现与应用
- 机器学习:多项式回归实现与应用
- 机器学习:岭回归和 LASSO 回归实现
- 机器学习:回归模型评价与检验
- 机器学习:逻辑回归实现与应用
- 机器学习:K-近邻算法实现与应用
- 机器学习:朴素贝叶斯实现及应用
- 机器学习:分类模型评价方法
- 机器学习:支持向量机实现与应用
- 机器学习:决策树实现与应用
- 机器学习:装袋和提升集成学习方法
- 机器学习:划分聚类方法实现与应用
- 机器学习:层次聚类方法实现与应用
- 机器学习:主成分分析原理及应用
- 机器学习:密度聚类方法实现与应用
- 机器学习:谱聚类及其他聚类方法应用
- 机器学习:自动化机器学习综述
- 机器学习:自动化机器学习实践应用
- 机器学习:模型动态增量训练
- 机器学习:模型推理与部署