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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:21:02