文 | 苏剑林

单位 | 追一科技

编 | 兔子酱


不管是打比赛、做实验还是搞工程,我们经常会遇到训练集与测试集分布不一致的情况。一般来说我们会从训练集中划分出来一个验证集,通过这个验证集来调整一些超参数[1],比如控制模型的训练轮数以防止过拟合。然而,如果验证集本身跟测试集差别比较大,那么验证集上很好的模型也不代表在测试集上很好,因此如何让划分出来的验证集跟测试集的分布差异更小一些,是一个值得研究的题目。

为什么分布不一致

首先,明确一下本文所考虑的场景,就是我们只有测试集数据本身、但不知道测试集标签的场景。如果是那种提交模型封闭评测的场景,我们完全看不到测试集的,那就没什么办法了。为什么会出现测试集跟训练集分布不一致的现象呢?主要有两种情况。

第一种是标签的分布不一致。如果只看输入x,分布基本上是差不多的,但是对应的y分布不一样。典型的例子就是信息抽取任务。训练集往往是通过“远程监督+人工粗标”的方式构建的,量很大,但是里边可能错漏比较多,而测试集可能是通过“人工反复精标”构建的,错漏很少。这种情况下就无法通过划分数据的方式构建一个更好的验证集了。

第二种是输入的分布不一致。说白了就是x的分布不一致,但是y的标注情况基本上是正确的。比如分类问题中,训练集的类别分布跟测试集的类别分布可能不一样;又或者在阅读理解问题中,训练集的事实类/非事实类题型比例跟测试集不一样。这种情况下我们可以适当调整采样策略,使得验证集跟测试集分布更一致些,从而验证集的结果能够更好反映测试集的结果。

判别器

为了达到我们的目的,我们让训练集的标签为0,测试集的标签为1,训练一个二分类判别器D(x):

(向右滑动查看完整公式)

其中p(x)代表了训练集的分布,q(x)则是测试集的分布。要注意的是,我们不是要将训练集和测试集直接混合起来采样训练,而是分别从训练集和测试集采样同样数量的样本来组成每一个batch,也就是说需要过采样到类别均衡。

可能有读者担心过拟合问题,即判别器彻底地将训练集和测试集分开了。事实上,在训练判别器的时候,我们应该也要像普通监督训练一样,划分个验证集出来,通过验证集决定训练的epoch数,这样就不会严重过拟合了;或者像网上有些案例一样,直接用逻辑回归做判别器,因为逻辑回归足够简单,过拟合风险也更小了。

跟GAN的判别器类似,不难推导D(x)的理论最优解是

()

也就是说,判别器训练完后,可以认为它就等于两个分布的相对大小。

重要性采样

优化模型也好,算指标也好,其实我们是希望在测试集上进行,也就是说,对于给定目标f(x)(比如模型的loss),我们希望算的是

但是要算目标f(x),通常要知道x的真实标签,但对于测试集来说我们不知道它的标签,所以不能直接算。不过我们知道训练集的标签,于是我们可以解决它来做重要性采样:

(向右滑动查看完整公式)

根据公式(2),我们知道,所以最终变成

(向右滑动查看完整公式)

说白了,重要性采样的思想就是从训练集里边“挑出”那些跟测试集相近的样本,赋予更高的权重

最终策略

从公式(5)我们可以得到两个策略:

第一是直接按照公式加权,也就是说,还是按随机打乱的方式划分训练集和验证集,但是给每个样本配上权重 。值得指出的是,类似的做法有些选手做比赛时已经用过了,只不过流传的权重是 D(x),当然哪个好我没法断言,只是从理论推导的角度来看应该是更加合理一些。

另一个策略就是实际地把对应的验证集采样出来。这也不难,假设训练集的所有样本为 ,我们把权重归一化。

然后按照 为分布做独立重复采样,直到采样到指定数目即可。注意需要做 有放回的独立重复采样,因此同一个样本可能被采样多次,在验证集里边也要保留多次,不能去重,去重后分布就不一致了。

文末小结

本文从训练判别器的角度来比较训练集和测试集的差异,并且结合重要性采样,我们可以得到一个跟测试集更接近的验证集,或者对训练样本进行加权,从而使得训练集的优化过程和测试集差异性更小。

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

有顶会审稿人、大厂研究员、知乎大V和妹纸

等你来撩哦~

参考文献

[1]《训练集、验证集和测试集的意义》https://kexue.fm/archives/4638

禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本相关推荐

  1. 数据标准化常见问题:对整个数据集数据标准化后再划分训练集、测试集和先对训练级标准化再将规则用于测试集有什么区别(Python实现)

    在数据分析与挖掘.算法建模的都会用到数据标准化.数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其 ...

  2. POJ - 3069 Saruman's Army 萨鲁曼的大军 贪心 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 2

    [问题描述] 萨鲁曼的大军正行进在一条笔直的道路上,由于是在夜晚行军,路上的石头严重地影响了行军速度.于是萨鲁曼决定预先在道路上安装一些路灯,以便士兵们能清楚地看到所有石头. 萨鲁曼给出n块石头的位置 ...

  3. 在Kaggle上赢得大数据竞赛的技巧和窍门

    在Kaggle上赢得大数据竞赛的技巧和窍门 解决方案 平台 数据 应用 方法 阅读1906  原文:The tips and tricks I used to succeed on Kaggle  作 ...

  4. SemEval-2020自由文本关系抽取冠军方案解读 (附NLP竞赛常用技巧总结)

    本文将回顾平安人寿近期在PaperWeekly × Biendata直播间进行的主题为「SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)」的技术分享,由平安人寿AI团队 ...

  5. 直播 | SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)

    「PW Live」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交 ...

  6. 必看干货!微信营销话术,微信营销技巧有哪些

    **微信营销话术,微信营销技巧**有哪些?现在微信已经成为了一个网络营销推广平台,很多人通过这个平台成功的推广了自己的产品,获得了非常可观的收益.但是想要获得成功是没有那么简单的,如果你也想要在微信上 ...

  7. 你在生活中有哪些观人术和识人技巧

    这里写目录标题 1. 你在生活中有哪些观人术和识人技巧? 1. 你在生活中有哪些观人术和识人技巧? "如果有人一直说个不停, 你完全插不上话, 掉个东西到地上(钥匙, 笔之类的), 你弯腰下 ...

  8. 浅谈信息学竞赛考场策略及程序测试

    浅谈信息学竞赛考场策略及程序测试 主题 本文作者是江苏省常州高级中学吴翼同学发布的信息学竞赛江苏省论文.内容对于大家备考十分有帮助,特分享给同学们,希望在中秋假期给大家的学习增加一点动力! 考场策略和 ...

  9. 【Python】python初学者应该知道与其他语言差异化的高效编程技巧(附测试代码+详细注释)

    目录 1. 交换变量 2. 集合去重 3. 列表推导.集合推导和字典推导 4. 统计字符串中各个字符出现的次数 5.优雅地打印JSON数据 6.行内的if语句 6. 符合正常逻辑的数值比较 7. 田忌 ...

最新文章

  1. 利用OnAnimatorove函数控制人物的移动
  2. 未解决计算机主机与打印机,电脑无法与打印机连接 计算机网考题目2(12)
  3. java 减法 位运算,位运算-实现加减乘除
  4. ios 动画设计_动画和讲故事在设计中的力量
  5. python 语音播放_基于Python编写的语音播放软件
  6. fieldset ----- 不常用的HTML标签
  7. c++如何防止一个类被其他类继承?
  8. 浅谈Java中的hashcode方法
  9. linux 安装sysstat使用iostat、mpstat、sar、sa(转载)
  10. [Java] 蓝桥杯ADV-95 算法提高 字符串比较
  11. 不用加好友,查看对方校内照片
  12. Swift - 使用UIScrollView实现页面滚动切换
  13. 视频剪辑软件产品调研分析
  14. 模拟cmos集成电路设计之共源共栅电流镜
  15. 微博 用户画像_常见信息流平台用户画像分析
  16. 森林火灾检测图像数据集(数据集中标注了真实火情中的烟和火,用于森林防火预警,COCO标签,453张)
  17. Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战
  18. 克里希纳驼奶粉食疗可养生?
  19. 一个简单的例子来理解监督学习和非监督学习及其区别
  20. 基于高光谱成像的苹果虫害检测特征向量的选取

热门文章

  1. wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
  2. 05-按钮的基本使用-开发步骤
  3. Arch Linux下打不开gnome-shell
  4. 【转载】KMP算法详解
  5. 五岁的时候,你在干什么?
  6. 用一张图片告诉你芯片设计
  7. Linux 设备驱动模型中的class(类)
  8. HT68F30控制5150 IIC控制总线
  9. 任务、进程、线程之间的区别
  10. 【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作