跳到主要内容

数据划分与泄漏

数据泄漏是:训练、特征构造、模型选择或评估接触了在目标使用时不应可得的信息,使测试结果过度乐观。它不是单纯“训练准确率太高”,也不等于所有强相关 feature 都不合法。

先定义信息边界

对每个预测,至少写清:

unit 预测对象是谁/是什么
prediction_time 在何时必须给出预测
horizon 预测多远之后的结果
available_info 当时真实可用且允许使用的信息
label_time 标签何时发生、何时成熟、是否会修订
split_key 哪些实体/群体/时间不能跨集合

合法性应相对于部署信息集 I(t)\mathcal{I}(t) 判断。字段在数据库中存在,不代表它在预测时点 tt 已生成,也不代表政策允许模型使用。

泄漏类型

类型示例为什么测试失真处理
target/post-outcome用出院后账单预测入院时风险字段由目标之后事件产生按预测时点删字段并审计 lineage
temporal随机切分时间序列、使用未来修订值训练看到未来制度或数据forward/rolling split,保留 vintage
entity/group同一患者、用户、设备出现在两侧身份或重复历史可被记忆Group split,必要时按实体+时间
duplicate/near-duplicate同一图片裁剪、文档模板跨集合test 不再是独立新例split 前建立 duplicate group
preprocessing在全数据拟合 scaler、imputer、PCA、feature selectiontest 分布影响了变换每个训练折内 fit,其他折只 transform
model-selection反复根据 test 改模型/阈值test 成为隐式 validation锁定 test 或获取新 holdout
benchmark contamination训练语料含测试题及答案测到复现而非泛化provenance、去重、时间/来源隔离

不是所有 proxy 都叫泄漏。 如果 proxy 在部署时合法可得,它可能是捷径、偏见或脆弱相关,但不一定违反时间边界。此时应做 subgroup、干预和 shift 测试,而不是只换术语。

划分应模拟未来使用

部署问题首选切分不能回答的内容
同分布的新独立样本stratified random时间变化、同实体记忆
新患者/用户/设备group split未来政策变化
未来时段temporal forward split新机构/地区
新机构/地区external/group holdout所有未来变化
空间邻近数据blocked spatial split未观测区域的任意外推

Stratification 只保持标签比例,不会自动阻止同一实体、时间邻近或重复样本跨集合。

Pipeline 不变量

设训练索引为 ItrI_{tr}、验证索引为 IvaI_{va}。任何从数据学习参数的变换 TηT_{\eta} 都应满足

η^=fit(T,DItr),Xva=Tη^(XIva).\hat{\eta}=\operatorname{fit}(T,D_{I_{tr}}), \qquad X_{va}'=T_{\hat{\eta}}(X_{I_{va}}).

这包括均值/方差、词表、缺失值、降维、特征选择、target encoding、过采样和 learned augmentation。Cross-validation 中每个 fold 都要重新 fit。若用外层评估泛化、内层选择超参数,则是 nested CV;先在全数据选特征再做 CV 仍然泄漏。

示例:30 天再入院风险

目标是在患者出院时预测 30 天内是否再入院。

错误方案:

  • 每次就诊随机分行,导致同一患者进入 train/test;
  • 使用 30 天窗口结束后才完整的账单状态;
  • 全数据计算诊断代码频率并筛选 feature;
  • 根据 test AUC 反复调整窗口和阈值。

较可信方案:

  1. 冻结预测时点与允许字段清单;
  2. 先按患者分组,再按时间把较晚 cohort 留出;
  3. 只用训练 cohort 拟合缺失值、词表和选择器;
  4. validation 选择模型与阈值;
  5. test 只运行一次,并按医院、时间与关键群体报告;
  6. 记录标签成熟期,避免尚未完成 30 天观察的样本被当负例。

若性能大幅下降,不说明新 pipeline “更差”,而可能说明原结果依赖身份记忆或未来信息。

泄漏探针与负对照

  • 时间可用性审计:为每个 feature 记录 event time、ingestion time、revision time;
  • 单特征探针:可疑字段单独训练,异常高分需追 lineage;
  • ID 探针:移除或打乱实体标识及高基数 proxy;
  • 重复审计:hash、相似度与共享来源模板;
  • 标签置乱:完整 pipeline 在置乱标签上仍显著高于随机时,可能有 bug/泄漏;
  • 边界测试:断言同一 group 不跨 split、train 时间早于 test、transformer 未在 test fit;
  • 新鲜 holdout:对已经被反复查看的 benchmark 获取新数据。

标签置乱不能发现所有泄漏,例如直接编码真实标签的 feature 在一起置乱后可能仍保持关系,必须结合 lineage。

泄漏、过拟合与 shift

  • 过拟合:模型拟合训练样本噪声,即使 pipeline 合法也可能发生;
  • 泄漏:开发流程越过信息边界;
  • distribution shift:部署分布与评估分布不同;
  • confounding:关联的因果解释受共同原因扭曲。

四者可同时存在,修复一个不证明其余消失。

发布前检查

prediction_time: explicit
label_horizon_and_maturity: explicit
unit_and_group_key: explicit
split_algorithm_and_seed: versioned
all_learned_transforms_fit_on_train_only: true
test_used_for_selection: false
duplicate_and_overlap_audit: complete
feature_availability_lineage: reviewed
known_residual_risks: listed

本文偏重监督预测与离线数据。在线实验、强化学习、联邦学习和持续学习还有反馈、干预与策略泄漏问题,需要单独设计。