数据泄漏:分数太完美时
train 和 val 共享场景、相邻帧或 duplicate 图像时,指标会虚高——怀疑 99% accuracy 先查 split 策略和 near-duplicate。

1. val 98%,上线崩
验证集 mAP 98%,上线新场景 40%——后来发现 test 与 train 共享同一批 video 的不同帧,模型背「场景 ID」而非泛化。分数太完美时我先查切分,不是庆祝。Leakage 比 bug 更隐蔽:代码能跑、loss 能降、metric 虚高,直到部署才暴露。
2. 常见泄漏模式
同 scene/video 不同帧进 train/val:相邻帧几乎相同,val 是 train 的插值。同 patient/session/device 跨 split:医学、工业相机常见。全局统计含 test:用全量 data 算 mean/std 做 normalization。增广 duplicate 跨 split:同图 rotate 后进 train 和 val。autolabel 循环:用 train 模型标 val,再 eval 同一 pipeline。时间泄漏:用未来数据 predict 过去(时序 forecast)。
3. 正确 split 策略
按 group split:video_id、scene_id、patient_id、session_id 为 unit,整组进 train 或 val。PyTorch:
from sklearn.model_selection import GroupShuffleSplit
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
train_idx, val_idx = next(gss.split(X, y, groups=video_ids))near-duplicate 检测: perceptual hash 或 embedding 距离,duplicate 簇不跨 split。时间序列按时间 cut,留 recent 作 val 模拟 deploy。
4. 预处理与 label 泄漏
normalization stats 只从 train 算,val/test apply train stats。feature engineering 若用全局统计(TF-IDF、PCA on full data)同样泄漏——fit on train only。K-fold 时每 fold 独立 fit preprocessor。
autolabel:val label 若来自 model A,eval model A 或 student of A 会 circular。human label 的 val 应独立来源或至少不同 model generation。
5. 怀疑 leakage 的信号
train 和 val metric 都极高且接近(>95% acc 小数据)。val 比公开 benchmark SOTA 高不合理幅度。换 random split seed metric 剧烈波动。上线/domain shift 后暴跌而 offline 「稳定」。
6. 案例:视频帧泄漏
某视频检测 val mAP ninety-plus,换 group split 后降到 sixty——相邻帧泄漏。改按 video_id split 后 offline 与 pilot 对齐。group key 必须在 split 文档里写死。
7. 验收
- split 按 group/unit,非 random 逐样本(当 group 存在时)。
- normalization 和 preprocessor fit 只用 train。
- near-duplicate 审计,跨 split duplicate 为 0。
- test set 未参与任何调参和 early stop。
- 文档记录 split 键(video_id 等)和比例。
8. 落地与衔接
数据集入库强制声明分组键,切分脚本只接受按组 shuffle。归一化与降维等预处理器只在训练集拟合,验证与测试只变换——持续集成用假数据断言无全量拟合。近重复审计脚本跑感知哈希,跨切分重复为零才允许开训。测试集路径只读挂载,早停与超参搜索无权读取。切分比例与随机种子写进数据版本清单,与模型检查点同引用。新数据集合并前必须附切分审计报告。
9. 案例复盘
某视频检测验证平均精度九十以上,试点四十——相邻帧随机切分泄漏。改按视频编号分组切分后离线降到六十但与试点对齐。复盘把分组键写进数据模式必填项,并加重复审计任务。此后九十以上的离线分数会先触发泄漏怀疑流程,而不是直接庆祝。早停与校准也须建立在诚实验证集上才有意义。该怀疑流程已纳入数据平台默认流水线。
10. 与早停、对比实验的衔接
诚实验证集是 dl-early-stopping 与 dl-ab-test-models 的共同前提:切分键错误或近重复未清零时,早停选轮与离线涨点均不可信。数据版本清单应被训练、早停、校准脚本只读引用同一哈希,切分变更时 bump 版本并阻断旧版本开训。业务方看到的指标卡片须标注分组键与测试集是否参与调参,避免把泄漏验证分数当作上线承诺。
数据泄漏让一切 offline metric 失去预测力。99% 先查 split;group split、train-only stats、duplicate 审计是最低契约。honest val 是后续 early stop、A/B、calibration 的前提。把 split 键与 duplicate 审计结果贴进 PR;业务方看到的离线指标须注明切分键与测试集是否参与调参。切分或预处理变更时 bump 数据版本并重跑审计,审计未通过不得进入训练队列。新数据源接入默认走分组切分与近重复审计流水线,把防护前置到入库环节。
相关
也可以看看
- ·4 分钟阅读
早停:盯验证集
Early stopping 防过拟合,但没有独立验证集或 val 泄漏时,早停只是在随机时刻停——split 诚实比 patience 数值更重要。
- ·16 分钟阅读
KV cache 分页与前缀复用:吞吐上去后正确性怎么验
沿 block table、前缀哈希与抢占回收拆开缓存一致性风险,说明错页复用为何表现为「偶发胡话」;用确定性前缀集、强制抢占和逐 token 对照验收。
- ·18 分钟阅读
混合精度下的梯度累积:loss 缩放、裁剪与 step 顺序
沿 autocast、GradScaler、unscale_、裁剪与 optimizer.step 的数据流说明静默错误;区分 micro-batch 平均与求和,并用等价性测试验收。
johan's blog