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去掉字符串中重复字符的方法
Feb 27 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
详解Python正则表达式re模块
Mar 19 Python
python安装gdal的两种方法
Oct 29 Python
python实现PCA降维的示例详解
Feb 24 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
Python中实现输入一个整数的案例
May 03 Python
python如何实现递归转非递归
Feb 25 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
英国复古服装购物网站:Collectif
2019/10/30 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
就业推荐自我鉴定
2013/10/06 职场文书
违反学校规定检讨书
2014/01/18 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
Python matplotlib多个子图绘制整合
2022/04/13 Python