Math-09.特征预处理与变换-10.Pipeline与泄漏防范

本页讲解 Pipeline预处理泄漏防范——把 02–06 的变换正确嵌入 ML 流程。

段末注释数据泄漏(data leakage)指验证/测试信息在训练阶段被间接使用,导致泛化评估过于乐观;预处理若用全数据统计量即构成泄漏。

系列入口00.系列规划 | 前置:Math-08/06 交叉验证


1. 泄漏从哪来(D1–D2)

图 1 错误 vs 正确流程

错误 正确
全数据 fit(scaler) 再 CV 每 fold:scaler.fit(X_train)
全数据选 $\lambda$(Box-Cox) train 估 $\lambda$
Target Encoding 用全表均值 fold 内 train 统计
特征选择看全数据 p 值 选择嵌在 Pipeline 内

Math-08/01 的泛化 gap 会因泄漏而虚假缩小。


2. Pipeline 结构(D3)

图 2 Pipeline + CV

1
2
3
4
Pipeline([
("preprocess", ColumnTransformer([...])),
("model", LogisticRegression()),
])

cross_val_score(pipe, X, y, cv=5) 会在每个 fold 内重新 fit 预处理 + 模型。

ColumnTransformer:数值列 Standard、类别列 One-Hot 并行。


3. 嵌套 CV(D6)

外层 内层 用途
5-fold 报告性能
5-fold 3-fold 调超参 + 无偏评估

调参对象应是 整个 Pipeline(含 Calpha、PCA 维数)。


4. 跨领域实践(D7)

图 3 Pipeline 场景

领域 Pipeline 要点
表格竞赛 Imputer → Encoder → Scaler → GBDT
医疗 ML 严格时间切分 + 滚动 fit
NLP 传统 TF-IDF fit on train only
组学 log 变换可固定;quantile norm 仅 train
金融回测 按时间 Pipeline,禁 shuffle CV
AutoML 搜索空间含预处理步骤
MLOps 保存完整 Pipeline 工件(joblib)

5. 局限(D8)

图 4 Pipeline 陷阱

陷阱 说明
手工预处理再 CV 最易泄漏
transform 新数据忘用同一 pipe 训练/服务不一致
深度端到端 BN 统计量仍分 train/eval
超大 Pipeline 搜索 间接过拟合 val

6. 完整示例(D12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
import numpy as np

X_num = np.random.randn(100, 3)
X_cat = np.random.choice(["A", "B"], 100).reshape(-1, 1)
X = np.hstack([X_num, X_cat])
y = np.random.randn(100)

pre = ColumnTransformer([
("num", Pipeline([
("imp", SimpleImputer()),
("sc", StandardScaler()),
]), [0, 1, 2]),
("cat", OneHotEncoder(handle_unknown="ignore"), [3]),
])
pipe = Pipeline([("pre", pre), ("model", Ridge())])
print(cross_val_score(pipe, X, y, cv=5, scoring="r2").mean())

7. 小结

一条 Pipeline 走到底是防泄漏的最简工程纪律。下一篇:20 领域特化预处理

系列导航06 PCA | Math-08/10 调参

-------------本文结束感谢您的阅读-------------