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不同
想了解更多,可以关注我哦~
更多推荐