Python 根据AIC准则定义向前逐步回归进行变量筛选(二)

您所在的位置:网站首页 aic和sc最小信息准则 Python 根据AIC准则定义向前逐步回归进行变量筛选(二)

Python 根据AIC准则定义向前逐步回归进行变量筛选(二)

2023-09-07 06:08| 来源: 网络整理| 查看: 265

Python 根据AIC准则定义向前逐步回归进行变量筛选(二) AIC简介

AIC即赤池值,是衡量模型拟合优良性和模型复杂性的一种标准,在建立多元线性回归模型时,变量过多,且有不显著的变量时,可以使用AIC准则结合逐步回归进行变量筛选。AICD数学表达式如下: A I C = 2 p + n ( l o g ( S S E / n ) ) AIC=2p+n(log(SSE/n)) AIC=2p+n(log(SSE/n)) 其中, p p p是进入模型当中的自变量个数, n n n为样本量, S S E SSE SSE是残差平方和,在 n n n固定的情况下, p p p越小, A I C AIC AIC越小, S S E SSE SSE越小, A I C AIC AIC越小,而 p p p越小代表着模型越简洁, S S E SSE SSE越小代表着模型越精准,即拟合度越好,综上所诉, A I C AIC AIC越小,即模型就越简洁和精准。

逐步回归

逐步回归分为三种,分别是向前逐步回归,向后逐步回归,逐步回归。向前逐步回归的特点是将自变量一个一个当如模型中,每当放入一个变量时,都利用相应的检验准则检验,当加入的变量不能使得模型变得更优良时,变量将会被剔除,如此不断迭代,直到没有适合的新变量加入为止。向后逐步回归的特点是,将所有变量都放入模型之后,一个一个的剔除变量,将某一变量拿出模型而使得模型更优良时,将会剔除此变量。如此反复迭代,直到没有合适的变量剔除为止。逐步回归则是结合了以上的向前和向后逐步回归的特点。

继上一篇的代码 import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing as fch #加载加利福尼亚房屋价值数据 #加载线性回归需要的模块和库 import statsmodels.api as sm #最小二乘 from statsmodels.formula.api import ols #加载ols模型 data=fch() #导入数据 house_data=pd.DataFrame(data.data) #将自变量转换成dataframe格式,便于查看 house_data.columns=data.feature_names #命名自变量 house_data.loc[:,"value"]=data.target #合并自变量,因变量数据 house_data.shape #查看数据量 house_data.head(10) #查看前10行数据 #分训练集测试集 import random random.seed(123) #设立随机数种子 a=random.sample(range(len(house_data)),round(len(house_data)*0.3)) house_test=[] for i in a: house_test.append(house_data.iloc[i]) house_test=pd.DataFrame(house_test) house_train=house_data.drop(a) 定义向前逐步回归函数 #定义向前逐步回归函数 def forward_select(data,target): 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=ols(formula=formula,data=data).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)) model=ols(formula=formula,data=data).fit() return(model) 利用向前逐步回归筛选变量 forward_select(data=house_train,target="value")

在这里插入图片描述 最终保留了7个自变量,其实只是剔除了一个自变量,将这七个自变量放进模型里再运行一遍,查看模型结果

lm_1=ols("value~MedInc+HouseAge+Latitude+Longitude+AveBedrms+AveRooms+AveOccup",data=house_train).fit() lm_1.summary()

在这里插入图片描述 由以上结果可以看出,其实模型的R方几乎没有变化。 本篇文章主要是想讲述如何利用statsmodels和AIC准则定义向前逐步回归函数筛选自变量,在日后遇到比较多自变量的时候,方便进行自变量筛选。

参考文献

常国珍,赵仁乾,张秋剑.Python数据科学技术详解于商业实战[M]. 北京:中国人民大学出版社,2018.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3