zoukankan      html  css  js  c++  java
  • 奇yin比赛刷分技巧

    参考《禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本》----苏剑林

    这篇文章参考了上一篇介绍的GANs的idea:生成与对抗,但是其实我感觉没有

    首先明白一点,咱们为啥疯狂调参,疯狂的减少过拟合欠拟合,因为为了让测试集的效果更好,更加的接近训练集和测试集。测试集又不参与训练,这样在训练完模型之后,去预测,就非常有可能出现较大的偏差啊,因为训练集和测试集的分布很有可能出现不一致的情况

    因此需要明白两个问题,也就是原作者提出来的

    为什么分布不一致?
    首先,明确一下本文所考虑的场景,就是我们只有测试集数据本身、但不知道测试集标签的场景。如果是那种提交模型封闭评测的场景,我们完全看不到测试集的,那就没什么办法了。为什么会出现测试集跟训练集分布不一致的现象呢?主要有两种情况。
    第一种是标签的分布不一致。如果只看输入x,分布基本上是差不多的,但是对应的y分布不一样。典型的例子就是信息抽取任务。训练集往往是通过“远程监督+人工粗标”的方式构建的,量很大,但是里边可能错漏比较多,而测试集可能是通过“人工反复精标”构建的,错漏很少。这种情况下就无法通过划分数据的方式构建一个更好的验证集了。

    第一种情况其实比较好办,在划分测试集,验证集和测试集的时候特别注意就好了

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

    第二情况嘛,当训练集和测试集的样本分布非常相似的时候,自然而然拟合训练模型的效果就会非常的好。这块就很想GANs中生成网络不断的区拟合真实数据的分布,直到最后原始逼近真实数据的分布。

    下面介绍具体的方法

    其实具体的方法简单的介绍就是

    把数据来源于train还是test设置为待预测的目标label:label = 1:数据来源于test数据集label = 0:数据来源于train数据集train test拼接,然后训练模型M。用模型M对train数据集打分,observation分数越高,说明train上该observation越接近test数据集的分布。取出train上分数最高的N个observation即可。

    over~

    不过作者也有详细的介绍可以参考这里禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本

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

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

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

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

  • 相关阅读:
    驼峰命名法
    Java中有关Null的9件事
    java开发中JDBC连接数据库代码和步骤
    TestNG 与 Junit的比较
    洛谷 P1880 [NOI1995]石子合并(区间dp,断环为链)
    洛谷 P1901 发射站(单调栈)
    洛谷 P2947 [USACO09MAR]向右看齐Look Up(单调栈)
    洛谷 P2629 好消息,坏消息(前缀和,单调队列,断环为链)
    洛谷 P3810 【模板】三维偏序(陌上花开)(CDQ分治)
    洛谷 CF429D Tricky Function(平面最近点对,分治)
  • 原文地址:https://www.cnblogs.com/gaowenxingxing/p/14075196.html
Copyright © 2011-2022 走看看