前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回归分析(3)

回归分析(3)

作者头像
老齐
发布2021-03-11 15:15:41
1.4K0
发布2021-03-11 15:15:41
举报
文章被收录于专栏:老齐教室老齐教室

注:本文是回归分析专题的第三部分,此专题是对即将于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

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

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

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

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

(待续)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用程序实现参数估计
  • 拟合二次曲线
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档