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

Scikit-learn ColumnTransformer独热编码后丢失特征名如何解决

解决方法
  • 首先修正ColumnTransformer的传参:你当前代码传入的是分类特征的完整DataFrame,该参数正确格式应为分类特征的列名列表:
# 取分类特征列名,而非完整DataFrame
cat_features = X.select_dtypes(include='object').columns.tolist()

# 实例化转换器,sparse_output=False设置输出为稠密矩阵,方便后续转DataFrame
# 添加verbose_feature_names_out=False可去掉列名前的转换器前缀
enc = ColumnTransformer(
    [('one_hot_encoder', OneHotEncoder(sparse_output=False), cat_features)],
    remainder='passthrough',
    verbose_feature_names_out=False
)

X_transformed = enc.fit_transform(X)
  • 获取变换后的完整特征名:scikit-learn 1.0及以上版本,ColumnTransformer内置get_feature_names_out()方法,可直接返回所有变换后的列名,包含独热编码生成的新列和透传的数值列:
# 获取完整列名列表
all_feature_names = enc.get_feature_names_out()

# 如需转成带列名的Pandas DataFrame,直接传入columns参数即可
X_transformed_df = pd.DataFrame(X_transformed, columns=all_feature_names)
  • Pipeline集成适配:如果将该转换器集成到Pipeline中,只要Pipeline中所有算子都是scikit-learn官方内置、支持get_feature_names_out()方法的实现,训练完成后直接调用pipeline.get_feature_names_out()即可获取最终输出的所有特征名。
  • 旧版本scikit-learn(1.0以下)兼容方案:
# 手动拼接列名
ohe = enc.named_transformers_['one_hot_encoder']
# 生成独热编码后的分类特征名
ohe_feature_names = ohe.get_feature_names_out(cat_features)
# 获取透传的数值特征名
num_feature_names = X.drop(cat_features, axis=1).columns.tolist()
# 合并得到完整列名
all_feature_names = ohe_feature_names.tolist() + num_feature_names

内容的提问来源于stack exchange,提问作者Miku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:00:02