如何在scikit-learn的ColumnTransformer中对相同列应用多个变换
问题原因
ColumnTransformer的核心逻辑是并行执行所有注册的转换器,每个转换器的输出结果会横向拼接,因此你给两个转换器分别传入2列的情况下,最终会输出4列结果,不符合「先填充缺失值、再标准化」的串行处理需求。
解决方案
使用Pipeline将多个步骤按执行顺序串成处理流水线,再应用到目标列即可,最终输出列数和输入列数完全一致:
import pandas as pd import numpy as np from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 原始数据 df = pd.DataFrame( { 'x' : range(0,5), 'y' : [1,2,3,np.nan, np.nan] }) # 定义串行处理流水线:先填充缺失值,再做标准化 preprocess_pipeline = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler()) ]) # 将流水线应用到x、y两列 columnPreprocess = ColumnTransformer([ ('preprocess', preprocess_pipeline, ['x', 'y']) ]) # 转换结果为2列数组,符合预期 result = columnPreprocess.fit_transform(df)
如果所有输入列都需要执行完全相同的处理步骤,可以省略ColumnTransformer,直接调用流水线处理:
result = preprocess_pipeline.fit_transform(df[['x','y']])
如果后续需要对不同列组做不同处理(比如类别列做独热编码、数值列做填充+标准化),只需要在ColumnTransformer中给不同列组分配对应处理逻辑的Pipeline即可。
内容的提问来源于stack exchange,提问作者PingPong
相关产品推荐
相关产品推荐

