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

Sklearn Pipeline多特征选择步骤下如何获取原始特征的选中名称/索引

解决Sklearn Pipeline多步特征选择后匹配原始特征的问题

核心思路

要匹配原始特征,需要把每一步特征选择的结果逐层映射回去:先找到第一步过滤后保留的原始特征索引,再用第二步的选择结果在这个子集里筛选,最终得到原始特征中被两步都保留的部分。

具体实现步骤

  1. 从训练好的Pipeline中提取每一步的特征选择器
  2. 分别获取两步选择器的支持数组(标记哪些特征被保留)
  3. 逐层映射,计算原始特征中最终被选中的索引/名称

完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:15:33