Adversarial validation
数据挖掘比赛,一般都分为train(线下)和test(线上),test一般分为A榜和B榜。所以,做模型的时候首先要考虑的是train和test的分布是不是一致,保证分布的一致,是做模型的前提咯。不然,线下好的很,线上也是各种蹦,线上线下不一致。其次,要trust local cv, 线上显示的A榜只是具有一点点的参考性,千万不要一味地被A榜的分数牵着鼻子走。在抖动比较大的数据中,可能种子不同分数都差别很大,这个时候更应该考虑泛化能力,可能这个种子只是刚好拟合A榜,B榜蹦成翔。
一般,在线下造特征时,都会去检查特征分布一致性,虽然特征分布一致,但是进行验证时,我们一般都是进行Kfold交叉验证,每折作为valid验证集的样本中可能存在和test集中样本分布不一致的,这种不一致性,可能是样本本身(如客群之类)的差异,即训练集与测试集分布相差非常大。此时,使用交叉验证的结果来作为验证结果,线上结果可能就很糟糕了。
Adversarial validation(对抗性验证)在kaggle上看大神用,Adversarial validation原文章在这http://fastml.com/adversarial-validation-part-two/,思想很纯粹。
1)给train训练集和test测试集,打上一个新标签,例如isTest,train的话isTest为0,test的话isTest为1。
2)然后构建个分类器(lgb,xgb,lr之类的),对新打的标签isTest进行预测,得到训练集的概率(这里的概率为oof的概率)。
3)得到训练集样本的isTest的概率,概率越大,该样本与测试集的分布越一致。
4)将得到的概率降序排列,选取前n%的样本作为线下验证集,此时线下验证集的分布就比较接近线上的测试集的分布咯,前百分之多少自己尝试咯。
5)理想情况下,交叉验证的auc越接近0.5咯,此时分布越一致。
此时,选取的线下验证集,大概率上与线上测试集是同增同减了,work不work还要看数据集,还是要先去尝试。反正,构建一个稳定的线下验证集确实很难,一般将交叉验证结果作为线下验证集结果都是不稳定的。Adversarial validation也是提供了一种思路。
kaggle大佬做的demo:https://www.kaggle.com/kevinbonnes/adversarial-validation