预处理后经SelectKBest特征选择,如何获取选中特征名称?
获取SelectKBest选中的特征名称问题
我查阅了相关Stack Overflow帖子但未找到解决方案,我的数据转换流程如下:
cat_transformer = Pipeline(steps=[("encoder", TargetEncoder())]) num_transformer = Pipeline( steps=[ ("scaler", MinMaxScaler()), ("poly", PolynomialFeatures(2, interaction_only=True)), ] ) transformer = ColumnTransformer( transformers=[ ("cat", cat_transformer, cat_features), ("num", num_transformer, num_features), ], verbose_feature_names_out=False, ) logit = LogisticRegression model = Pipeline( steps=[ ("preprocessor", transformer), ("feature_selection", SelectKBest(k=20)), ("logit", logit), ] ) model.fit(X_train, y_train) y_pred = model.predict(X_test)
我想要获取被选中的20个特征名称,尝试过以下方法但都没得到正确结果:
- 执行
model["feature_selection"].get_feature_names_out(),得到的是"x1"、"x2"这类无意义的名称 - 执行
model['preprocessor'].get_feature_names_out(),未成功 - 执行
model['feature_selection'].get_support()得到布尔数组,但不知道每个位置对应的特征名称 - 尝试
transformer['num']这类操作,因是ColumnTransformer无法生效
请问该如何获取模型选中的特征名称?
解决方案
要获取选中的特征名称,需要先拿到预处理后所有特征的完整名称列表,再结合get_support()的布尔索引筛选出被选中的特征:
- 获取预处理阶段生成的全部特征名称:
all_feature_names = model['preprocessor'].get_feature_names_out()
- 结合选中掩码筛选目标特征名称:
selected_mask = model['feature_selection'].get_support() selected_feature_names = all_feature_names[selected_mask]
此时selected_feature_names即为你需要的20个被选中的特征名称。
注意点:
- 你已设置
verbose_feature_names_out=False,所以生成的特征名称会更直观:类别特征保留原名,数值特征的交互项会以原特征名1 原特征名2的格式呈现 - 如果执行
model['preprocessor'].get_feature_names_out()报错,大概率是scikit-learn版本过低,建议升级到0.24及以上版本(该版本开始ColumnTransformer正式支持get_feature_names_out()方法)
内容的提问来源于stack exchange,提问作者dsbr__0
相关产品推荐
相关产品推荐

