1. python 实现代码

#################################### 逐步回归
def stepwise_select(data,label,cols_all,method='forward'):
    '''
    args:
        data:数据源,df
        label:标签,str
        cols_all:逐步回归的全部字段
        methrod:方法,forward:向前,backward:向后,both:双向
    return:
        select_col:最终保留的字段列表,list 
        summary:模型参数
        AIC:aic
    '''
    import statsmodels.api as sm
    
    ######################## 1.前向回归
    # 前向回归:从一个变量都没有开始,一个变量一个变量的加入到模型中,直至没有可以再加入的变量结束
    if method == 'forward':  
        add_col = [] 
        AIC_None_value = np.inf
        while cols_all:
            # 单个变量加入,计算aic
            AIC = {}
            for col in cols_all:
                print(col)
                X_col = add_col.copy()
                X_col.append(col)
                X = sm.add_constant(data[X_col])
                y = data[label]
                LR = sm.Logit(y, X).fit()
                AIC[col] = LR.aic
            AIC_min_value = min(AIC.values())   
            AIC_min_key = min(AIC,key=AIC.get)
            # 如果最小的aic小于不加该变量时的aic,则加入变量,否则停止
            if AIC_min_value < AIC_None_value:
                cols_all.remove(AIC_min_key)
                add_col.append(AIC_min_key)
                AIC_None_value = AIC_min_value
            else:
                break
        select_col = add_col
    ######################## 2.后向回归
    # 从全部变量都在模型中开始,一个变量一个变量的删除,直至没有可以再删除的变量结束
    elif method == 'backward': 
        p = True  
        # 全部变量,一个都不剔除,计算初始aic
        X_col = cols_all.copy()
        X = sm.add_constant(data[X_col])
        y = data[label]
        LR = sm.Logit(y, X).fit()
        AIC_None_value = LR.aic        
        while p:      
           # 删除一个字段提取aic最小的字段
           AIC = {}
           for col in cols_all:
               print(col)
               X_col = [i for i in cols_all if i!=col]
               X = sm.add_constant(data[X_col])
               LR = sm.Logit(y, X).fit()
               AIC[col] = LR.aic
           AIC_min_value = min(AIC.values()) 
           AIC_min_key = min(AIC, key=AIC.get)  
           # 如果最小的aic小于不删除该变量时的aic,则删除该变量,否则停止
           if AIC_min_value < AIC_None_value:
               cols_all.remove(AIC_min_key)
               AIC_None_value = AIC_min_value
               p = True
           else:
               break 
        select_col = cols_all             
    ######################## 3.双向回归
    elif method == 'both': 
        p = True
        add_col = []
        # 全部变量,一个都不剔除,计算初始aic
        X_col = cols_all.copy()
        X = sm.add_constant(data[X_col])
        y = data[label]
        LR = sm.Logit(y, X).fit()
        AIC_None_value = LR.aic        
        while p: 
            # 删除一个字段提取aic最小的字段
            AIC={}
            for col in cols_all:
                print(col)
                X_col = [i for i in cols_all if i!=col]
                X = sm.add_constant(data[X_col])
                LR = sm.Logit(y, X).fit()
                AIC[col] = LR.aic     
            AIC_min_value = min(AIC.values())
            AIC_min_key = min(AIC, key=AIC.get)
            if len(add_col) == 0: # 第一次只有删除操作,不循环加入变量
                if AIC_min_value < AIC_None_value:
                    cols_all.remove(AIC_min_key)
                    add_col.append(AIC_min_key)
                    AIC_None_value = AIC_min_value
                    p = True
                else:
                    break
            else:
                # 单个变量加入,计算aic
                for col in add_col:
                    print(col)
                    X_col = cols_all.copy()
                    X_col.append(col)
                    X = sm.add_constant(data[X_col])
                    LR = sm.Logit(y, X).fit()
                    AIC[col] = LR.aic
                AIC_min_value = min(AIC.values())
                AIC_min_key = min(AIC, key=AIC.get)
                if AIC_min_value < AIC_None_value:
                    # 如果aic最小的字段在添加变量阶段产生,则加入该变量,如果aic最小的字段在删除阶段产生,则删除该变量
                    if AIC_min_key in add_col:
                        cols_all.append(AIC_min_key)
                        add_col = list(set(add_col)-set(AIC_min_key))
                        p = True                    
                    else: 
                        cols_all.remove(AIC_min_key)
                        add_col.append(AIC_min_key)
                        p = True
                    AIC_None_value = AIC_min_value
                else:
                    break
        select_col = cols_all 
    ######################## 模型
    X = sm.add_constant(data[select_col])
    LR = sm.Logit(y, X).fit()    
    summary = LR.summary()
    AIC = LR.aic
    return select_col,summary,AIC

2. R 实现代码


library('xlsx')
data<-read.xlsx('C:\\Users\\dw\\Desktop\\ss1.xlsx',sheetName = 'Sheet1')
glm1<-glm(label~.,family = binomial(link = logit),data=data) # 二分类,对应Logit模型
stepAIC(glm1,direction = 'both')
# both,backward结果R与python一致,forward不同

想了解更多,可以关注我哦~
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐