数据预处理与泄漏边界
先划分数据,再只用训练集拟合填补、缩放和编码参数。
前置知识
通俗直觉
原始数据进入模型前,常要处理缺失、类别、尺度与异常记录。每一步都可能改变样本或学习统计量,因此预处理是建模流程的一部分,而不是与评价无关的杂务。
错误的处理顺序可能使测试分布提前进入训练,或使训练与线上看到不同的特征定义。模型再复杂也无法修复这种边界错误。
数据预处理把原始输入转换成模型可接收且语义明确的表示。应区分固定规则检查与需要从样本学习的变换;后者的参数必须受训练边界约束。
fit 建立状态,transform 复用状态,构造管线对象本身还没有完成拟合。保存与预测时需要的是同一套已学规则。
像先制定加工规程再处理新材料。训练数据负责建立规程,验证和未来材料沿用它;每批新材料重新制定规程,得到的就不是同一模型输入。
为什么先标准化全数据再切分有问题
构造训练候选值 [0,2] 与未来值 100。只在训练上学均值为 1;若提前把三者一起计算,均值变为 34,训练样本的表示已经受未来分布影响。
下方管线代码展示如何组装填补、缩放与分类步骤;实际 fit 时必须提供当前训练数据,不能把“创建了对象”当成已经完成训练或通过验证。
核心原理
先确定划分单位与预测时点,再学习填补、缩放、编码和选择参数。数据清理规则若依赖全体分布或标签,也要审查是否不当使用验证或测试信息。
不同列需要不同语义:数值缺失、无序类别和周期时间,不能用同一种随意的数字替换处理。输出列名、单位、dtype 与未知值策略应成为输入契约。
交叉验证时,每个训练折都有独立边界。把完整 Pipeline 传给评价工具,比先对全数据 fit_transform 后再 CV 更能保持统计过程一致。
预处理不能代替数据审计。异常点可能是单位错误,也可能是合法少数样本;缺失模式变化可能提示采集问题,而不是简单再填一次值就足够。
数学公式
均值和标准差必须只来自当前训练数据。
工作流程
- 明确输入、输出与评价方式
- 建立简单基线
- 实现并检查关键中间量
- 在验证数据上诊断和迭代
代码示例
Python
example.pyfrom sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
model = make_pipeline(
SimpleImputer(strategy="median"),
StandardScaler(),
LogisticRegression(),
)- 先检查数据和张量形状
- 把会学习参数的步骤限制在训练数据内
Pipeline 把缺失值填补、标准化和模型绑成一个整体,降低交叉验证时的数据泄漏风险。
应用场景
- 缺失值处理
- 特征缩放
- 可靠交叉验证
常见误区
- 先对全数据标准化再划分
- 验证和测试阶段重新拟合预处理器
推荐学习资料
scikit-learn Examples
按算法和应用组织可运行示例,展示预处理、训练、评估与可视化流程。
scikit-learn Contributors · scikit-learn
资料笔记
scikit-learn/scikit-learn
经典机器学习算法、模型选择、预处理和评估工具的核心实现仓库。
scikit-learn Contributors · GitHub
仓库信息
研究 scikit-learn 实现和贡献流程
主要语言:Python / Cython包含数据集或实验需要额外环境