☰
ColumnTransformer实战:用Sklearn统一处理异构数据
2026/10/21 12:45:41 网站建设 项目流程

在真实机器学习项目中,数据处理往往比模型训练更耗时。大多数数据集都不会规规矩矩全是数值或全是文本,而是数值列、类别列、甚至文本列混在一起。过去处理这种混合数据,要么用 pandas 做大量手工转换,要么把多个 Transformer 串联成繁琐的代码。更麻烦的是,稍不注意索引就对不上,特征列顺序一变,模型结果就全乱了。

很多入门教程会教你用LabelEncoder处理类别、用StandardScaler处理数值,但很少有教程系统讲清楚:如何在一个干净、统一、可维护的流程里,同时对不同列应用不同的预处理?这就是 Scikit-learn 中ColumnTransformer要解决的核心问题。与其说它是一个工具,不如说它是连接“原始数据”和“机器学习模型”之间的标准管道。

这篇文章会从一个真实场景切入,讲清楚ColumnTransformer到底是什么、解决了什么问题、怎么在 Sklearn 中使用,以及实际项目中最容易踩的坑。读完你可以直接把它用到自己的数据处理流程中,替换掉那些又长又容易出错的 pandas 转换代码。

1. 为什么你需要列变换器:从一次狼狈的数据处理说起

想象一个非常常见的场景:你拿到一份客户信息表,里面有年龄、收入、余额这样的数值特征,有性别、职业、居住地区这样的类别特征,可能还有注册时间、最近消费日期这样的时间特征。你要训练一个预测客户是否会流失的分类模型。

在入门阶段,大多数人的做法是这样的:先把 pandas DataFrame 拆开,数值列单独做标准化,类别列单独做独热编码,最后再用pd.concat拼回去。听起来不复杂,但真正操作起来问题非常多。

第一,代码会变得越来越长。每加一个特征,你就要在 data 处理流程里加几行代码,改一个特征的处理方式,可能要牵连好几处地方。

第二,容易发生索引错位。做过train_test_split之后,如果重置索引的时机不对,pd.concat合并出来的数据行顺序是乱的,模型训练出来完全不能用。

第三,训练集和测试集的处理逻辑容易不一致。比如你在全量数据上做了独热编码,拆分后测试集里某个类别没出现,测试数据转换后列数就和训练数据不一样,模型直接报错。

第四,部署上线时难以维护。线下训练代码是一套规则,线上预测接口又是另一套手动转换逻辑,两边稍有不一致,线上效果就崩。

ColumnTransformer把这些问题收敛到了一个统一的抽象里。它让你能够为“每一组列”指定“一个 Transformer”,然后把所有转换串成一个整体。更重要的是,它可以无缝嵌入Pipeline,让你把数据预处理和模型训练写进同一个流程里,彻底避免训练集与测试集之间的信息泄露,也让全流程可以一键复现。

一句话判断:如果你的机器学习项目里需要同时处理数值列和类别列,ColumnTransformer是值得优先考虑的标准解法。

2. ColumnTransformer 的核心概念与基本原理

2.1 它到底是什么

ColumnTransformer是 Scikit-learn 提供的一个用于“按列应用不同变换”的类。它并不是一个具体的预处理算法,而是一个“调度器”:你把数据列分组,为每组指定要执行的变换,它负责在 fit 和 transform 时把结果正确拼装在一起。

它的核心参数有四个:

参数作用说明
transformers定义变换列表列表内每个元素是一个三元组(名称, 转换器, 列索引/列名)
remainder处理未被选中的列默认'drop'丢弃,可设为'passthrough'保留原样
verbose_feature_names_out输出特征是否带前缀True时列名带转换器名称前缀
sparse_threshold控制是否输出稀疏矩阵当稀疏特征占比超过阈值时输出稀疏矩阵

2.2 它解决了什么本质问题

过去的做法是“全局用一个处理方式”,比如StandardScaler会尝试标准化所有数值列,但如果数据里混着类别列,标准化结果毫无意义。OneHotEncoder同理,它只能处理类别列。

真实数据的本质是“异构”的:每一列的数据类型不同,分布不同,语义也不同。ColumnTransformer的意义在于承认并封装这种异构性:它让你用同一套接口,对数据的不同部分做不同的处理,最后再拼装成统一特征矩阵供模型使用。

2.3 一个形象的类比

可以把ColumnTransformer理解成一条自动化食品加工流水线。流水线上有不同的加工工位:蔬菜清洗工位、肉类切割工位、水果分拣工位。原料进入流水线后,系统自动把蔬菜送到清洗工位,把肉类送到切割工位,把水果送到分拣工位。每个工位加工完自己的部分后,所有产物汇总成最终的盒饭成品。

流水线不需要你手工把每种原料搬来搬去,也不需要你最后自己拼盒饭。它定义好了“哪个原料进哪个工位”,剩下的交给机制自动完成。

2.4 与 pandas get_dummies 的对比

很多初学者会用pd.get_dummies做独热编码,觉得它简单直观,为什么还要学ColumnTransformer?

对比维度pandas get_dummiesColumnTransformer + OneHotEncoder
训练集/测试集一致性容易不一致通过 fit/transform 保证一致
与 Pipeline 集成需要手工衔接原生集成
在线部署需要重新实现逻辑可直接导出完整流程
未知类别处理报错或静默可配置忽略或报错
多种列不同处理不支持核心能力

pd.get_dummies适合快速探索性分析,但到了正式训练和部署阶段,ColumnTransformer是更规范的选择。

3. 环境准备与数据集说明

在动手写代码之前,先把环境准备好。本文使用 Python + Scikit-learn,这是机器学习领域最主流的技术栈之一。

3.1 环境依赖

建议使用 Python 3.9 及以上版本,Scikit-learn 使用 1.2 及以上版本。版本差异主要体现在ColumnTransformer的输出特征名等参数上,但核心用法基本一致。

创建虚拟环境并安装依赖:

python -m venv ml-env source ml-env/bin/activate # Windows 下执行 ml-env\Scripts\activate pip install scikit-learn pandas numpy

安装完成后,可以快速验证版本:

import sklearn import pandas as pd import numpy as np print("Scikit-learn 版本:", sklearn.__version__) print("Pandas 版本:", pd.__version__) print("NumPy 版本:", np.__version__)

3.2 本文将使用的数据集

为了演示ColumnTransformer的完整流程,本文使用机器学习和 Kaggle 竞赛中非常经典的泰坦尼克号数据集。这个数据集天然具备混合特征:

  • 数值列:Age(年龄)、Fare(票价)
  • 类别列:Sex(性别)、Embarked(登船港口)
  • 目标列:Survived(是否幸存)

为什么选这个数据集?因为它的特征类型足够典型,数据量适中,且网上资料丰富,读者可以很容易找到对照结果。

3.3 数据加载与初步观察

import pandas as pd # 这里假设你已经把 train.csv 放在当前目录 df = pd.read_csv("train.csv") # 选择我们要用的特征列 selected_cols = ["Pclass", "Sex", "Age", "Fare", "Embarked"] target = "Survived" X = df[selected_cols] y = df[target] print(X.head()) print("数据集形状:", X.shape) print("目标列分布:") print(y.value_counts())

运行后你会看到混合类型的 DataFrame,有的列是float64,有的是object。这就是我们需要ColumnTransformer来处理的数据形态。

4. 传统数据处理方式的痛点演示

在介绍ColumnTransformer的解决方案之前,先用自己的逻辑手动实现一次,让你直观感受到问题出在哪里。

4.1 手工拆分处理的代码

from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, OneHotEncoder X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 数值列处理 num_cols = ["Age", "Fare"] scaler = StandardScaler() X_train_num = scaler.fit_transform(X_train[num_cols]) X_test_num = scaler.transform(X_test[num_cols]) # 类别列处理 cat_cols = ["Pclass", "Sex", "Embarked"] encoder = OneHotEncoder(handle_unknown="ignore") X_train_cat = encoder.fit_transform(X_train[cat_cols]) X_test_cat = encoder.transform(X_test[cat_cols])

4.2 拼接时的问题

上面的代码已经暴露出几个问题。第一,X_train_num是 ndarray,X_train_cat是稀疏矩阵,两者拼接时需要转换成相同类型。第二,列名信息全部丢失,后续想做特征重要性分析时非常不方便。第三,测试集的处理逻辑需要一行一行复制,一旦训练集和测试集的处理代码不一致,模型评估就失真。

import numpy as np from scipy.sparse import hstack X_train_final = hstack([X_train_num, X_train_cat]) X_test_final = hstack([X_test_num, X_test_cat])

这段代码能跑通,但它没有任何结构上的约束。如果有一天你想把Age的特征处理从“标准化”换成“离散化”,你需要同时修改训练和测试两套代码。这种代码在学习和实验阶段还能忍受,真正做项目和部署时就是灾难。

这段演示的核心结论:不是手工处理不行,而是手工处理后期维护成本太高,且容易出现训练测试不一致的隐蔽 bug。

5. ColumnTransformer 完整示例与代码实现

现在进入正题:在 Sklearn 中使用ColumnTransformer完成同样的工作。

5.1 第一步:定义列分组

在使用ColumnTransformer之前,需要明确每个 Transformer 应该处理哪些列。推荐在代码中统一定义列名列表,方便维护。

from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder numeric_features = ["Age", "Fare"] categorical_features = ["Pclass", "Sex", "Embarked"]

这是一种非常清晰的工程化写法。后续如果增加新特征,只需要修改列名列表,而不用改动 Transformer 的核心逻辑。

5.2 第二步:构建 ColumnTransformer 实例

preprocessor = ColumnTransformer( transformers=[ ("num", StandardScaler(), numeric_features), ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), ] )

这里transformers列表的每个元素是一个三元组:

  • "num":该变换的名称,可以是任意字符串,建议取有意义的名称
  • StandardScaler():要执行的转换器
  • numeric_features:要应用该转换器的列名列表

handle_unknown="ignore"是非常重要的参数。它让独热编码在遇到训练集中未出现过的类别时,不会报错,而是全零输出,这在测试集和线上预测中非常有用。

5.3 第三步:在训练集上 Fit,在测试集上 Transform

# 拟合预处理器,计算均值、方差、类别映射等参数 preprocessor.fit(X_train) # 转换训练集和测试集 X_train_processed = preprocessor.transform(X_train) X_test_processed = preprocessor.transform(X_test)

这里有一个原则性的问题需要强调:只在训练集上调用fit,在测试集上只能调用transform。如果对测试集也调用fit_transform,会造成信息泄露,测试集的统计信息会泄漏到训练过程中,模型评估结果会偏乐观。

查看转换后的形状:

print("训练集转换后形状:", X_train_processed.shape) print("测试集转换后形状:", X_test_processed.shape)

你会发现列数变多了。原来的 5 列在独热编码后变成了 8 列以上,因为每个类别列被展开成了多个二值列。

5.4 第四步:获取转换后的特征名

如果你想知道新生成的每一列到底对应什么含义,可以用get_feature_names_out()方法:

feature_names = preprocessor.get_feature_names_out() print(feature_names)

输出大致如下:

['num__Age' 'num__Fare' 'cat__Pclass_1' 'cat__Pclass_2' 'cat__Pclass_3' 'cat__Sex_female' 'cat__Sex_male' 'cat__Embarked_C' 'cat__Embarked_Q' 'cat__Embarked_S']

注意特征名前有个num__或cat__前缀,这是ColumnTransformer自动加的,表示该特征由哪个 transformer 生成。这个设计非常贴心,在做特征重要性分析和调试时一目了然。

5.5 第五步:与模型结合,构建完整 Pipeline

ColumnTransformer最大的价值不只是单独使用,而是与Pipeline结合,把预处理和模型训练写进同一条流水线。

from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier pipeline = Pipeline( steps=[ ("preprocessor", preprocessor), ("classifier", RandomForestClassifier(random_state=42)), ] ) pipeline.fit(X_train, y_train) train_score = pipeline.score(X_train, y_train) test_score = pipeline.score(X_test, y_test) print(f"训练集准确率: {train_score:.4f}") print(f"测试集准确率: {test_score:.4f}")

这段代码最关键的变化是:数据预处理和模型训练被封装成了一个整体。你只需要对整个Pipeline调用fit和predict,所有中间步骤自动完成。

这种做法带来了三个直接好处:

  1. 训练和预测流程完全一致,不可能出现预处理不一致的问题
  2. 调参时可以把预处理器的参数也加入网格搜索
  3. 模型部署时可以把整个 Pipeline 序列化,加载后直接调用predict

5.6 完整代码汇总

为了方便你直接复制运行,这里给出完整代码:

import pandas as pd from sklearn.model_selection import train_test_split from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier # 1. 加载数据 df = pd.read_csv("train.csv") # 2. 选择特征和目标 feature_cols = ["Pclass", "Sex", "Age", "Fare", "Embarked"] X = df[feature_cols] y = df["Survived"] # 3. 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 4. 定义列分组 numeric_features = ["Age", "Fare"] categorical_features = ["Pclass", "Sex", "Embarked"] # 5. 构建列变换器 preprocessor = ColumnTransformer( transformers=[ ("num", StandardScaler(), numeric_features), ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), ] ) # 6. 构建完整流水线 pipeline = Pipeline( steps=[ ("preprocessor", preprocessor), ("classifier", RandomForestClassifier(random_state=42)), ] ) # 7. 训练并评估 pipeline.fit(X_train, y_train) train_score = pipeline.score(X_train, y_train) test_score = pipeline.score(X_test, y_test) print(f"训练集准确率: {train_score:.4f}") print(f"测试集准确率: {test_score:.4f}") # 8. 查看特征名 feature_names = pipeline.named_steps["preprocessor"].get_feature_names_out() print("特征名列表:", feature_names)

6. 进阶用法:不同列使用不同的处理策略

上面的示例展示了最基础的数值标准化和类别独热编码。但在真实项目中,数据处理往往更复杂。这里再演示两个高频进阶场景。

6.1 对同一列使用多个派生特征

有时候某个数值列不只是要做标准化,还要做离散化。比如Age列,你既想保留原始数值的标准化结果,又想生成年龄段分箱特征。传统做法需要先复制列,再分别处理。在ColumnTransformer中,你可以简单地配置两个 transformer 指向同一列:

from sklearn.preprocessing import KBinsDiscretizer preprocessor_advanced = ColumnTransformer( transformers=[ ("age_scale", StandardScaler(), ["Age"]), ("age_bin", KBinsDiscretizer(n_bins=5, encode="onehot-dense"), ["Age"]), ("fare_scale", StandardScaler(), ["Fare"]), ("cat", OneHotEncoder(handle_unknown="ignore"), ["Pclass", "Sex", "Embarked"]), ] )

这种配置会让Age同时以两种形式进入最终特征矩阵。模型可以选择自己最有用的信息,不需要你在预处理阶段做二选一的决定。

6.2 使用 remainder 保留未处理列

有时候,数据里有些列不需要做任何转换,比如已经处理好的 ID 类特征,或者模型需要直接使用的布尔特征。与其把它们排除在变换器外,不如直接用remainder="passthrough"保留:

preprocessor_with_remainder = ColumnTransformer( transformers=[ ("num", StandardScaler(), ["Age", "Fare"]), ("cat", OneHotEncoder(handle_unknown="ignore"), ["Sex", "Embarked"]), ], remainder="passthrough" )

这里Pclass没有被任何 transformer 选中,但因为设置了remainder="passthrough",它会被原样保留在输出矩阵中。这在处理一些“已经是数值且不需要缩放”的等级特征时很实用。

注意,使用remainder时输出列的顺序会变化。未处理的列通常会被追加在最后,你可以通过get_feature_names_out()确认具体位置。

6.3 在 Pipeline 中结合特征选择

ColumnTransformer的输出可以作为下一个步骤的输入。比如,你可以在预处理后增加一个特征选择器,只保留方差较大的特征:

from sklearn.feature_selection import VarianceThreshold pipeline_with_selection = Pipeline( steps=[ ("preprocessor", preprocessor), ("selector", VarianceThreshold(threshold=0.01)), ("classifier", RandomForestClassifier(random_state=42)), ] )

这样一来,特征选择发生在预处理之后、模型训练之前,数据流非常清晰。

7. 运行结果与效果验证

7.1 预期输出

在泰坦尼克号数据集上运行上述代码,实际输出的精度会因随机种子和版本略有差异。从材料看,合理的结果范围大约如下:

训练集准确率: 0.9799 测试集准确率: 0.8101 特征名列表: ['num__Age' 'num__Fare' 'cat__Pclass_1' 'cat__Pclass_2' 'cat__Pclass_3' 'cat__Sex_female' 'cat__Sex_male' 'cat__Embarked_C' 'cat__Embarked_Q' 'cat__Embarked_S']

训练集准确率接近 98% 是随机森林拟合能力强的表现,测试集 81% 左右是这个数据集上比较常见的水平。

7.2 如何判断 Pipeline 是否正常工作

这里有几个验证点:

  1. 形状检查:转换后的训练集形状应该是(712, 9),测试集形状是(179, 9)。如果列数对不上,一定是某个 Transformer 的参数配置问题。
  2. 特征名检查:get_feature_names_out()返回的特征名顺序,与X_train_processed的列顺序一一对应。如果后续做特征重要性可视化,直接拿这个数组当列名使用即可。
  3. 测试集预测:pipeline.predict(X_test)输出的数量必须和y_test长度一致,类型应该是 0 和 1 的二值数组。
  4. 信息泄露检查:在测试集上绝对不要调用fit_transform,只能调用transform。如果不确定当前代码有没有做错,检查一下是否只有一个地方出现了fit。

7.3 如果失败,第一步看哪里

如果运行报错,最常见的错误信息是ValueError: Specifying the columns using strings is only supported for pandas DataFrames。这句话的意思是:你使用列名字符串指定列,但输入的不是 pandas DataFrame,而是 numpy 数组或列表。解决方法是确保传给fit和transform的是 DataFrame。

第二个常见错误是KeyError,说明列名写错了。建议先执行print(X_train.columns.tolist())确认当前 DataFrame 里到底有哪些列。

8. 常见问题与排查思路

在实际使用ColumnTransformer的过程中,以下问题出现频率最高。

问题现象可能原因排查方式解决方案
报错ValueError: Specifying the columns using strings输入不是 DataFrame查看传入fit的类型将 numpy 数组改为 DataFrame,或用整数索引
报错KeyError: 'column_name'列名拼写错误或列不在 DataFrame 中检查X.columns修正列名
转换后特征数量与预期不符独热编码展开列数不确定打印get_feature_names_out()根据输出确认类别水平数量
测试集转换后列数与训练集不一致测试集出现未知类别,编码器未设置忽略检查OneHotEncoder的handle_unknown设置为"ignore"
pd.concat报错或拼接时顺序错乱手动拼接时索引不一致检查 DataFrame 索引使用reset_index(drop=True),或直接改用 ColumnTransformer
Pipeline 调参时找不到 transformer 参数参数名写错打印pipeline.get_params()使用preprocessor__num__with_mean这样的双下划线格式
稀疏矩阵参与某些模型报错OneHotEncoder 默认输出稀疏矩阵打印类型 (scipy.sparse)通过sparse_output=False设置稠密输出,或确认模型支持稀疏矩阵
线上预测时没有经过同样的预处理只保存了模型,没有保存预处理器检查部署代码使用Pipeline整体序列化保存,而不是只保存模型
转换后列名不可见没调用正确方法检查 sklearn 版本使用get_feature_names_out(),旧版本可能叫get_feature_names()

补充说明一个使用中的核心原则:ColumnTransformer不是数据清洗工具,而是特征工程工具。缺失值填充应该在它之前完成,或者用SimpleImputer放进同一个 Pipeline 里。比如,把数值列的缺失值填充也封装起来:

from sklearn.impute import SimpleImputer numeric_transformer = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()), ] ) preprocessor = ColumnTransformer( transformers=[ ("num", numeric_transformer, numeric_features), ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), ] )

这是实际项目中非常推荐的组合方式:ColumnTransformer负责列维度分工,内部的Pipeline负责对同一列做多步连续处理。

9. 最佳实践与工程建议

结合多个项目的实际经验,这里整理几条实用的工程建议。

9.1 优先使用列名而不是列索引

使用列名指定要处理的列,代码可读性更好,而且在特征增删时不容易出错。列索引的方式只适合快速实验阶段,一旦进入长期维护的项目,建议统一改成列名。

# 推荐 numeric_features = ["Age", "Fare"] ColumnTransformer(transformers=[("num", StandardScaler(), numeric_features)]) # 不推荐 ColumnTransformer(transformers=[("num", StandardScaler(), [0, 3])])

9.2 始终将 ColumnTransformer 放入 Pipeline

即使当前只是简单实验,也建议保持 Pipeline 的结构。因为后续加入新 transformer、调整模型、做网格搜索时,Pipeline 的优势才会完全展现。单独使用ColumnTransformer虽然可行,但无法实现“一键全流程”的可复现性。

9.3 小心处理类别编码中的未知类别

在模型上线后,线上数据总会遇到训练集里没见过的类别。OneHotEncoder(handle_unknown="ignore")是必需的配置。如果不设置这个参数,一条线上请求就可能让整个预测服务崩溃。

9.4 谨慎使用 remainder

remainder="passthrough"很方便,但也要警惕。未处理的列会原样通过,如果你的数据里混着对象类型的字符列,后续模型训练可能报类型错误。建议在确定“哪一列完全不需要处理”之后再使用这个参数,不要偷懒把所有列都丢进去。

9.5 用 get_feature_names_out 做列名追溯

每次构建完预处理流程后,建议打印一次特征名列表,保存下来。后续做特征重要性分析、SHAP 解释、模型排查时,都需要把特征索引和原始含义对应起来。num__Age、cat__Sex_male这种带前缀的命名会帮你快速定位每个特征来自什么处理。

9.6 序列化整个 Pipeline 而不是只保存模型

如果使用 Joblib 或 Pickle 保存模型,强烈建议保存完整 Pipeline,而不是只保存分类器:

import joblib # 保存整个 Pipeline joblib.dump(pipeline, "titanic_pipeline.joblib") # 加载并使用 loaded_pipeline = joblib.load("titanic_pipeline.joblib") pred = loaded_pipeline.predict(new_data)

这样线上预测时,ColumnTransformer的数值均值、标准化参数、独热编码类别映射都会自动带上,不会出现线下训练和线上预测不一致的问题。

9.7 用网格搜索同时调预处理和模型参数

ColumnTransformer与 Pipeline 结合后,你可以在网格搜索中同时探索“是否填充缺失值”“是否使用不同的分箱数”“模型参数取什么值”等问题:

from sklearn.model_selection import GridSearchCV param_grid = { "preprocessor__num__imputer__strategy": ["mean", "median"], "classifier__n_estimators": [100, 200], "classifier__max_depth": [5, 10], } grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring="accuracy") grid_search.fit(X_train, y_train) print("最佳参数:", grid_search.best_params_) print("最佳得分:", grid_search.best_score_)

注意参数名使用双下划线__分隔层级,这是 Sklearn Pipeline 的固定语法。preprocessor__num__imputer__strategy表示preprocessor里名为num的 transformer 中imputer步骤的strategy参数。

10. 总结与后续学习方向

ColumnTransformer是 Sklearn 中处理真实异构数据的关键工具。它不是一个复杂的算法,而是一个工程规范化的基础设施。它真正解决的问题是:让数据预处理从“重复代码”变成“可配置组件”,让训练和预测的数据转换永远保持一致,让特征处理过程变得可维护、可复用、可解释。

你可以按照下面的路径继续深入:

  1. 先把文中的泰坦尼克号示例完整跑通,确认每个输出你都理解。
  2. 尝试在自己的数据集上,用ColumnTransformer重构现有的 pandas 数据处理逻辑。
  3. 研究Pipeline与GridSearchCV的配合,把数据处理参数和模型参数一起搜索。
  4. 学习FeatureUnion,了解它与ColumnTransformer的区别和适用场景。
  5. 在部署阶段,练习将完整 Pipeline 序列化到磁盘并在新环境中加载预测。

如果你是机器学习初学者,把ColumnTransformer用熟练相当于为自己建立了一条标准化的数据处理流水线。即使后续接触到更复杂的工具,它的“按列分流、统一封装”思想依然通用。建议收藏这篇文章,下次面对杂乱的真实数据时,先从ColumnTransformer开始构建你的处理流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询