数据泄露与外部数据利用
一、数据泄露概述
1.1 什么是数据泄露
| 维度 |
说明 |
| 定义 |
模型在训练时获取了不该获取的信息,导致验证/CV分数虚高,但实际泛化差 |
| 本质 |
训练数据中包含了与标签直接相关但在推理时不可用的信息 |
| 危害 |
CV分数高但LB分数低,shake-up严重,甚至被取消成绩 |
| 双面性 |
合理利用泄露是竞赛技巧,过度依赖泄露是风险 |
1.2 数据泄露分类
| 类型 |
说明 |
严重程度 |
| 目标泄露 |
特征中直接包含标签信息 |
致命(必须处理) |
| 时间泄露 |
用未来数据训练 |
严重(时序赛必查) |
| ID泄露 |
ID与标签相关 |
中等(看情况) |
| 测试集泄露 |
训练集和测试集有重叠 |
严重(可利用) |
| 元数据泄露 |
文件属性/时间戳等泄露信息 |
中等 |
二、目标泄露
2.1 常见目标泄露场景
| 场景 |
泄露方式 |
识别方法 |
| 统计特征 |
用全量数据计算均值/分位数,包含测试集信息 |
只用训练集计算统计量 |
| 编码泄露 |
LabelEncoder在全量数据上fit |
只在训练集上fit |
| 归一化泄露 |
用全量数据计算mean/std |
只用训练集计算 |
| 特征选择泄露 |
在全量数据上做特征选择 |
只在训练集上选择 |
| 交叉验证泄露 |
预处理在CV之外做 |
在CV循环内做预处理 |
2.2 目标泄露检测方法
| 方法 |
说明 |
| 特征重要性异常 |
某个特征重要性远超其他,检查是否泄露 |
| 单特征AUC |
单个特征的AUC>0.9,几乎确定泄露 |
| 删除验证 |
删除可疑特征后CV下降剧烈,可能泄露 |
| 随机标签测试 |
用随机标签训练,如果还能学到东西则泄露 |
2.3 防止目标泄露的Pipeline
1. 划分训练集/验证集
2. 在训练集上fit所有转换器(Scaler/Encoder/Imputer)
3. 用fit好的转换器transform验证集
4. 在训练集上做特征选择
5. 用选出的特征训练模型
6. 在验证集上评估
三、时间泄露
3.1 时间泄露场景
| 场景 |
泄露方式 |
正确做法 |
| 时序预测 |
用未来数据训练 |
严格按时间划分,只用过去数据 |
| 滚动统计 |
用全量数据计算滚动均值 |
只用历史窗口计算 |
| 特征工程 |
用全量数据计算统计特征 |
只用截止时间前的数据 |
| 伪标签 |
用全量测试集做伪标签 |
只用已观测到的数据 |
| 用户行为 |
用用户全量行为做特征 |
只用截止时间前的行为 |
3.2 时序赛正确验证方式
| 验证方式 |
说明 |
适用场景 |
| 简单时间划分 |
前80%训练,后20%验证 |
数据量充足 |
| 滚动验证 |
多个时间窗口验证 |
数据量中等 |
| Embargo |
训练集和验证集之间留间隔 |
金融时序 |
| Purged K-Fold |
清除包含训练信息的验证样本 |
金融时序 |
3.3 Embargo与Purged CV
| 方法 |
核心思想 |
实现 |
| Embargo |
训练集末尾和验证集开头之间留一段gap,避免信息泄露 |
gap长度通常为最大lookback窗口 |
| Purged K-Fold |
在K-Fold基础上,删除训练集中与验证集时间重叠的样本 |
适用于金融多期数据 |
四、测试集泄露
4.1 训练集与测试集重叠检测
| 方法 |
说明 |
| 精确匹配 |
对文本/图像做hash比对,找完全相同的样本 |
| 近似匹配 |
用相似度阈值(如cosine>0.95)找近似重复 |
| 图像感知哈希 |
pHash/dHash检测相似图片 |
| 文本相似度 |
TF-IDF + 余弦相似度检测相似文本 |
| ID关联 |
同一用户/物品在训练集和测试集都出现 |
4.2 重叠样本的利用策略
| 策略 |
说明 |
风险 |
| 直接映射 |
重叠样本直接用训练集标签 |
Public/Private分裂可能导致不一致 |
| 加权利用 |
重叠样本权重更高 |
中等风险 |
| 特征增强 |
用重叠信息构造新特征 |
低风险 |
| 伪标签 |
用训练集标签给测试集重叠样本打伪标签 |
中等风险 |
4.3 测试集分布探测
| 方法 |
说明 |
| LB Probing |
通过提交探测测试集标签分布 |
| 对抗验证 |
训练二分类器区分训练/测试集,分析分布差异 |
| 特征分布对比 |
对比训练集和测试集的特征分布 |
| KS检验 |
统计检验训练/测试集特征分布是否一致 |
五、外部数据利用
5.1 外部数据使用原则
| 原则 |
说明 |
| 合规性 |
仔细阅读比赛规则,确认是否允许外部数据 |
| 可复现 |
外部数据必须公开可获取,确保他人可复现 |
| 有效性 |
外部数据必须对任务有帮助,不能盲目堆砌 |
| 一致性 |
外部数据与比赛数据分布不能差异过大 |
5.2 外部数据类型
| 类型 |
说明 |
典型来源 |
| 预训练模型 |
用外部数据预训练的模型权重 |
HuggingFace/PyTorch Hub |
| 扩充训练集 |
外部同类数据扩充训练集 |
学术数据集/爬虫 |
| 预训练词向量 |
用外部语料训练的词向量 |
GloVe/FastText/Word2Vec |
| 知识库 |
外部知识增强特征 |
Wikipedia/知识图谱 |
| 伪标签源 |
用外部模型给数据打伪标签 |
大模型API |
5.3 外部数据有效性验证
| 步骤 |
说明 |
| 1. Baseline |
不用外部数据的baseline分数 |
| 2. 加入外部数据 |
加入外部数据后的分数 |
| 3. 对比 |
确认提升是否显著(>0.1%) |
| 4. 消融 |
逐个去掉外部数据源,确认每个的贡献 |
| 5. 稳定性 |
多折验证确认提升稳定 |
5.4 外部数据常见陷阱
| 陷阱 |
说明 |
解决方案 |
| 分布不匹配 |
外部数据与比赛数据分布差异大 |
对抗验证筛选 |
| 标签噪声 |
外部数据标签质量低 |
人工抽检+置信度过滤 |
| 过拟合外部 |
模型过度依赖外部数据 |
控制外部数据比例 |
| 规则违规 |
使用了不允许的外部数据 |
仔细阅读规则 |
六、对抗验证实战
6.1 对抗验证流程
1. 给训练集打标签0,测试集打标签1
2. 合并训练集和测试集
3. 训练二分类器(如LightGBM)区分训练/测试
4. 分析AUC:
- AUC ≈ 0.5: 训练/测试分布一致,随机划分即可
- AUC > 0.7: 分布差异大,需要调整验证策略
- AUC > 0.9: 分布差异极大,需要重采样
5. 利用预测概率:
- 训练样本被预测为测试集的概率越高,越接近测试集分布
- 用这个概率做样本权重或重采样
6.2 对抗验证的应用
| 应用 |
说明 |
| 验证集构建 |
选择被预测为测试集概率最高的训练样本作为验证集 |
| 样本加权 |
用对抗验证概率作为训练样本权重,让模型更关注与测试集相似的样本 |
| 欠采样 |
去掉与测试集分布差异大的训练样本 |
| 过采样 |
复制与测试集分布相似的训练样本 |
| 特征筛选 |
分析哪些特征对区分训练/测试贡献最大,考虑删除这些特征 |
6.3 对抗验证的局限
| 局限 |
说明 |
| 小测试集 |
测试集太小时对抗验证不稳定 |
| 特征差异 |
如果训练/测试特征空间不同,对抗验证可能误导 |
| 过拟合 |
过度调整训练分布可能丢失有用信息 |
七、伪标签策略
7.1 伪标签基本流程
1. 用训练集训练模型
2. 对测试集推理,得到预测概率
3. 选择高置信度(如>0.95)的测试样本
4. 将这些样本加入训练集(用预测值作为标签)
5. 重新训练模型
6. 重复2~5(迭代式伪标签)
7.2 伪标签策略对比
| 策略 |
说明 |
风险 |
| 硬伪标签 |
用argmax预测作为标签 |
高风险,错误标签会累积 |
| 软伪标签 |
用预测概率作为软标签 |
低风险,保留不确定性 |
| 高置信筛选 |
只用置信度>阈值的样本 |
中风险,阈值选择关键 |
| 迭代式 |
多轮伪标签,每轮用新模型重新预测 |
中风险,需监控CV |
| 多折伪标签 |
每折用其他折的模型给测试集打标签 |
低风险,最稳定 |
7.3 伪标签注意事项
| 注意点 |
说明 |
| 监控CV |
伪标签后CV必须提升,否则不用 |
| 控制比例 |
伪标签样本不超过训练集的30%~50% |
| 置信度阈值 |
分类任务通常>0.9或>0.95 |
| 时序赛慎用 |
时序赛中伪标签可能导致时间泄露 |
| Private风险 |
伪标签可能偏向Public测试集分布 |
八、合规边界
8.1 合规与违规的判断
| 行为 |
合规性 |
说明 |
| 用公开预训练模型 |
合规 |
大多数比赛允许 |
| 用公开外部数据集 |
看规则 |
需确认规则是否允许 |
| 用商业API打伪标签 |
看规则 |
部分比赛禁止 |
| LB Probing |
合规 |
不违反规则但可能不道德 |
| 利用测试集重叠 |
合规 |
数据集本身的问题 |
| 多账号提交 |
违规 |
严重违规,会被取消成绩 |
| 代码抄袭不标注 |
违规 |
引用他人代码需标注 |
| 提交后修改代码 |
违规 |
Code Competition中不允许 |
8.2 灰色地带
| 行为 |
风险等级 |
建议 |
| LB Probing |
低 |
可以做,但不要过度依赖 |
| 测试集重叠利用 |
低 |
可以利用,但要确认Private一致性 |
| 外部数据边界模糊 |
中 |
有疑问时在Discussion提问 |
| 手工标注测试集 |
高 |
通常违规,不建议 |
| 爬取补充数据 |
中 |
确认规则允许且数据公开可获取 |