Python中是否有类似R StepAIC的逻辑回归向后逐步回归工具?
Python中替代R stepAIC的逻辑回归逐步筛选工具
当然有合适的工具啦!你手动模拟逐步筛选确实耗时又麻烦,Python生态里有几种方法可以实现类似R中stepAIC的功能——既能自动移除高p值变量,又能以最小化AIC为目标优化逻辑回归模型,效率比手动操作高得多。
方法一:用statsmodels实现向后逐步选择(最贴合需求)
statsmodels是Python里做统计建模的核心库,它能直接计算模型的p值和AIC,非常适合实现向后逐步筛选逻辑。下面结合你提供的交互项生成代码,给出完整的实现:
import pandas as pd import statsmodels.api as sm from sklearn.preprocessing import PolynomialFeatures # 你的数据预处理(保留你的逻辑) data = ... # 替换成你的数据集 datapol = data.drop(['flag'], axis=1) # 生成仅包含交互项的特征 poly = PolynomialFeatures(interaction_only=True, include_bias=False) X_interactions = poly.fit_transform(datapol) # 获取交互项的可读列名 feature_names = poly.get_feature_names_out(datapol.columns) X = pd.DataFrame(X_interactions, columns=feature_names) y = data['flag'] # 添加常数项(statsmodels建模必须) X = sm.add_constant(X) # 定义向后逐步选择函数:以AIC最小化为目标,同时参考p值 def backward_stepwise_logit(X, y): included_features = list(X.columns) best_aic = float('inf') best_feature_set = included_features.copy() while True: # 拟合当前特征集的逻辑回归模型 model = sm.Logit(y, X[included_features]).fit(disp=False) current_aic = model.aic # 更新最佳模型(如果当前AIC更低) if current_aic < best_aic: best_aic = current_aic best_feature_set = included_features.copy() else: # AIC开始上升,说明之前的特征集是最优的,停止迭代 included_features = best_feature_set.copy() break # 排除常数项,获取所有特征的p值 p_values = model.pvalues.drop('const') if len(p_values) == 0: break # 没有可移除的特征了 # 找到p值最高的特征并移除 highest_p_feature = p_values.idxmax() included_features.remove(highest_p_feature) print(f"移除变量: {highest_p_feature}, 当前AIC: {current_aic:.2f}") # 拟合最终最优模型 final_model = sm.Logit(y, X[best_feature_set]).fit(disp=False) print(f"\n最终模型AIC: {final_model.aic:.2f}") print(f"选中的特征: {best_feature_set}") return final_model, best_feature_set # 运行逐步筛选 final_model, selected_features = backward_stepwise_logit(X, y)
代码说明:
- 这个函数会循环拟合模型,每次移除p值最高的特征,同时跟踪AIC变化
- 当移除某个特征后AIC上升时,会停止迭代并保留之前的最优特征集(这和R的
stepAIC核心逻辑一致) - 你可以根据需求调整:比如把停止条件改成p值阈值(比如只保留p<0.05的特征),只要修改函数里的判断逻辑即可
方法二:用mlxtend的SequentialFeatureSelector
如果你更倾向于用现成的封装好的工具,可以试试mlxtend库的SequentialFeatureSelector,它支持向后特征选择,并且可以自定义评分标准(比如AIC):
from mlxtend.feature_selection import SequentialFeatureSelector from sklearn.linear_model import LogisticRegression import numpy as np # 定义以AIC为评分的函数(适配mlxtend的要求) def aic_score(model, X, y): # 借助statsmodels计算逻辑回归的AIC sm_model = sm.Logit(y, sm.add_constant(X)).fit(disp=False) return -sm_model.aic # 因为mlxtend默认最大化评分,所以取负 # 初始化逻辑回归模型 lr = LogisticRegression(max_iter=1000) # 初始化向后选择器 sfs = SequentialFeatureSelector( lr, k_features='best', forward=False, # 设置为向后选择 scoring=aic_score, cv=0 # 不需要交叉验证,用全数据拟合 ) # 运行特征选择 sfs.fit(X_interactions, y) # 获取选中的特征名 selected_feature_indices = sfs.k_feature_idx_ selected_features = [feature_names[i] for i in selected_feature_indices] print(f"选中的特征: {selected_features}")
注意事项:
mlxtend的SFS默认用交叉验证评分,如果你只想用全数据的AIC,记得把cv=0- 这里的AIC计算需要借助statsmodels,因为sklearn的LogisticRegression没有直接输出AIC的方法
这两种方法都能帮你高效完成变量筛选,不用再手动迭代啦!
内容的提问来源于stack exchange,提问作者Edoardo




