上一次使用了机器学习方法建立线性回归模型,这次改用统计方法建立线性回归模型。
所用数据集依旧不变,详细过程及代码如下(相关模块及库自行安装):
from __future__ import print_function
import numpy as np
import statsmodels.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_std
import matplotlib.pyplot as plt
import pandas as pd
#搭建线性回归模型,假设y=ax+b
def linearmodel(data):#data:数据集
features=['x']#特征名列表
labels=['y']#标签名列表
y=data[labels]
x=sm.add_constant(data[features])#引入常量截距b
re=train_model(x,y)#搭建模型
print(re.summary())#显示分析结果
#训练模型
def train_model(x,y):
model=sm.OLS(y,x)
re=model.fit()
return re
#主函数
if __name__=='__main__':
path='D:/data.csv'
data=pd.read_csv(path)#读取数据集
linearmodel(data)#线性回归
从代码中可以看到,首先引入常量b,假设模型为y=ax+b,接下来运行代码,并分析结果:
图中const表示常量b,x表示斜率a;coef列表示两个量的预测值,即该模型预测值为:y=1.0330x-0.9495;而P>|t|这一列则表示概率统计中假设检验const=0,x=0(简单来说,就是如果拒绝了假设:const=0,犯错的概率为0.323,同理如果拒绝了假设:x=0,犯错的概率为0;而在统计学中,P值小于0.05称为显著,P值小于0.01称为极显著)时的P-value值,通过判断可知,const=0时P值为0.322>0.05对预测的结果影响并不显著,x=0时P值为0对预测的结果影响极显著,因此可以进一步假设b就为0,也就是y=ax,然后再进一步训练模型。同时,图中的后两列表示的是预测结果所包含95%的置信区间,从这里也可看到,置信区间95%下const可以为0,而x不能为0。
在linearmodel函数中增加如下代码:
def linearmodel(data):
res=train_model(data[features],y)#去掉不显著的常量b,即假设y=ax
print(res.summary())#显示新模型的分析结果
params=('%.3f' % res.params[features])
print('预测模型为:y={}x'.format(str(params)))
visualize_model(res,data,features,labels)#模型可视化
并定义模型可视化函数:
def visualize_model(re,data,features,labels):
prstd,preLow,preUp=wls_prediction_std(re,alpha=0.05)#获得预测结果的标准差并预测上下界(95%置信区间),参数alpha即决定区间的置信度“1-alpha”
fig=plt.figure(figsize=(8,8),dpi=80)#创建图形框
ax=fig.add_subplot(111)#固定为一张图
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.scatter(data[features],data[labels],color='b')#绘制原始数据散点图
ax.plot(data[features],preUp,'r--')#绘制预测区间上界
ax.plot(data[features],re.predict(data[features]),color='r')#绘制预测模型
ax.plot(data[features],preLow,'r--')#绘制预测区间下界
plt.show()
进一步分析结果:
由结果分析可知,新模型为y=0.986x。同时通过模型可视化函数将预测曲线和预测的上下界一同绘制在一张图像上:
同时于之前搭建模型对比分析可以发现:在同一数据集的基础上,应用统计方法和机器学习方法搭建出的线性回归模型并不一样。