如何获取Logistic Regression经特征转换后的原始重要特征名
实现方案
你可以通过ColumnTransformer的内置方法获取转换后的完整特征名称,再将编码拆分的特征映射回原始特征,最后聚合每个原始特征的总重要性即可,具体实现如下:
步骤1:获取转换后的所有特征名称
scikit-learn 0.24+版本的ColumnTransformer支持get_feature_names_out()方法,可以直接输出所有转换后的特征名,包含独热编码拆分的特征、标准化后的特征、以及passthrough保留的原始特征。
# 获取转换后的完整特征名列表 transformed_feature_names = transformerVectoriser.get_feature_names_out()
步骤2:将转换后特征映射到原始特征
拆分每个转换后特征的转换器前缀,提取对应的原始特征名:
import pandas as pd import numpy as np # 构造特征重要性数据表 feature_importance_df = pd.DataFrame({ 'transformed_feature': transformed_feature_names, 'coef': importance, 'abs_coef': np.abs(importance) # 用绝对值衡量重要性,避免正负系数抵消 }) # 提取原始特征名 def get_original_feature(transformed_name): # 拆分转换器前缀和特征部分 _, feature_part = transformed_name.split('__', 1) # 独热编码的特征会追加下划线加取值,拆分后取前面的原始特征名 if transformed_name.startswith('Vector Cat__'): return feature_part.split('_', 1)[0] # 标准化和透传的特征直接返回即可 return feature_part feature_importance_df['original_feature'] = feature_importance_df['transformed_feature'].apply(get_original_feature)
步骤3:聚合计算每个原始特征的总重要性
同一个原始分类特征被独热编码拆分的多个特征的重要性可按需求聚合,常用聚合方式有绝对值求和、取绝对值最大值,这里以求和为例,求和结果代表该原始特征整体对模型的总贡献:
# 按原始特征分组聚合重要性,按贡献从高到低排序 original_feature_importance = feature_importance_df.groupby('original_feature')['abs_coef'].sum().sort_values(ascending=False).reset_index() original_feature_importance.columns = ['original_feature', 'total_importance'] # 输出前20个最重要的原始特征 print(original_feature_importance.head(20)) # 可自定义阈值筛选无用特征用于后续剔除 # 示例:剔除贡献最低的20%特征 threshold = original_feature_importance['total_importance'].quantile(0.2) useless_features = original_feature_importance[original_feature_importance['total_importance'] < threshold]['original_feature'].tolist()
补充说明
- 如果你的scikit-learn版本过低不支持
get_feature_names_out(),可以手动拼接特征名:先调用OneHotEncoder的get_feature_names_out(columns_for_encoding)获取独热编码后的特征名,再拼接columns_for_scaling和剩余的透传特征名即可 - 如果要评估单个独热编码取值的贡献,可以直接查看
feature_importance_df里的单条记录,不需要聚合到原始特征 - 逻辑回归的系数重要性对比需要特征量纲一致,你已经对数值特征做了归一化、独热编码为统一的0/1取值,所以聚合得到的重要性结果具备可比较性
内容的提问来源于stack exchange,提问作者taga
相关产品推荐
相关产品推荐

