对抗验证(Adversarial validation)

交叉验证(Cross Validation)是常用的一种用来评估模型效果的方法。当样本分布发生变化时,交叉验证无法准确评估模型在测试集上的效果,这导致模型在测试集上的效果远低于训练集。

对抗验证(Adversarial Validation),并不是一种评估模型效果的方法,而是一种用来确认训练集和测试集的分布是否一致的方法。它的本质是构造一个分类模型,来预测样本是训练集或测试集的概率。如果这个模型的效果不错(通常来说AUC在0.7以上),那么可以说明我们的训练集和测试集存在较大的差异。具体步骤如下:

  1. 构建一个样本的分类器,该二分类器的任务用于区分样本来源于训练集,还是测试集。因此,需要为原始数据新增一个标签列,将训练集中的样本标记为0, 测试集中的样本标记为1,样本的特征是数据中已有的特征,或者衍生的新特征,生成新的训练数据集;
  2. 将新的训练数据集进行划分,保留部分样本作为该样本分类任务的测试集T, 利用分类算法(XGBoost, LightGBM)等对数据集进行训练,AUC作为模型指标
  3. 在测试集T中进行验证,如果模型效果AUC在0.5左右,说明该样本分类模型无法区分样本来源训练集,还是测试集,说明原始数据中训练集,测试集分布是一致的;如果AUC较大,如0.9, 说明样本分类器很容易区分样本,间接说明训练集与测试集存在很大差异;
  4. 根据第3步的结论,对于分布一致的,正常对目标任务训练即可。对于分布不一致的,可以继续进行样本挑选的尝试。利用上述样本分类器模型,对原始的训练集进行打分预测,并将样本按照模型分从大到小排序,模型分越大,说明与测试集越接近,那么取训练集中的TOP N 的样本作为目标任务的验证集,这样即可将原始的样本进行拆分得到训练集,验证集,测试集。那么线上模型验证时,在这样的数据上调参得到的模型,如果在验证集上效果稳定,那么应用在测试集上,大概率结果是一致的

如此,完成了local CV的构建。有了上述的思路,可以做进一步的扩展(在可容忍的模型误差范围内),利用样本分类模型,挑选与测试集相近的训练集,做样本的反向选择,挑选合适训练样本进行模型训练。

对抗验证作为一种特征筛选方法时,可以找出时序波动明显的特征,帮我们快速找到在训练集和测试集上不稳定的特征。步骤如下:

  1. 对划分的训练集和验证集(测试集)进行二元编码, e.g. 训练集增加一个ad_target=1,验证集增加一个ad_target=0
  2. 训练一个简单的二分类模型,目标是对ad_target做二分类
  3. 每次训练只使用一个特征,记录模型收敛时验证集的AUC
  4. 迭代步骤3直到遍历所有特征,对特征按照AUC指标从高到底排序
  5. 重点分析AUC较高所对应的特征,经验阈值可以选0.7,0.8;注意缺失值问题
  6. auc越高,代表越能区分出训练集和测试集,可以选择丢弃这些特征

posted on 2022-03-20 19:02  朴素贝叶斯  阅读(1969)  评论(0编辑  收藏  举报

导航