预处理的 fit / transform 边界
先划分数据,只在训练数据上学习预处理参数,再把同一规则应用到验证、测试和未来数据。
学习前需要掌握
背景与问题
预处理器看起来只是清理或缩放数据,但它也可能从样本中学习状态,例如均值、填补值、类别集合和主成分。只隔离模型的 fit,而在全数据上提前预处理,仍可能发生泄漏。
关键问题不是代码位于“训练”文件还是“测试”文件,而是某一步真正读取了哪些样本来估计参数。
概念定义
fit 建立变换所需的已学状态,transform 应用这些状态;fit_transform 是在同一批拟合数据上组合执行两步。它不是可以对训练与测试都无条件调用的快捷键。
有些纯确定性变换不需要学习统计量,但仍应核对接口和使用的特征是否在预测时可获得,不能把“无需 fit”误解成“不会泄漏”。
直观理解
把预处理看成先制定一把尺子、再拿它测量新样本。每测一批测试数据就重新刻尺,得到的已不是同一套训练规则。
测试值 100 不能把训练均值改掉
构造训练值 [0,2],总体均值为 1、标准差为 1,因此新值 100 应变换为 99。对测试值单独重新 fit,反而会把它居中成 0,看起来“数值更规整”,但变换规则已经改变。
下面代码在 transform 前后都打印训练均值,核对预测数据没有重新定义统计状态。它只演示一个数值列,不声称已经完成任何分类训练。
核心原理
应先确定训练边界,再让填补、缩放、特征选择和模型在该边界内学习。验证、测试与线上输入使用已拟合状态,不重新估计参数。
交叉验证存在多套训练边界:每折训练样本不同,所以应各自拟合预处理。Pipeline 能让这些步骤随估计器一起进入当前训练折,避免先处理全数据再 CV。
标签驱动的特征选择、目标编码和重采样也属于需要审查的步骤,不能因为它们不是最后的分类器就放在折外执行。某些变换还需要额外的折外编码设计。
最终保存应包含完整管线和输入契约。只保存模型、在预测时临时计算新均值,可能既改变模型语义,也使历史评价无法复现。
数学表达
数据边界
θprep 只能由训练数据产生,所有数据分块复用它。
变量含义
θprep预处理器学到的中位数、均值、类别表、主成分等状态。Xsplit训练、验证、测试或线上输入之一。
计算步骤
- 1在查看任何整体统计量前确定划分策略。
- 2保留最终测试集。
- 3只把训练数据传给预处理器 fit。
- 4对所有分块调用 transform。
代码对应位置
示例 1检查 transform 前后的已学均值:固定训练统计量,对新输入应用同一把尺子。
变量解释
| 变量 | 含义 |
|---|---|
θprep | 预处理器学到的中位数、均值、类别表、主成分等状态。 |
Xsplit | 训练、验证、测试或线上输入之一。 |
计算与实现步骤
- 在查看任何整体统计量前确定划分策略。
- 保留最终测试集。
- 只把训练数据传给预处理器 fit。
- 对所有分块调用 transform。
- 交叉验证时使用完整 Pipeline。
- 保存预处理器与模型的完整组合。
代码实现
示例 1
检查 transform 前后的已学均值
example_01.py用途:固定训练统计量,对新输入应用同一把尺子。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit([[0.0], [2.0]])
before = scaler.mean_.copy()
result = scaler.transform([[100.0]])
print(f"mean_before={before[0]:.1f}")
print(f"transformed={result[0, 0]:.1f}")
print(f"mean_after={scaler.mean_[0]:.1f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
固定训练统计量,对新输入应用同一把尺子。
scaler- 保存训练集缩放参数的转换器。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit([[0.0], [2.0]])
before = scaler.mean_.copy()
result = scaler.transform([[100.0]])
print(f"mean_before={before[0]:.1f}")
print(f"transformed={result[0, 0]:.1f}")
print(f"mean_after={scaler.mean_[0]:.1f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
mean_before=1.0 transformed=99.0 mean_after=1.0
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 完整数据 fit_transform 后再划分
- 测试集重新 fit
- 手工处理导致训练与预测规则不一致
实际应用
- 缺失值填补
- 数值缩放
- 类别编码
- PCA 与特征选择
- 交叉验证
常见错误
- 完整数据 fit_transform 后再划分
- 测试集重新 fit
- 手工处理导致训练与预测规则不一致
推荐学习资料
参考库不会生成虚假资源或无效外部链接。