python 逐步回归算法


Posted in Python onApril 06, 2021

算法介绍

逐步回归是一种线性回归模型自变量选择方法;
逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除。以确保每次引入新的变量之前回归方程中只包含显著性变量。这是一个反复的过程,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止。以保证最后所得到的解释变量集是最优的。
这里我们选择赤池信息量(Akaike Information Criterion)来作为自变量选择的准则,赤池信息量(AIC)达到最小:基于最大似然估计原理的模型选择准则。

数据情况

案例

在现实生活中,影响一个地区居民消费的因素有很多,例如一个地区的人均生产总值、收入水平等等,本案例选取了9个解释变量研究城镇居民家庭平均每人全年的消费新支出y,解释变量为:
x1——居民的食品花费
x2——居民的衣着消费
x3——居民的居住花费
x4——居民的医疗保健花费
x5——居民的文教娱乐花费
x6——地区的职工平均工资
x7——地区的人均GDP
x8——地区的消费价格指数
x9——地区的失业率(%)

数据

python 逐步回归算法

代码

# -*- coding: UTF-8 -*-

import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.stats.api import anova_lm
import matplotlib.pyplot as plt
import pandas as pd
from patsy import dmatrices
import itertools as it
import random


# Load data 读取数据
df = pd.read_csv('data3.1.csv',encoding='gbk')
print(df)


target = 'y'
variate = set(df.columns) #获取列名
variate.remove(target) #去除无关列
variate.remove('地区')

#定义多个数组,用来分别用来添加变量,删除变量
x = []
variate_add = []
variate_del = variate.copy()
# print(variate_del)
y = random.sample(variate,3) #随机生成一个选模型,3为变量的个数
print(y)
#将随机生成的三个变量分别输入到 添加变量和删除变量的数组
for i in y:
 variate_add.append(i)
 x.append(i)
 variate_del.remove(i)

global aic #设置全局变量 这里选择AIC值作为指标
formula="{}~{}".format("y","+".join(variate_add)) #将自变量名连接起来
aic=smf.ols(formula=formula,data=df).fit().aic #获取随机函数的AIC值,与后面的进行对比
print("随机化选模型为:{}~{},对应的AIC值为:{}".format("y","+".join(variate_add), aic))
print("\n")



#添加变量
def forwark():
 score_add = []
 global best_add_score
 global best_add_c
 print("添加变量")
 for c in variate_del:
  formula = "{}~{}".format("y", "+".join(variate_add+[c]))
  score = smf.ols(formula = formula, data = df).fit().aic
  score_add.append((score, c)) #将添加的变量,以及新的AIC值一起存储在数组中
  
  print('自变量为{},对应的AIC值为:{}'.format("+".join(variate_add+[c]), score))

 score_add.sort(reverse=True) #对数组内的数据进行排序,选择出AIC值最小的
 best_add_score, best_add_c = score_add.pop()
 
 print("最小AIC值为:{}".format(best_add_score))
 print("\n")

#删除变量
def back():
 score_del = []
 global best_del_score
 global best_del_c
 print("剔除变量")
 for i in x:

  select = x.copy() #copy一个集合,避免重复修改到原集合
  select.remove(i)
  formula = "{}~{}".format("y","+".join(select))
  score = smf.ols(formula = formula, data = df).fit().aic
  print('自变量为{},对应的AIC值为:{}'.format("+".join(select), score))
  score_del.append((score, i))

 score_del.sort(reverse=True) #排序,方便将最小值输出
 best_del_score, best_del_c = score_del.pop() #将最小的AIC值以及对应剔除的变量分别赋值
 print("最小AIC值为:{}".format(best_del_score))
 print("\n")

print("剩余变量为:{}".format(variate_del))
forwark()
back()

while variate:
  
#  forwark()
#  back()
 if(aic < best_add_score < best_del_score or aic < best_del_score < best_add_score):
  print("当前回归方程为最优回归方程,为{}~{},AIC值为:{}".format("y","+".join(variate_add), aic))
  break
 elif(best_add_score < best_del_score < aic or best_add_score < aic < best_del_score):
  print("目前最小的aic值为{}".format(best_add_score))
  print('选择自变量:{}'.format("+".join(variate_add + [best_add_c]))) 
  print('\n')
  variate_del.remove(best_add_c)
  variate_add.append(best_add_c)
  print("剩余变量为:{}".format(variate_del))
  aic = best_add_score
  forwark()
 else:
  print('当前最小AIC值为:{}'.format(best_del_score))
  print('需要剔除的变量为:{}'.format(best_del_c))
  aic = best_del_score #将AIC值较小的选模型AIC值赋给aic再接着下一轮的对比
  x.remove(best_del_c) #在原集合上剔除选模型所对应剔除的变量
  back()

结果

python 逐步回归算法

python 逐步回归算法

python 逐步回归算法

以上就是如何用python 做逐步回归的详细内容,更多关于python 逐步回归的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python函数学习笔记
Oct 07 Python
py2exe 编译ico图标的代码
Mar 08 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
Python格式化日期时间操作示例
Jun 28 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
使用python绘制二维图形示例
Nov 22 Python
Python-openCV读RGB通道图实例
Jan 17 Python
tensorflow之读取jpg图像长和宽实例
Jun 18 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
python 通过使用Yolact训练数据集
python生成随机数、随机字符、随机字符串
Apr 06 #Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 #Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
python实现批量提取指定文件夹下同类型文件
Apr 05 #Python
python实现ROA算子边缘检测算法
python实现批量移动文件
You might like
php ctype函数中文翻译和示例
2014/03/21 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
win10系统中安装scrapy-1.1
2016/07/03 Python
快速了解Python中的装饰器
2018/01/11 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
大学生护理专业自荐信
2013/10/03 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
Django如何创作一个简单的最小程序
2021/05/12 Python
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python