数据泄露与外部数据利用

数据泄露与外部数据利用


一、数据泄露概述

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提问
手工标注测试集 通常违规,不建议
爬取补充数据 确认规则允许且数据公开可获取