You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动