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

Python 根据AIC准则定义向前逐步回归进行变量筛选(二)Python根据AIC准则定义向前逐步回归进行变量筛选(二)AIC简介AIC即赤池值,是衡量模型拟合优良性和模型复杂性的一种标准,在建立多元线性回归模型时,变量过多,且有不显著的变量时,可以使用AIC准则结合逐步回归进行变量筛选。AICD数学表达式如下:AIC=2p+n(log(SSE/n))AIC=2p+n(log(SSE/n))AIC=2p+n(log(SSE/n))其中,ppp…

大家好,又见面了,我是你们的朋友全栈君。

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.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142215.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java学习——使用Eclipse进行单元测试,报错Can’t allocate jvmti memory

    工具环境:Windows+Eclipse+Jdk1.7 项目框架: Spring+SpringMVC + Hibernate在使用Eclipse进行单元测试的时候运行后,没有成功!并且控制台输出报错Can’t allocate jvmti memory 具体报错信息如下:FATAL ERROR in native method: JDWP Can’t allocate jvmti memory

    2022年2月25日
    51
  • SAT到底是变难了还是变简单了?

    SAT到底是变难了还是变简单了?

    2021年8月28日
    55
  • DDD理论学习系列(13)– 模块

    DDD理论学习系列(13)– 模块"DDD理论学习系列——案例及目录"1.引言Module,即模块,是指提供特定功能的相对独立的单元。提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合。对于简单问

    2022年7月3日
    23
  • String与StringBuffer的区别?

    String与StringBuffer的区别?String:1.String创建的对象是不可变的,一旦创建不可改变2.对象值可以改变其实是创建了一个新的对象,然后把新的值保存进去(如图1)3.String类被final修饰,不可以被继承4.String创建的对象的值存在于常量池,不用的时候不会被销毁5.String运行时间较长6.String适用于比较短而小的字符串图1StringBuffer:1.StringBuffer创建的对象是可变的2.它的改变不像String那样重新创建对象,而是通过构造方法(如图2)3.StringBu

    2022年9月21日
    2
  • 暗影骑士擎bios详解_runloop原理和机制

    暗影骑士擎bios详解_runloop原理和机制Runloop什么是Runloop?从字面上讲就是运行循环。它内部就是do-while循环,在这个循环内部不断地处理各种任务。一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法)RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退

    2025年7月5日
    3
  • try catch finally 用法

    try catch finally 用法在讲之前我们先看一段程序:publicclassTest{publicstaticvoidmain(String[]args){System.out.println("returnvalueofgetValue():"+getValue());} publicstaticintgetValue(){…

    2022年6月30日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号