python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析#coding=utf/8#time:2019/8/11#function:线性回归#author:Karenimportpandasaspdimportnumpyasnpimportstatsmodels.apiassmimportmatplotlib.pyplotaspltfromsklearnimportpreprocessingimportstatsmode…

大家好,又见面了,我是你们的朋友全栈君。

#coding=utf/8

#time:2019/8/11

#function:线性回归

#author:Karen

import pandas as pd

import numpy as np

import statsmodels.api as sm

import matplotlib.pyplot as plt

from sklearn import preprocessing

import statsmodels.formula.api as smf

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

import math

#解决负号显示问题

from matplotlib import font_manager as fm

#数据预处理及数据探索

def get_data():

f=open(‘北京高端酒店价格.csv’,encoding=’utf/8′)

data=pd.read_csv(f,encoding=’utf/8′)

st=”

for i in data[‘地区’].unique():

st=st+’,’+i

print(st)

print(data[‘位置评分’].describe())

data[‘装修时间’]=data[‘装修时间’].apply(lambda x: ‘新装修’ if x>2015 else ‘旧装修’)

# tim=data[‘装修时间’].unique()

# typ=data[‘房间类型’].unique()

# location=data[‘地区’].unique()

#哑变量

df1=pd.get_dummies(data[‘房间类型’])

df2=pd.get_dummies(data[‘地区’])

df3=pd.get_dummies(data[‘装修时间’])

data=pd.concat([data,df1,df2,df3],axis=1)

data.drop([‘房间类型’,’地区’],inplace=True,axis=1)

#改变索引

price=data[‘房价’]

data.drop(‘房价’,inplace=True,axis=1)

data.insert(0,’房价’,price)

# data[‘新装修’]=data.loc[22]

print(data.head())

data.drop([‘酒店名称’,’经度’,’纬度’,’地址’,’其他城区’,’标准间’,’装修时间’,’旧装修’],inplace=True,axis=1)

data[‘对数房价’]=data[‘房价’].apply(lambda x:math.log(x))

print(data.head())

data=data.round(1)

#数据标准化

a=data.columns.values.tolist()

X_scaled = preprocessing.scale(data)

data=pd.DataFrame(X_scaled)

data.columns=a

data.to_csv(‘北京酒店价格anlysis.csv’)

return data

#模型建立

def model_extablish(formula):

f=open(‘北京酒店价格anlysis.csv’,encoding=’utf/8′)

data=pd.read_csv(f,encoding=’utf/8′)

#切分数据集

Train, Test = train_test_split(data, train_size=0.8, random_state=1234)

fit = smf.ols(‘对数房价~卫生评分+服务评分+设施评分+位置评分+评价数+新装修+公司+出行住宿+校园生活+豪华套间+商务间+海淀区+东城区+朝阳区’, data=Train).fit()

print(fit.summary())

#计算RMSE

pred = fit.predict(exog=Test)

RMSE = np.sqrt(mean_squared_error(Test[‘对数房价’], pred))

print(‘第一个模型的预测效果:RMES=%.4f\n’ % RMSE)

# 绘制真实值与预测值的关系

# 真实值与预测值的关系# 设置绘图风格

# plt.style.use(‘ggplot’)

# 设置中文编码和负号的正常显示

plt.rc(“font”, family=”SimHei”, size=”9″)

# 散点图

plt.scatter(Test[‘对数房价’], pred, label=’观测点’)

# 回归线

plt.plot([Test[‘对数房价’].min(), Test[‘对数房价’].max()], [pred.min(), pred.max()], ‘r–‘, lw=2, label=’拟合线’)

结果展示:

python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

查看F值,小于0.01,通过F检验,说明至少有一个变量显著,查看各变量P值,选定显著性水平,进行比较,R方0.645,大于0.5,。python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

# 添加轴标签和标题

plt.title(‘真实值VS.预测值’)

plt.xlabel(‘真实值’)

plt.ylabel(‘预测值’

)

# 去除图边框的顶部刻度和右边刻度

plt.tick_params(top=’off’, right=’off’)

# 添加图例

plt.legend(loc=’upper left’)

# 图形展现

plt.show()

采用AIC准则对变量进行筛选

#定义向前逐步回归函数

def forward_select(target=’对数房价’):

#读取文件

f = open(‘北京酒店价格anlysis.csv’, encoding=’utf/8′)

data = pd.read_csv(f, encoding=’utf/8′)

data.drop(‘房价’,inplace=True,axis=1)

Train, Test = train_test_split(data, train_size=0.8, random_state=1234)

variate=set(data.columns) #将字段名转换成字典类型

variate.remove(target) #去掉因变量的字段名

selected=[]

current_score,best_new_score=float(‘inf’),float(‘inf’) #目前的分数和最好分数初始值都为无穷大(因为AIC越小越好)

#循环筛选变量

while variate:

aic_with_variate=[]

for candidate in variate: #逐个遍历自变量

formula=”{}~{}”.format(target,”+”.join(selected+[candidate])) #将自变量名连接起来

aic=smf.ols(formula=formula,data=Train).fit().aic #利用ols训练模型得出aic值

aic_with_variate.append((aic,candidate)) #将第每一次的aic值放进空列表

aic_with_variate.sort(reverse=True) #降序排序aic值

best_new_score,best_candidate=aic_with_variate.pop() #最好的aic值等于删除列表的最后一个值,以及最好的自变量等于列表最后一个自变量

if current_score>best_new_score: #如果目前的aic值大于最好的aic值

variate.remove(best_candidate) #移除加进来的变量名,即第二次循环时,不考虑此自变量了

selected.append(best_candidate) #将此自变量作为加进模型中的自变量

current_score=best_new_score #最新的分数等于最好的分数

print(“aic is {},continuing!”.format(current_score)) #输出最小的aic值

else:

print(“for selection over!”)

break

formula=”{}~{}”.format(target,”+”.join(selected)) #最终的模型式子

print(“final formula is {}”.format(formula))

return formula

对模型进行检验

def test_model(formula):

f = open(‘北京酒店价格anlysis.csv’, encoding=’utf/8′)

data = pd.read_csv(f, encoding=’utf/8′)

Train, Test = train_test_split(data, train_size=0.8, random_state=1234)

fit = smf.ols(formula,Test).fit()

results = pd.DataFrame({

‘resids’: fit.resid, # 残差

‘std_resids’: fit.resid_pearson, # 方差标准化的残差

‘fitted’: fit.predict() }) # y预测值

# ====== 图示法完成方差齐性的判断 ======

# 标准化残差与预测值之间的散点图

plt.scatter(fit.predict(), results[‘std_resids’])

plt.xlabel(‘预测值’)

plt.ylabel(‘标准化残差’)

# 添加水平参考线

plt.axhline(y=0, color=’r’, linewidth=2)

plt.show()

# ====== 统计法完成方差齐性的判断 ======

#查看第二项P值

# White’s Test

print(sm.stats.diagnostic.het_white(fit.resid, exog=fit.model.exog))

# Breusch-Pagan

print(sm.stats.diagnostic.het_breuschpagan(fit.resid, exog_het=fit.model.exog))

# ======残差非正态性和Q-Q图 ======

qqplot = sm.qqplot(results[‘std_resids’], line=’s’)

plt.xlabel(‘Theoretical quantiles’)

plt.ylabel(‘Sample quantiles’)

plt.title(‘Normal Q-Q’)

plt.show(qqplot)

# ======强影响点和COOK距离 ======

proptease = fm.FontProperties()

proptease.set_size(‘xx-small’)

fig, ax = plt.subplots(figsize=(19.2, 14.4))

fig = sm.graphics.influence_plot(fit, ax=ax, criterion=’Cooks’,size=0.2,fontproperties=proptease)

plt.xlabel(‘Obs.number’)

plt.ylabel(“Cook’s distance”)

plt.title(“Cook’s distance”)

plt.grid()

plt.show()

plt.close()

# ======在同一画布显示 ======

fontdict = {‘family’: ‘Times New Roman’,

‘weight’: ‘normal’,

‘size’: 9,

}

fig = plt.figure(figsize=(20, 20), dpi=100)

ax1 = fig.add_subplot(2, 2, 1)

ax1.plot(results[‘fitted’], results[‘resids’], ‘o’)

ax1.set_xlabel(‘Fitted values’,fontdict=fontdict)

ax1.set_ylabel(‘Residuals’,fontdict=fontdict)

ax1.set_title(‘Residuals vs Fitted’,fontdict=fontdict)

ax1.axhline(y=0, color=’r’, linewidth=2)

ax2 = fig.add_subplot(2, 2, 2)

sm.qqplot(results[‘std_resids’], line=’s’, ax=ax2)

ax2.set_xlabel(‘Theoretical quantiles’,fontdict=fontdict)

ax2.set_ylabel(‘Sample quantiles’,fontdict=fontdict)

ax2.set_title(‘Normal Q-Q’,fontdict=fontdict)

ax3 = fig.add_subplot(2, 2, 3)

ax3.plot(results[‘fitted’], abs(results[‘std_resids’]) ** .5, ‘o’)

ax3.set_xlabel(‘Fitted values’,fontdict=fontdict)

ax3.set_ylabel(‘Sqrt(|standardized residuals|)’,fontdict=fontdict)

ax3.set_title(‘Scale-Location’,fontdict=fontdict)

ax3.axhline(y=0.8, color=’r’, linewidth=2)

ax4 = fig.add_subplot(2, 2, 4)

sm.graphics.influence_plot(fit, criterion=’Cooks’, size=0.2, ax=ax4)

ax4.set_xlabel(‘Obs.number’,fontdict=fontdict)

ax4.set_ylabel(“Cook’s distance”,fontdict=fontdict)

ax4.set_title(“Cook’s distance”,fontdict=fontdict)

plt.show()

结果展示:

python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

python aic准则_pythonAIC准则下线性回归实现及模型检验案例分析

残差基本服从正态分布,存在部分强影响点,具有改进空间

if __name__ == ‘__main__’:

get_data()

test_model(forward_select())

因为是直接调用sm库内画cook距离,所以在最后一张画布的时候虽然整体调整了字体大小,但是内部字体大小还是没有调节成功,希望可以有大佬指点一下,感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142236.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构 图的遍历

    数据结构 图的遍历图的遍历分为深度优先遍历(Depth_First_Search)和广度优先遍历(Breadth_First_Search),分别简称为DFS和BFS。图的遍历是从某一个顶点出发,访问其他顶点,但是不能重复访问(每个顶点只能访问一次)。深度优先遍历(DFS):深度优先,就是沿着某一个方向不重复的一直便利下去,若走到尽头,退到上一个顶点,寻找附近有没有顶点,有且不重复的话,接着便利,否则退到上一个顶点…

    2022年4月30日
    31
  • pycharm如何分段运行_pycharm只运行部分代码

    pycharm如何分段运行_pycharm只运行部分代码在最新版的pycharm中拥有类似jupyter的分段执行代码功能,其使用方法如下:1.在想要分段运行的段前一行(空白行)输入#%%2.选择Usescientificmode3.分段运行的结果补充知识:Pycharm分行或分块执行介绍Pycharm中其实也可以使用类似于Spyder和Jupyter中的分行或分块执行,主要可以使用两种方法。需要注意的是,下面两种方法的本质都是在控制台执行,要注意…

    2022年8月26日
    50
  • vue获取上传文件路径_vue中文件上传及接收「建议收藏」

    vue获取上传文件路径_vue中文件上传及接收「建议收藏」准备:前端:vue环境+axios+elemen-ui后端:node.jsmulter前端代码://引入axiosimportaxiosfrom’axios’;//获取用户信息getUserInfo(){//发送请求获取用户信息getInfo().then(res=>{//接收数据let{data}=res;this.userInfo=data[0…

    2022年8月15日
    2
  • 计算机电脑怎么改皮肤,终极:如何更改计算机鼠标的皮肤「建议收藏」

    如何更改计算机鼠标的皮肤图33.点击左侧菜单栏中的“鼠标”,进入鼠标设置页面如何更改计算机鼠标的皮肤图44.在鼠标设置页面中找到“其他鼠标选项”的蓝线,单击以输入,在弹出窗口中单击“指针”,然后单击“解决方案”以查看下图<如何更改计算机鼠标的皮肤图55.这是Windows的默认鼠标指针页面,但是许多朋友会看到他们朋友的计算机鼠标指针具有其他新颖的样式,并且不包含在Windows的默认指…

    2022年4月12日
    55
  • c++stl基础及应用_stl详解

    c++stl基础及应用_stl详解一、c++STL常用内容总结文章目录一、c++STL常用内容总结1.vector(数组)1.1介绍1.2方法函数1.3注意点1.3.a排序1.3.b访问2.stack(栈)2.1介绍2.2方法函数2.3注意点2.3.a.栈遍历2.3.b.模拟栈3.queue(队列)3.1介绍3.2方法函数4.deque(双端队列)4.1介绍4.2方法函数4.3注意点5.priority_queue(优先队列)5.1介绍5.2函数方法5.3设置优先级5.3.a基本数据类型的优先级5

    2022年10月15日
    0
  • ps修图教程新手入门:如何用Photoshop处理证件照「建议收藏」

    ps修图教程新手入门:如何用Photoshop处理证件照「建议收藏」今天小编给大家讲解如何用Photoshop处理证件照,证件照是大家生活中经常要用到的,相信很多同学碰到过需要给背景照换颜色的时候,却不知道如何更换背景颜色。我们平时照的证件照,一般都是红底,这时我们遇到要蓝底的时候怎么办呢?下面讲解ps修图教程新手入门如何用Photoshop处理证件照。下面,以一寸照片为例,讲解如何用Photoshop制作证件照。1、电脑操作2、ps软件:AdobePhotoshop2017(演示)一、ps改变尺寸1、打开证件照原件(图片小编从网上下载了一张,并打码

    2022年6月26日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号