注:本文是回归分析专题的第三部分,此专题是对即将于2021年5月出版的《机器学习数学基础》的补充和提升资料。
并且,只要插入的公式多点,在微信的编辑器中就不能保存。所以,发布的文章中,就很少有公式了。这就失去了数学味道,如果要看完整的,请移步到网站:https://qiwsir.gitee.io/mathmetics/
用程序实现参数估计
如果使用最小二乘法实现一元线性回归系数估计,即(10)式的结果,可以使用statsmodels
中提供OLS
,即“普通最小二乘法(Ordinary Least Squares)”。
使用的数据就是前面绘制散点图使用的alpha0
和beta
。现在稍微透露一下这两组数据的含义,这两组输入来自于光的折射实验(虚拟的),其中alpha0
表示入射角(角度为单位),beta
表示折射角(弧度为单位),为了单位统一,将alpha0
的角度转化为弧度。
alpha = alpha0*np.pi/180
不过,上面的操作不用真正实现。因为已经透露了天机,那么就应该将上述两组实验数据产生方法展示出来(但是,我们还要假装不知道样本之间的关系):
代码语言:javascript复制import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
alpha = np.arange(2,90)*np.pi/180 np.random.rand()/10
beta = np.arcsin(np.sin(alpha)/1.4)
fig, ax = plt.subplots()
ax.scatter(alpha, beta)
输出图像:
然后用上述数据,利用statsmodels
中的·.OLS`得到一元线性回归模型。
import statsmodels.api as sm
X = pd.DataFrame({'c': np.ones(len(alpha)), 'x': alpha})
model = sm.OLS(beta, X)
r = model.fit()
r.params
# 输出
c 0.068711
x 0.534783
dtype: float64
现在所得到的两个输出值,一个是偏置
,另外一个是
,即所得到的的一元线性回归方程是:
代码语言:javascript复制coe = r.params
fig, ax = plt.subplots()
ax.scatter(alpha, beta)
x = np.linspace(0, alpha[-1], 100)
y = coe['c'] coe['x']*x
ax.plot(x,y, color='red')
x_mean = np.mean(alpha)
y_mean = np.mean(beta)
ax.scatter(x_mean, y_mean, marker="D", color='black')
输出图像:
图中的黑色菱形点,对应着(9)式所说明的意义。
从对图示的观察可知,如果用现在所得到的一元线性回归模型作为机器学习模型,对于数据(alpha, beta)
而言,并不是一个好模型。
除了估计回归系数之外,在严格的统计学中,还要估计
,并进行相关的假设检验,并给出置信区间。这些内容通常依据上述定理中各参数分布特点解决。
拟合二次曲线
像上面图示显示,所得到的模型与原数据集的分布差别较大,称为“欠拟合”。这说明我们选择的模型有问题。观察散点图,可能会想到,应该使用:
对于这种模型,其图像不是直线,但依然可以使用最小二乘法实现拟合。
代码语言:javascript复制X2 = pd.DataFrame({'c': np.ones(len(alpha)), 'x': alpha, 'x*x':alpha*alpha})
r2 = sm.OLS(beta, X2).fit()
r2.params
# 输出
c -0.025320
x 0.877092
x*x -0.214953
dtype: float64
得到系数之后,看一看结果如何:
代码语言:javascript复制coe = r2.params
fig, ax = plt.subplots()
ax.scatter(alpha, beta)
x = np.linspace(0, alpha[-1], 100)
y = coe['c'] coe['x']*x coe['x*x']*x*x
ax.plot(x,y, color='red')
输出图像:
观察发现,现在的模型与原数据集的分布,拟合得很好,除了在右上角偏差似乎大点——天空中的一小朵乌云。
然而,直觉观察不能代替严谨的评估。
对于前面训练所得到的r
和r2
两个模型,statsmodels
中为它们提供的方法,查看有关评估结果。
r.summary()
输出:
代码语言:javascript复制r2.summary()
输出:
上面输出结果,就是对模型的统计评估结果。各项的含义分别是
:
Element | Description |
---|---|
Dep. Variable | 模型中的响应变量 |
Model | 用于训练的模型名称 |
Method | 模型的参数用什么方法计算 |
No. Observations | 观测数据的数量,即样本数量 |
DF Residuals | 残差的自由度 |
DF Model | 模型中参数的个数(不含常数项) |
R-squared | 判定系数,也称为“拟合度”。回归结果逼近真实值的统计量,范围在 之间,越大表示模型拟合得越好 |
Adj. R-squared | 根据观察次数和残差的自由度调整以上值 |
F-statistic | 模型训练有效度。模型的均方误差除以残差的均方误差 |
Prob (F-statistic) | 零假设下,得到上述统计量的概率 |
Log-likelihood | 似然函数对数 |
AIC | 赤池信息准则(Akaike Information Criterion,简称:AIC) 。根据观察次数和模型的复杂性调整对数似然度。 |
BIC | 贝叶斯信息准则(Bayesian Information Criterion),类似AIC,但是如果模型参数更多,会提高惩罚项权重。 |
coef | 回归系数估计值 |
std err | 回归系数估计值的标准误差 |
t | t检验值。度量统计学上重要程度的量。 |
P > t | P值。零假设是回归系数为0,通常小于0.05,拒绝零假设,即自变量和相应变量之间存在统计上的显著相关。 |
[95.0% Conf. Interval] | 95%置信区间的上下限。 |
Skew | 偏度。以均值为中心的数据对称性的度量。正态分布的误差应围绕均值对称分布。 |
Kurtosis | 峰度。分布形状的度量。比较接近均值的数据量和远离均值的数据量(尾部)。 |
Omnibus | D’Angostino检验。它提供了偏度和峰度的组合统计检验。 |
Prob(Omnibus) | 将上面结果转换为概率 |
Jarque-Bera | 对偏度和峰度的另外一种检验。 |
Prob (JB) | 上面统计量结果转换为概率 |
Durbin-Watson | 自相关检验。在时间序列分析中通常很重要 |
Cond. No | 多重共线性检验(如果与多个参数拟合,则参数彼此相关) |
如此,即可实现统计中的线性回归模型构建。
从上面的评估结果中可以看到,目前用二次曲线拟合,已经能够在相当好的程度上体现了两个变量之间的关系——特别强调,现在我们得到的是相关关系。
那么,相关关系是否就是因果关系?尚需进一步研究。
(待续)