机器学习进阶文档深度页
Pipeline 与 ColumnTransformer
用 Pipeline 固化步骤顺序,用 ColumnTransformer 为不同列类型建立独立处理分支。
学习前需要掌握
背景与问题
真实表格同时含数值、类别与缺失。若训练和预测靠手工脚本分别处理,很容易出现顺序、列空间和统计参数不一致。
概念定义
Pipeline 把一系列 transform 和最终 estimator 组合成一个可 fit/predict 的对象;ColumnTransformer 按列选择不同变换后拼接结果。
直观理解
ColumnTransformer 像分流器,数值走填补+缩放,类别走填补+One-Hot;Pipeline 再把汇合后的特征送入模型。
核心原理
所有有状态步骤都随 Pipeline 在训练折内 fit;保存完整 Pipeline 可同时保存预处理器和分类器。参数搜索用“步骤名__参数名”访问内部配置。
计算与实现步骤
- 1
列出数值和类别列。
- 2
为每类列定义子 Pipeline。
- 3
用 ColumnTransformer 组合。
- 4
与模型组成总 Pipeline。
- 5
在训练数据 fit。
- 6
用 CV 搜索内部参数。
- 7
保存完整对象并验证加载预测。
代码实现
示例 1
混合列完整 Pipeline
混合列完整 Pipeline
scikit-learn
example_01.py用途:实现文档中的数值和类别双分支。
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
numeric_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
])
categorical_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("one_hot", OneHotEncoder(handle_unknown="ignore")),
])
preprocessor = ColumnTransformer([
("numeric", numeric_pipeline, numeric_columns),
("categorical", categorical_pipeline, categorical_columns),
])
model = Pipeline([
("preprocessor", preprocessor),
("classifier", LogisticRegression(max_iter=2000)),
])代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
实现文档中的数值和类别双分支。
model- 组合预处理和估计器的模型对象。
scaler- 保存训练集缩放参数的转换器。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScalerStep 2 · 7–22 行
总 Pipeline 保证训练、验证、测试与保存加载一致。
numeric_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
])
categorical_pipeline = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("one_hot", OneHotEncoder(handle_unknown="ignore")),
])
preprocessor = ColumnTransformer([
("numeric", numeric_pipeline, numeric_columns),
("categorical", categorical_pipeline, categorical_columns),
])
model = Pipeline([
("preprocessor", preprocessor),
("classifier", LogisticRegression(max_iter=2000)),
])代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
fit 后模型可直接接收包含原始列名的 DataFrame,并输出预测。
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 手工对训练和测试分别 get_dummies
- 忘记未知类别
- 只保存分类器不保存预处理
实际应用
- 混合类型表格
- 交叉验证与调参
- 模型保存交付
常见错误
手工对训练和测试分别 get_dummies
忘记未知类别
只保存分类器不保存预处理
文档来源
02|数据预处理与特征工程原始文档
学习资料/learning_tech/02_preprocessing_feature_engineering.md- §12 使用 Pipeline 防止泄漏
- §13 同时处理数值和类别列
推荐学习资料
暂未收录相关资料
参考库不会生成虚假资源或无效外部链接。