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实现周期性抓取网页内容的方法
Nov 04 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
Python实现自动访问网页的例子
Feb 21 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
2006/12/14 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
PHP实现递归无限级分类
2015/10/22 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
javascript中的this详解
2014/12/08 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
python中Lambda表达式详解
2019/11/20 Python
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
党员干部一句话承诺
2014/05/30 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
技术员岗位职责
2015/02/04 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
战马观后感
2015/06/08 职场文书
素质拓展训练感想
2015/08/07 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
vue引入Excel表格插件的方法
2021/04/28 Vue.js
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL