导语: 马上就要五一了,祝全世界人民五一快乐!在这之前,想过好几个准备这些天可以完成的专题,比如Boosting系列在搞点最近几年的新玩意,或者开一个新专题,如心心念念的GNN/GCN(主要是又可以去回忆一下信号与系统的内容),或者把最近王喆老师的推荐系统看看,或者卓克老师的科普人物系列,模仿一下大佬的写作风格,或者写点风控模型相关的,正好与节日氛围想匹配。然而,当我回到家,打开知乎正好刷到一篇讲Adversarial validation相关的,Adversarial,对抗,我喜欢的内容,写它写它写它(抄它抄它抄它)。

本文提纲如下:

  • 地震无处不在
  • Adversarial validation
  • 对抗训练-DANN
  • 总结

地震无处不在

训练集与测试的不一致问题是我们经常面临的问题,在互金领域,市场环境变化,准入策略,额度策略的调整,会导致训练样本在时间维度上存在差异,因此在利用大规模样本,或者长期限样本来训练模型时,必然会存在训练集与测试集(或者当前线上打分模型)产生偏差,这种现象在模型指标上的表现就是训练集,验证集上的KS/AUC想对较高,测试集上天然会存在decay的现象。面对这种情况,不能把原因单纯的归结为过拟合,而使劲地去改善这种表面的过拟合现象,也需要考虑上述人群变化的原因。

训练集与测试集差异明显的典型例子很容易发生在Kaggle比赛,或者国内高水平的比赛上,比赛前期显示的都是在公榜上成绩,最后的评判的却是的额外的私榜上,就会产生很大喜闻乐见的地震, shake up。如Kaggle比赛LANL Earthquake Prediction,在public Leaderboard中排名第一的,在private Leaderboard却掉到了2734,而后面一大票老哥却冲到了前排,上演数据世界的地震。

所以大佬们,总是提醒我们,trust local cv,但是在很长一段时间大佬却没有告诉我们如何构造稳定,测试集与验证集一致的方法,而正是本篇要带来的一种方法。

Adversarial validation

Adversarial validation,网上的翻译是对抗验证,但是当我看完内容之后其实是没有发现太明显的对抗痕迹,还是高攀得起的,步骤如下:

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

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

对抗训练-DANN

看完上述方法,确实很实用,至于效果嘛,笔者还没在自己的业务数据上实验,后期有了结果在进行补充(此坑比填),上述好像也没有发生什么对抗,但是不要一看到对抗就陷入到GAN,生成对抗网络的思维里面,似乎一提对抗就要有显式一个生成器,一个判别器,两者相爱相杀,共同提高。在2015年,就有一篇对抗训练(而不是对抗生成)的文章,Domain-Adversarial Training of Neural Networks,就是从梯度翻转(Gradient reversal layer)的角度来进行对抗训练,如果希望深入学习这方面的东西的同学,可以检索领域自适应, domain adaption相关的内容,了解相关的思路,至于能否解决业务问题,还需要看场景。

还是以风险模型为例,如果一个公司要启动一个新业务线,而针对的客群跟当前跑通的场景是不同的,人群差异较大,那么就面临的业务任务启动的问题,那么怎么高效的利用历史积累的数据样本呢,很容易想到迁移学习,而上述讲到的领域自适应是迁移学习中的一种,可以利用DANN框架进行对抗训练,一个任务用于用于进行具体任务的训练(对应图中的 label predictor), 而域分裂器(对应图中的domain classifier),其标签就是用于区分样本来源于哪个业务线,哪个客群等,通过对抗训练使得在特征提取器部分能够学习到多个客群的本质特征,学习到共同特征,以至于域分类器陷入懵逼状态,安能辨我是雌雄,从而完成迁移学习,解决样本不足的问题,在预测是只需要将提取的特征进入具体任务的分类网络即可。

上述方法听取来是有效,我以前也实验过,对于模型还是有提升的,然而,这毕竟是一个思路,没有具体的落地。

总结

上述两种方法,其实是两个不同的思路,只是刚好说到对抗,就联想到了DANN。顺便说一下,对抗训练的思维,给我们开启了一个新的模型训练的思路,传统的机器学习方法,重要的目的是根据目标函数,尽力去拟合即可,使得损失最小,而对抗训练是尽可能利用额外的信息,解决额外的一些任务,我们常说,模型是很容易偷懒的,给它找个对手,一切都是为了它好。至于对抗训练方面的内容,又要挖坑了,此坑可填。

参考内容:

Adversarial validation, part one​fastml.com

label y 训练集测试集x_Adversarial validation-对抗验证| 一种解决训练集与测试集分布不一致的方法...相关推荐

  1. 深度神经网络(训练集,验证集,测试集), 提升模型效果,交叉验证

    随笔 神经网络训练确实是loss越小,效果越好,但不是绝对的. 因为损失小只是对训练集而言,所以要划出部分数据不做训练,只做验证,即为验证集,验证集对网络训练是没影响的, 所以要将数据集分成:训练集, ...

  2. 阿里公开自研AI集群细节:64个GPU,百万分类训练速度提升4倍

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :量子位 AI博士笔记系列推 ...

  3. 面试了10几家软件公司测试岗位,做的面试题大盘点,重点大合集

    马上就是金三银四了,不知道小伙伴们有没有准备好呢?希望这篇文章的内容可以帮助到大家! 另外文末给大家准备了资料(好几套面试题加学习资料等),需要自取! 项目的测试流程 1.拿到需求文档后,写测试用例 ...

  4. FCN训练不收敛的原因分析和最详细的FCN训练与测试自己的数据程序配置

    在2015年发表于计算机视觉顶会CVPR上的Fully Convolutional Networks for Semantic Segmentation 论文(下文中简称FCN)开创了图像语义分割的新 ...

  5. ubuntu16.04下使用YOLOV3训练自己做的VOC数据集(VOC数据集制作+模型训练步骤+训练参数解析和问题解决+训练日志可视化(loss、IOU)+模型测试(单张、摄像头、批量测试))

    前序 1.环境配置 请自行参考其他博客 本机环境 ubuntu16.04 python3 英伟达显卡驱动:nvidia-396 OpenCV3.4.5 CUDNN7.0.5 CUDA9.0 2.ubu ...

  6. matlab气管分割,一种基于区域生长法与水平集相融合的肺部CT图像的分割

    摘要: 为将肺实质区域从含有背景.噪声的胸腔区域里分割出来,首先,应用传统的区域生长法初步定位肺部边界轮廓:其次,去除肺部边界噪声,采用自适应曲率阈值法修复肺部边界:最后,应用水平集法中的DRLSE模 ...

  7. Nacos2.0.3版本线上bug导致整个集群挂掉从而导致业务系统挂掉的解决办法

    文章目录 @[toc] 一.问题 二.解决办法 三.项目升级demo及项目nacos配置 3.1 dubbo-demo-producer生产者端项目POM配置 3.2 dubbo-demo-consu ...

  8. 食物链 (利用并查集的两种解决方法)

    食物链是并查集中的一道经典题, 第一次看<挑战程序设计竞赛>上懵懵懂懂, 最近又看见了发现还是一脸懵逼. 首先题目如下 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形 ...

  9. Galera Cluster: 一种新型的高一致性MySQL集群架构

    2019独角兽企业重金招聘Python工程师标准>>> 1. 何谓Galera Cluster 何谓Galera Cluster?就是集成了Galera插件的MySQL集群,是一种新 ...

最新文章

  1. 小工匠聊架构 - 分布式缓存技术
  2. 1、SpringBoot------表单校验
  3. C/Cpp / STL / 类型萃取
  4. (转) Spring读书笔记-----Spring的Bean之配置依赖
  5. 3天超4亿 《阿丽塔:战斗天使》中国票房超北美
  6. Python字典(二)
  7. Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能...
  8. Kebernetes 学习总结(8) statefulset
  9. java宝马奔驰汽车正在生产代码_Java的三种工厂模式
  10. 几点预防内存泄露的小建议
  11. 锐起无盘服务器缓存多少,锐起无盘缓存分析
  12. 【精品毕设】电力电子仿真——母线继电保护动作行为仿真分析系统
  13. 幼儿园调查过程怎么写_关于幼儿园的调查报告格式及范文
  14. C++ Learning (Next)
  15. HTML---复选框默认打钩
  16. 搭建属于自己的云测试平台
  17. halcon19.11深度学习关于分类入门案例
  18. 初识c语言加操作系统
  19. Java 利用hutool工具实现导出excel并合并单元格
  20. 低分辨率人脸识别(LRFR)相关文章整理——(待更)

热门文章

  1. 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化
  2. mysql面试精选【推荐】
  3. 到底什么是RestFul架构?
  4. 简单介绍强引用,软引用,弱引用,虚引用
  5. java基础--集合案例斗地主发牌排序
  6. leetcode 720. Longest Word in Dictionary | 720. 词典中最长的单词(Trie前缀树)
  7. 【PAT甲级 前导0,排序】1069 The Black Hole of Numbers (20 分) C++ 全部AC
  8. redis 硬件要求_Redis持久化机制
  9. Effective Java之在公有类中使用访问方法而非公有域(十四)
  10. hadoop2.6.0安装详细步骤