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
相关产品推荐
相关产品推荐

