回归分析(3)

2021-03-11 15:15:41 浏览数 (1)

注:本文是回归分析专题的第三部分,此专题是对即将于2021年5月出版的《机器学习数学基础》的补充和提升资料。

并且,只要插入的公式多点,在微信的编辑器中就不能保存。所以,发布的文章中,就很少有公式了。这就失去了数学味道,如果要看完整的,请移步到网站:https://qiwsir.gitee.io/mathmetics/


用程序实现参数估计

如果使用最小二乘法实现一元线性回归系数估计,即(10)式的结果,可以使用statsmodels中提供OLS,即“普通最小二乘法(Ordinary Least Squares)”。

使用的数据就是前面绘制散点图使用的alpha0beta。现在稍微透露一下这两组数据的含义,这两组输入来自于光的折射实验(虚拟的),其中alpha0表示入射角(角度为单位),beta表示折射角(弧度为单位),为了单位统一,将alpha0的角度转化为弧度。

代码语言:javascript复制
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`得到一元线性回归模型。

代码语言:javascript复制
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

现在所得到的两个输出值,一个是偏置

beta_0=0.068711

,另外一个是

beta_1=0.534783

,即所得到的的一元线性回归方程是:

y = 0.068711 0.534783x
代码语言: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)而言,并不是一个好模型。

除了估计回归系数之外,在严格的统计学中,还要估计

sigma^2

,并进行相关的假设检验,并给出置信区间。这些内容通常依据上述定理中各参数分布特点解决。

拟合二次曲线

像上面图示显示,所得到的模型与原数据集的分布差别较大,称为“欠拟合”。这说明我们选择的模型有问题。观察散点图,可能会想到,应该使用:

y = beta_0 beta_1x beta_2x^2

对于这种模型,其图像不是直线,但依然可以使用最小二乘法实现拟合。

代码语言: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')

输出图像:

观察发现,现在的模型与原数据集的分布,拟合得很好,除了在右上角偏差似乎大点——天空中的一小朵乌云。

然而,直觉观察不能代替严谨的评估。

对于前面训练所得到的rr2两个模型,statsmodels中为它们提供的方法,查看有关评估结果。

代码语言:javascript复制
r.summary()

输出:

代码语言:javascript复制
r2.summary()

输出:

上面输出结果,就是对模型的统计评估结果。各项的含义分别是

^{[8]}

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

多重共线性检验(如果与多个参数拟合,则参数彼此相关)

如此,即可实现统计中的线性回归模型构建。

从上面的评估结果中可以看到,目前用二次曲线拟合,已经能够在相当好的程度上体现了两个变量之间的关系——特别强调,现在我们得到的是相关关系。

那么,相关关系是否就是因果关系?尚需进一步研究。

(待续)

0 人点赞