如何用python做逐步回歸
算法介紹
逐步回歸是一種線性回歸模型自變量選擇方法;
逐步回歸的基本思想是將變量逐個(gè)引入模型,每引入一個(gè)解釋變量后都要進(jìn)行F檢驗(yàn),并對(duì)已經(jīng)選入的解釋變量逐個(gè)進(jìn)行t檢驗(yàn),當(dāng)原來引入的解釋變量由于后面解釋變量的引入變得不再顯著時(shí),則將其刪除。以確保每次引入新的變量之前回歸方程中只包含顯著性變量。這是一個(gè)反復(fù)的過程,直到既沒有顯著的解釋變量選入回歸方程,也沒有不顯著的解釋變量從回歸方程中剔除為止。以保證最后所得到的解釋變量集是最優(yōu)的。
這里我們選擇赤池信息量(Akaike Information Criterion)來作為自變量選擇的準(zhǔn)則,赤池信息量(AIC)達(dá)到最?。夯谧畲笏迫还烙?jì)原理的模型選擇準(zhǔn)則。
數(shù)據(jù)情況
案例
在現(xiàn)實(shí)生活中,影響一個(gè)地區(qū)居民消費(fèi)的因素有很多,例如一個(gè)地區(qū)的人均生產(chǎn)總值、收入水平等等,本案例選取了9個(gè)解釋變量研究城鎮(zhèn)居民家庭平均每人全年的消費(fèi)新支出y,解釋變量為:
x1——居民的食品花費(fèi)
x2——居民的衣著消費(fèi)
x3——居民的居住花費(fèi)
x4——居民的醫(yī)療保健花費(fèi)
x5——居民的文教娛樂花費(fèi)
x6——地區(qū)的職工平均工資
x7——地區(qū)的人均GDP
x8——地區(qū)的消費(fèi)價(jià)格指數(shù)
x9——地區(qū)的失業(yè)率(%)
數(shù)據(jù)
代碼
# -*- 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 讀取數(shù)據(jù) df = pd.read_csv('data3.1.csv',encoding='gbk') print(df) target = 'y' variate = set(df.columns) #獲取列名 variate.remove(target) #去除無關(guān)列 variate.remove('地區(qū)') #定義多個(gè)數(shù)組,用來分別用來添加變量,刪除變量 x = [] variate_add = [] variate_del = variate.copy() # print(variate_del) y = random.sample(variate,3) #隨機(jī)生成一個(gè)選模型,3為變量的個(gè)數(shù) print(y) #將隨機(jī)生成的三個(gè)變量分別輸入到 添加變量和刪除變量的數(shù)組 for i in y: variate_add.append(i) x.append(i) variate_del.remove(i) global aic #設(shè)置全局變量 這里選擇AIC值作為指標(biāo) formula="{}~{}".format("y","+".join(variate_add)) #將自變量名連接起來 aic=smf.ols(formula=formula,data=df).fit().aic #獲取隨機(jī)函數(shù)的AIC值,與后面的進(jìn)行對(duì)比 print("隨機(jī)化選模型為:{}~{},對(duì)應(yīng)的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值一起存儲(chǔ)在數(shù)組中 print('自變量為{},對(duì)應(yīng)的AIC值為:{}'.format("+".join(variate_add+[c]), score)) score_add.sort(reverse=True) #對(duì)數(shù)組內(nèi)的數(shù)據(jù)進(jìn)行排序,選擇出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一個(gè)集合,避免重復(fù)修改到原集合 select.remove(i) formula = "{}~{}".format("y","+".join(select)) score = smf.ols(formula = formula, data = df).fit().aic print('自變量為{},對(duì)應(yīng)的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值以及對(duì)應(yīng)剔除的變量分別賦值 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("當(dāng)前回歸方程為最優(yōu)回歸方程,為{}~{},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('當(dāng)前最小AIC值為:{}'.format(best_del_score)) print('需要剔除的變量為:{}'.format(best_del_c)) aic = best_del_score #將AIC值較小的選模型AIC值賦給aic再接著下一輪的對(duì)比 x.remove(best_del_c) #在原集合上剔除選模型所對(duì)應(yīng)剔除的變量 back()
結(jié)果
以上就是如何用python 做逐步回歸的詳細(xì)內(nèi)容,更多關(guān)于python 逐步回歸的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 利用python實(shí)現(xiàn)逐步回歸
- 如何用Python徒手寫線性回歸
- python 實(shí)現(xiàn)邏輯回歸
- python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線性回歸案例
- python 還原梯度下降算法實(shí)現(xiàn)一維線性回歸
- python 牛頓法實(shí)現(xiàn)邏輯回歸(Logistic Regression)
- Python 實(shí)現(xiàn)3種回歸模型(Linear Regression,Lasso,Ridge)的示例
- python實(shí)現(xiàn)邏輯回歸的示例
- 如何在python中實(shí)現(xiàn)線性回歸
- 帶你學(xué)習(xí)Python如何實(shí)現(xiàn)回歸樹模型
- python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作
- Python 線性回歸分析以及評(píng)價(jià)指標(biāo)詳解
相關(guān)文章
基于python實(shí)現(xiàn)垂直爬蟲系統(tǒng)的方法詳解
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)垂直爬蟲系統(tǒng)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Python中pandas的dataframe過濾數(shù)據(jù)方法
這篇文章主要介紹了Python中pandas的dataframe過濾數(shù)據(jù)方法,Pandas是另外一個(gè)用于處理高級(jí)數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析的Python庫,Pandas是基于Numpy構(gòu)建的一種工具,需要的朋友可以參考下2023-07-07python去除列表中的空值元素實(shí)戰(zhàn)技巧
這篇文章主要介紹了python實(shí)戰(zhàn)技巧之去除列表中的空值元素,搜集針對(duì)python高效處理數(shù)據(jù)的核心代碼,今天是實(shí)現(xiàn)去除列表中的空值元素,需要的朋友可以參考下2023-02-02使用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲(推薦)
這篇文章主要介紹了用Python實(shí)現(xiàn)一個(gè)蔡徐坤大戰(zhàn)籃球的小游戲,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12OpenCV+Python--RGB轉(zhuǎn)HSI的實(shí)現(xiàn)
今天小編就為大家分享一篇OpenCV+Python--RGB轉(zhuǎn)HSI的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Pandas實(shí)現(xiàn)批量拆分與合并Excel的示例代碼
這篇文章主要為大家詳細(xì)講講如何利用python Pandas實(shí)現(xiàn)批量拆分與合并Excel,文中有非常詳細(xì)的的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2022-05-05python中Requests發(fā)送json格式的post請(qǐng)求方法
這篇文章主要介紹了python中Requests發(fā)送json格式的post請(qǐng)求方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2022-09-09python numpy 常用隨機(jī)數(shù)的產(chǎn)生方法的實(shí)現(xiàn)
這篇文章主要介紹了python numpy 常用隨機(jī)數(shù)的產(chǎn)生方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python的Django中將文件上傳至七牛云存儲(chǔ)的代碼分享
七牛云存儲(chǔ)可以幫助服務(wù)器轉(zhuǎn)存圖片等數(shù)據(jù),類似于Dropbox等存儲(chǔ)服務(wù),這里就帶給大家Python的Django中將文件上傳至七牛云存儲(chǔ)的代碼分享,需要的朋友可以參考下2016-06-06