Sklearn Pipeline多特征选择步骤下如何获取原始特征的选中名称/索引
解决Sklearn Pipeline多步特征选择后匹配原始特征的问题
核心思路
要匹配原始特征,需要把每一步特征选择的结果逐层映射回去:先找到第一步过滤后保留的原始特征索引,再用第二步的选择结果在这个子集里筛选,最终得到原始特征中被两步都保留的部分。
具体实现步骤
- 从训练好的Pipeline中提取每一步的特征选择器
- 分别获取两步选择器的支持数组(标记哪些特征被保留)
- 逐层映射,计算原始特征中最终被选中的索引/名称
完整代码示例
import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.feature_selection import SelectKBest, chi2 from sklearn.feature_selection import VarianceThreshold from sklearn.ensemble import GradientBoostingClassifier from sklearn.pipeline import Pipeline from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据,保留特征名称方便后续验证 data = load_breast_cancer() X, y = data.data, data.target feature_names = data.feature_names X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 定义Pipeline model = Pipeline([ ('vt', VarianceThreshold(0.01)), ('kbest', SelectKBest(chi2, k=5)), ('gbc', GradientBoostingClassifier(random_state=0)) ]) model.fit(X_train, y_train) # 提取两步特征选择器 vt = model.named_steps['vt'] kbest = model.named_steps['kbest'] # 第一步:获取VarianceThreshold保留的原始特征索引 vt_selected_indices = np.where(vt.get_support())[0] # 第二步:获取SelectKBest在第一步结果中保留的索引,再映射回原始特征 kbest_selected_in_vt = np.where(kbest.get_support())[0] final_selected_indices = vt_selected_indices[kbest_selected_in_vt] # 获取最终选中的特征名称 final_selected_names = feature_names[final_selected_indices] print("最终选中的原始特征索引:", final_selected_indices) print("最终选中的原始特征名称:", final_selected_names)
关键逻辑说明
vt.get_support()返回针对原始30个特征的布尔数组,用np.where转成索引后,得到第一步保留的14个特征的原始位置。kbest.get_support()返回针对第一步输出的14个特征的布尔数组,转成索引后,得到这14个里被第二步选中的5个的位置。- 用第一步的索引数组去索引第二步的结果,就得到了这5个特征在原始数据中的位置,完美匹配原始特征。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

