🔍 问题分析
当 ColumnTransformer
使用 remainder='passthrough'
时,未指定处理的列(如 target
)会被直接传递,但它的列名会自动加上 remainder__
前缀,例如:
['num__age', 'num__income', 'cat__education_Bachelor', 'cat__education_Master', 'cat__education_PhD', 'remainder__target']
目标:
✅ 让 target
通过 ColumnTransformer
,但保持原始列名(即 target
,而不是 remainder__target
)。
✅ 解决方案
方法 1️⃣:使用 remainder='passthrough'
后手动重命名
if hasattr(self.pipeline.named_steps['preprocessor'], 'get_feature_names_out'):
self.feature_names = self.pipeline.named_steps['preprocessor'].get_feature_names_out()
# 移除 "remainder__" 前缀
self.feature_names = [name.replace("remainder__", "") for name in self.feature_names]
print("3self.feature_names: ", self.feature_names)
🔹 原理:
get_feature_names_out()
返回的是所有列(包括remainder__target
)。- 通过
.replace("remainder__", "")
,去掉remainder__
前缀。
🎯 适用情况:
- 适用于
remainder='passthrough'
时,保持target
原名。
方法 2️⃣:使用 remainder
并指定 feature_names_out
如果你在 sklearn 1.3+
,可以指定 feature_names_out="one-to-one"
,这样 remainder
传递的列不会添加 remainder__
前缀:
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, ['age', 'income']),
('cat', categorical_transformer, ['education'])
],
remainder='passthrough',
verbose_feature_names_out=False # 关键参数,保持原始列名
)
🔹 原理:
verbose_feature_names_out=False
保持原始列名,不会加num__
、cat__
或remainder__
。
🎯 适用情况:
- 适用于
sklearn 1.3+
(如果你使用的是较早版本,方法 1 更兼容)。
📌 结论
方法 | 适用情况 | 结果 |
---|---|---|
方法 1: replace("remainder__", "") | 适用于所有 sklearn 版本 | target 变回原名 |
方法 2: verbose_feature_names_out=False | 适用于 sklearn 1.3+ | 直接保持 target 名字 |
如果你使用的 sklearn
版本较低(<1.3),推荐方法 1。
如果你使用的 sklearn
版本较新,推荐方法 2,更优雅。 🚀