Kaggle 知识点:Adversarial Validation
Kaggle 知识点:Adversarial Validation
在 Kaggle 比赛中数据分布一致是阻碍大家上分的点,本篇文章将介绍 Adversarial Validation 原理和使用方法,并对数据分布不一致的情况给出一些解决案例。原创文章不易,希望分享、点击再看和收藏,谢谢!
Adversarial Validation
Kaggle 比赛中数据可分为训练集和测试集,国内比赛可能根据比赛阶段划分多个测试集,由于数据集采样和分布的原因导致训练集和线上测试集可能存在分布不一致的情况,也会带来本地交叉验证(Cross Validatation, CV)与线上不一致的情况。

Adversarial Validation 核心思路是构建一个分类模型,目的是分辨训练集和测试集的来源,这里假设使用 AUC 作为分类精度评价函数。
- 如果分类模型无法分辨样本(AUC 接近 0.5),则说明训练集和测试集数据分布比较一致;
- 如果分类模型可以很好分辨样本(AUC 接近 1),则说明训练集和测试集数据分布不太一致;
使用 Adversarial Validation 方法也非常简单,将训练集和测试集分别打上不同的标签然后进行训练,代码思路如下:
train = pd.read_csv( 'data/train.csv' )
test = pd.read_csv( 'data/test.csv' )
train['TARGET'] = 1
test['TARGET'] = 0
data = pd.concat(( train, test ))
x = data.drop( [ 'TARGET', 'ID' ], axis = 1 )
y = data.TARGET
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y)
在训练集和测试集分布一致的情况中,构建模型的验证 AUC 一般接近 0.5,即分类模型无法判别样本来源:
# logistic regression / AUC: 49.82%
# random forest, 10 trees / AUC: 50.05%
# random forest, 100 trees / AUC: 49.95%
在训练集和测试集分布不一致的情况中,构建模型得到的 AUC 一般接近 1,即分类模型可以分辨样本的来源。此时本地 CV 和线上就容易出现不止的情况。
数据分布不一致怎么办?
当使用 Adversarial Validation 验证或者手工验证发现训练集和测试集分布存在差异时,可以有哪些做法?
- 假设存在多个训练集,可以使用 Adversarial Validation 与测试集分布比较一致的一个训练集进行训练;
在 IJCAI2018 里,数据 A 是前六天的数据,数据B是第七天上半天的数据;在Ogeek 里,数据A有两百万数据,数据B只有五万数据;在联通个性化推荐比赛,数据A有初赛约 70W数据,数据B有复赛约 35W 数据。此种情况一般存在于国内的多阶段比赛会放出多个训练集,比较好的方法是选择与测试集最为相似的一份训练集(假设为数据 B)进行训练。当然其他的训练数据(与测试集不相似,假设为数据 A)可以被利用,可以先在数据 A 上进行预训练,然后在数据 B 上进行微调,完成迁移学习(或称为嫁接学习)。
https://zhuanlan.zhihu.com/p/51901122
- 假设 Adversarial Validation 的 AUC 非常高,可以尝试使用 Adversarial Validation 选择出与测试集比较相似的样本,构建成为验证集。
- 假设数据集可以扩增,则可以使用外部数据来扩增训练数据,以保证训练数据与测试数据的一致性。
当然但数据分布不一致的时候,上述情况都需要反复进行尝试,不同的数据集具体情况不一样。同时 Adversarial Validation 也只能给出一些指导建议,具体还是要通过提交来验证具体思路的正确性。最后 Adversarial Validation 也可以用于验证 AB 榜 shake up 的可能性,过拟合 CV 有风险。Do not trust your local CV!

阅读链接
- https://www.kaggle.com/h4211819/adversarial-validation
- http://fastml.com/adversarial-validation-part-two/
- http://fastml.com/adversarial-validation-part-one/
写下你的评论...
挺实用的!先判断训练集测试集分布是否一致,一致就直接 train。不一致就先根据特征筛选出来一致的训练集,其他训练数据当嫁接学习的土壤。
train 和 test 的数量相差太大没什么影响吗
没有吧,test 是线上数据,数量够就行,满足统计要求就行,和训练集数量相差大很正常的吧
挺实用的!先判断训练集测试集分布是否一致,一致就直接 train。不一致就先根据特征筛选出来一致的训练集,其他训练数据当嫁接学习的土壤。
是的 哦!

浙公网安备 33010602011771号