如何在pandas DataFrame中展示分类自变量的回归系数
实现方法
核心逻辑
你遇到的问题本质是编码后的分类变量特征名没有对应到原始分类取值,只要拿到编码后的完整特征名列表,再和model.coef_匹配即可实现需求。
具体操作
- 如果你用scikit-learn的
OneHotEncoder做分类编码,调用get_feature_names_out()方法即可直接获取带分类取值的完整特征名 - 如果你用pandas的
get_dummies做编码,编码后DataFrame的columns本身就已经包含分类取值的名称,直接使用即可
完整代码示例
import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 1. 定义特征分类 cat_cols = ['gender'] # 分类特征列 num_cols = ['age', 'salary'] # 数值特征列 # 2. 构造预处理器,注意OneHotEncoder不要设置drop参数,才能生成所有分类取值的特征 preprocessor = ColumnTransformer( transformers=[ ('num', 'passthrough', num_cols), ('cat', OneHotEncoder(), cat_cols) ]) # 3. 预处理数据+训练模型 x_processed = preprocessor.fit_transform(原始特征数据集x) feature_names = preprocessor.get_feature_names_out() # 获取所有特征名,包含分类的每个取值 model = LinearRegression() model.fit(x_processed, 目标变量y) # 4. 生成系数表 coef_df = pd.DataFrame({ 'coef': model.coef_ }, index=feature_names).sort_values(by='coef', ascending=False) # 可选:去掉特征名前面的前缀,直接显示分类取值 coef_df.index = coef_df.index.str.replace(r'.*gender_', '', regex=True)
输出效果
运行后coef_df的展示效果和你要求的完全一致:
| coef | |
|---|---|
| Female | 0.3 |
| Male | 0.2 |
get_dummies编码场景简化代码
如果你是手动用pandas的get_dummies做编码,不需要预处理器,直接用编码后的列名即可:
x_encoded = pd.get_dummies(x, columns=cat_cols) model.fit(x_encoded, y) coef_df = pd.DataFrame(model.coef_, x_encoded.columns, columns=['coef']).sort_values(by='coef', ascending=False)
内容的提问来源于stack exchange,提问作者Sona
相关产品推荐
相关产品推荐

