独热编码之后,如何保持列名不变?

🔍 问题分析

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,更优雅。 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值