开发者学堂课程【人工智能必备基础:概率论与数理统计:statsmodels 回归分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/545/detail/7436
statsmodels 回归分析
一、 statsmodels 使用
先将 import statsmodels 导入,先做一元线性回归。因没有实际数据,先生成一些数据,指定 nsample = 20。X 是横轴,y 是纵轴。为画图好看,指定 np.linspace 从 0 到 10,选 20 个数,20 个数之间是等距的。打印 x:
In [8] : import numpy as npimport matplotlib. pyplot as plt
import statsmodels. api as smnsample = 20х = np. linspace (0, 10, nsample)Out[8] :array([ 0,0.52631579, 1.05263158, 1.57894737,2.10526316, 2.6315789,3.15789474, 3.68421053,4.21052632,4.73684211, 5. 26315789,5.78947368,6.31578947, 6.84210526, 7. 36842105, 7.89473684,8.42105263,8.94736842,9. 47368421, 10.])
一元线性回归
推导最小二乘法时,加一列 1,为了组合。sm 代表 statsmodels,将 x 传入add_constant,表示在 x 原来在原来基础上本不是一列,实际上是一列。第一列是1,右边那列是实际的值。r
In [9]: x = sm. add. constant (x)Out[9]: array([[ 1.,0.],
[1. , 0.52631579],
[1. , 1.05263158] ,
[1. , 1. 57894737],
[1. , 2.10526316],
[1. , 2.63157895],
[1. , 3. 15789474],
[1. , 3. 68421053],
[1. , 4.21052632],
[1. , 4.73684211],
[1. , 5.26315789] ,
[1. , 5.78947368],
[1. , 6.31578947],
[1. , 6.84210526] ,
[1. , 7.36842105],
[1. , 7.89473684],
[1. , 8.42105263],
[1. , 8.94736842],
[1. , 9.47368421],
[1. , 10. ]])
做回归,为了构造出 y 值,为了使任务做可视化展示。先将 β0,β1 指定出来,y=β1x+β0。默认实际情况 β1=5,β0=2。观察求解出来的实际值与设置出来的实际值间的差异。
In [11]: # β0,β1 分别设置成 2,5
beta = np. array([2, 5])
beta0ut[11]: array([2, 5])
在真实情况下,数据点不一定与 β0,β1 一模一样,都会偏上偏下,偏左偏右。所以引入误差项。为了使数据更真实,在 y=β1x+β0 基础上,在每个数据点间加上随机的抖动,并且误差项是服从于高斯分布的。首先构造出随机的高斯分布,指定 size=nsample,因为要给 20 个点都加上随机的浮动,所以得到下面的结果。e 表示对于每个点,可能有些正值是往上的,有些负值是往下的。对于数据,表示的意思是,要数据往上抖动,或往下抖动。In [13]: #误差项e = np. random. normal (size=nsample)
e0ut[13]: array([-1. 87955777, -0. 49196542, 0. 53259826,0. 10675137,1.17508727,-1.02293335,1.75717793, -1. 12456907, -0. 64294355,0.44920794,- 1.20471093,0.02588779, -0. 69216987,1.23018605,0.59180637,1.03269883,0.16712902,2.06599762, -2. 06133608, 0. 12899139])
实际数据是 x 和 beta 可以做绝对运算,因偏一列 e。所以等于
y = np.dot(X, beta) + e,所以得出的 y 是真实值,也打印出实际的 20
个值。
In [14]:#实际值 y
y = np.dot(X, beta) + e
y
0ut[14]: array([0.12044223, 4.13961353, 6.73055964, 9.78798547,
13.70140306,14.13496139,19.54665161,19.29648356,22.40968802,26.13341847,27.11107855,30.97325622,32.886777537.44071236,39.43391164,42.50638304,44.27239218,48.80283972,47.30708497,51.87100861])
接着计算回归方程,假设已得出 x 和 y 的值,构造一个方程,用最小二乘法,sm. OLS(y,X) 表示最小二乘法的意思,需指定一个 y 和指定一个 x,分别表示实际值和数据点。
In [15]:1#最小二乘法model = sm. OLS(y,X)
先将 model 指定出来,model. fit() 来拟合当前数据,在用 res 得出最终的结果。In [16]: #拟合数据res = model. fit()
es. params 表示回归系数,最后就会返回出原来的 β0,β1。原假设 β1=5,β0=2,实际求出 β0=1. 49524076,β1=5.08701837,看得出 β0 求出的结果比较准确, β1 差不大。这是由于数据点比较少引起的。为了显示流畅,只有了 20 个数据点。In [18]:#回归系数
res. paramsOut[18]: array([ 1. 49524076, 5.08701837])
R-squared 表示 R 方值,用于评估线性方程的优劣。
Adj.R-squared 表示调整过的 R 方值。主要用于多元线性回归当中。检验线性方程能否用一个线性方程表达。Prob (F-statistic) 表示检验的概率值,概率值较小,说明x和y的线性关系是非常强的。No.Observations 表示自由度。No.Observations 表示一共观察的样本。Df Residuals 表示日期。Df Model 表示自由度。coef std err 表示当前建立的模型。Const 表示常数项。X1 表示斜率项。分别对应 β0,β1。第一列表示的是实际指标值,第二列 std 代表的值,第三列表示的是 t 指,第四列表示 P 值。这些值表示的是检验的值。现已构造出一个方程,得出真实值,欲得到一个预测值。
In (20]:#全部结果res. susmaryO)
Out[20]:
OLS Regression Results
Dep.Varlable:y R-squared:0.995
Model:OLS Adj.R-squared:0.995
Method:Least Squares F-statistic:3668.
Date:Thu.01 Mar 2018 Prob (F-statistic): 2.94e-22
Time:18:07:03 Log-Likelihood:-29.947
No.Observations:20 AIC: 63.89
Df Residuals:18 BIC: 65.89
Df Model:1
Covariance Type:nonrobust
coef std err t P>|t| [0.025 0.975]
const 1.4952 0.491 3.043 0.007 0.463 2.527
x1 5.0870 0.084 60.560 0.000 4.911 5.263
现已构造出回归方程,拥有真实值,欲得到预测值,
In [21]: #拟合的估计值 y_ = res. fittedvalues(表示将估计值显示出来)
Y_Out[21]: array([1.49524076,4.17261885,6.84999693,9.52737502,12.20475311, 14. 8821312 ,17.55950928,20.23688737,22.91426546, 25. 59164354,28.26902163,30.94639972,33.62377781,36: 30115589,38.97853398,41.65591207,44.33329015,7.01066824,49.68804633,52.36542442])In [25]: fig, ax = plt. subplots (figsize=(8, 6))ax.plot(x, y, ’o’ , 1abel= ‘data’ )#原始数据
ax.plot(x, y_,‘r--.’ , label=’ test ‘)#拟合数据
ax. legend(1oc=’best’ )plt. show()
将估计值和原始的指标值画出。蓝色点表示原始数据,新生成的是红色的,所以完成了简单的回归方程。
