sklearn0.24.2 Pipeline中对指定列应用OneHotEncoding无需ColumnTransformer的方案
解决方案
sklearn 0.24.2 没有内置无需依赖 ColumnTransformer 即可对指定列单独编码的原生转换器,你可以通过自定义符合 sklearn API 规范的转换器实现需求,完全不需要引入 ColumnTransformer,写法也足够简洁:
首先实现通用的指定列编码器:
from sklearn.base import BaseEstimator, TransformerMixin from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder import pandas as pd class ColumnSpecificEncoder(BaseEstimator, TransformerMixin): def __init__(self, encode_cols, encoder=OneHotEncoder(handle_unknown="ignore", sparse_output=False)): self.encode_cols = encode_cols self.encoder = encoder self.remain_cols = None def fit(self, X, y=None): self.encoder.fit(X[self.encode_cols]) self.remain_cols = [col for col in X.columns if col not in self.encode_cols] return self def transform(self, X): encoded_arr = self.encoder.transform(X[self.encode_cols]) encoded_df = pd.DataFrame( encoded_arr, columns=self.encoder.get_feature_names_out(self.encode_cols), index=X.index ) if self.remain_cols: return pd.concat([encoded_df, X[self.remain_cols]], axis=1) return encoded_df
直接将自定义转换器放入 Pipeline 即可,支持一键切换独热编码和序数编码:
from sklearn.pipeline import Pipeline from sklearn.tree import DecisionTreeRegressor # 定义需要编码的分类特征列 cate_cols = ["你的分类列1", "你的分类列2"] # 独热编码版本Pipeline dt_reg_ohe = Pipeline([ ("cate_encoder", ColumnSpecificEncoder(encode_cols=cate_cols)), ("DT_reg", DecisionTreeRegressor()) ]) # 序数编码版本Pipeline dt_reg_ordinal = Pipeline([ ("cate_encoder", ColumnSpecificEncoder( encode_cols=cate_cols, encoder=OrdinalEncoder(handle_unknown="use_encoded_value", unknown_value=-1) )), ("DT_reg", DecisionTreeRegressor()) ])
注意事项
- 如果你的输入是 numpy 数组而非 pandas DataFrame,把代码里的列名操作替换为对应列索引即可,逻辑完全一致
- 自定义转换器完全符合 sklearn API 规范,支持交叉验证、网格搜索等所有 Pipeline 配套功能,和 ColumnTransformer 实现的效果完全一致
- 如果追求更极简的写法,也可以用
FunctionTransformer封装列编码逻辑,不过自定义类的可读性和可维护性更高,更适合多版本模型对比的场景
内容的提问来源于stack exchange,提问作者haneulkim
相关产品推荐
相关产品推荐

