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
相关产品推荐
相关产品推荐

