You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中实现Backward Elimination:编写循环返回回归不显著变量

在Python中实现向后消除法(Backward Elimination)及提取模型p值

一、将OLS模型摘要转换为带变量标签的DataFrame

要提取带变量名的p值,有两种简单可行的方法:

方法1:直接从拟合模型中提取

拟合模型后,直接通过模型对象的属性获取变量名和对应p值,构造DataFrame:

import statsmodels.api as sm
import pandas as pd

# 假设X是自变量数据集,y是因变量
X = sm.add_constant(X)  # 给模型添加截距项
model = sm.OLS(y, X).fit()

# 构造包含变量名和p值的DataFrame
p_value_df = pd.DataFrame({
    '变量名': model.model.exog_names,
    'p值': model.pvalues.values
}).sort_values(by='p值', ascending=False)

print(p_value_df)

方法2:从模型摘要表格中提取

如果需要完整的系数表(包括系数、标准误、t值等),可以直接提取摘要中的表格转换为DataFrame:

# 提取模型摘要的系数表
summary_table = model.summary().tables[1]
# 转换为DataFrame
coefficient_df = pd.DataFrame(
    data=summary_table.data[1:],  # 跳过表头行
    columns=summary_table.data[0]  # 设置列名
)
# 筛选出变量名和p值列
p_value_df = coefficient_df[['Variable', 'P>|t|']].rename(columns={'P>|t|': 'p值'})
print(p_value_df)

二、实现向后消除法的循环代码

下面是一个自定义函数,自动循环剔除p值超过显著性水平的变量,直到所有剩余变量的p值都符合要求:

def backward_elimination(X, y, sig_level=0.05):
    # 先添加截距项
    X = sm.add_constant(X)
    while True:
        # 拟合当前变量集的OLS模型
        model = sm.OLS(y, X).fit()
        # 排除截距项,找到最大的p值
        non_const_pvalues = model.pvalues.drop('const')
        max_p = non_const_pvalues.max()
        
        # 如果最大p值超过阈值,剔除对应变量
        if max_p > sig_level:
            var_to_remove = non_const_pvalues.idxmax()
            X = X.drop(var_to_remove, axis=1)
        else:
            # 所有变量p值都符合要求,终止循环
            break
    return model, X

# 使用示例
# 假设你的数据集是df,target是因变量列
y = df['target']
X = df.drop('target', axis=1)

# 执行向后消除
final_model, final_X = backward_elimination(X, y)
# 查看最终模型结果
print(final_model.summary())

注意事项

  • 分类变量需要先做编码处理(比如one-hot编码),否则OLS模型无法直接处理字符串类型的变量;
  • 可以根据需求调整显著性水平sig_level(默认0.05);
  • 向后消除法可能受多重共线性影响,如果存在高度相关的变量,建议先做共线性检验(比如VIF值)。

内容的提问来源于stack exchange,提问作者Zeta10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:45:37