谈谈Kaggle竞赛中的Cross Validation
今年基本全部精力都投入kaggle了,发文也比较少,很可惜UM切榜拿下银牌第一位错失solo金,只能后续继续努力了。近期看到很多人对trust cv还是trust lb这个问题十分纠结,因此这里专门写一篇简单聊聊。
01、前言
在最开始,我们要先谈谈过拟合与欠拟合,虽然这两个概念非常基础,但实际发现很多人仍然不是特别清晰。
最早的概念中,过拟合是指模型在训练集上表现很好,但在验证集或测试集表现很差,其本质就是将噪声作为一种规律进行了过度拟合;而欠拟合是指模型在训练集、验证集和测试集上均表现都较差的情况。更广泛地在实际比赛中,欠拟合这个概念提的很少,本地和榜上分数都上不去可以说就是一种欠拟合吧,我们提得更多的则是过拟合,比如“线下过拟合了”,或者“过拟合公榜了”。这里就指的是线下提升线上掉分,或者公榜分高私榜分低。考虑到我们的最终目的是私榜分高,所以我们需要一个合适的策略来判断我们的模型到底性能如何,不管是从本地CV还是从公榜(Leaderbord LB)的反馈。
这就衍生出来两个问题,一是如何构建本地CV,二则是我们应当相信本地CV还是应当相信LB来进行优化和选择最终的submission。虽然大家一般的选择策略是选择一个CV最佳一个LB最佳,但是实际优化过程中,这个选择题也会或多或少的影响优化方向的判断。
02、CV的策略
要谈CV的策略,首先要清楚我们为什么要做CV,这个问题的答案很简单,但实际很多新手没有真正深刻的认识。答案是因为我们没有办法把每次优化都提交,次数不允许,因此需要我们在有限的次数内对更有可能上分的操作进行验证。要使我们的CV尽可能有效,那么我们的验证集就要从各个方面接近测试集,同时要尽量用上更多的数据进行验证。
这里举三个典型的CV例子:
- 一是分类问题,我们常使用分层交叉验证(StratifiedKFold),这是为了使得每一折的label分布更均匀,更接近整体分布;对于回归问题,其实可以将label进行分箱然后使用分层交叉验证,这是一个变种用法;
- 二是测试集为新类的问题,我们常使用分组交叉验证(GroupKFold),保证验证集中都是新类;
- 三是时序问题,我们常使用最后一段时间作为验证集,这是因为通常来说最后一段时间的数据分布更接近测试集。
此外,让验证集跟训练集更接近还包括交流群里一位GM谈到很多次的不设置早停,原因就是测试集没有提供给你来进行早停,因此验证集如果使用早停会造成分数虚高。需要注意的是,这里的CV策略目的是为了让你的CV分数能更真实便于你优化模型,而非让模型的分数更高。
03、Trust什么
现在终于来到了我们的主题,前面谈到的为了让验证集更接近测试集的CV策略,其实都有一个前提:测试集数据分布跟训练集数据基本一致。在这个前提下就有了几乎每个kaggler都知道的习语:trust local cv。一般来说,赛题的训练集是规模是大于测试集,公榜则占测试集少部分,因此使用全部训练集的CV常常具有更高的可信度。去年的 Child Mind Institute - Detect Sleep States 就是这样一个比赛,整体数据集比较大,而且不知道为什么公榜的分布发生了偏离,最后私榜证明trust cv更靠谱,我当时因为算力问题偷懒了只采用了5折中的一折作为线下,也拟合偏掉了。
但存在一种情况:测试集的数据分布压根就跟训练集不同。如果是特征分布不同,也许还能通过对抗验证进行筛选,选择分布相对一致的特征,但如果label的分布存在差异,你就很难让你的验证集分布与测试集相似。此时盲目trust cv必然无法获得一个好的结果,前面的 UM - Game-Playing Strength of MCTS Variants 就是这样一个题,公榜相对更能反映私榜的结果。
于是应该trust什么就变成了分析测试集数据是否与训练集同分布,其实到这一步已经差不多了,剩下的就是经验和更技巧性的东西。简单说一下,一方面要多看题目描述和discussion的主办方发言,看是否能找到关于分布的一些蛛丝马迹;另一方面就是尝试探测数据集分布,UM开赛后就有一个相关的帖子(https://www.kaggle.com/competitions/um-game-playing-strength-of-mcts-variants/discussion/533210),很明确地显示出测试集和训练集有分布差异。关于探测的技术,有待大家进一步开发,我这里就不多说了。
04、结语
今天跟大家简单讨论了一下CV相关的内容,能够选中一个私榜最高的sub也是实力和运气都需要的。能做一个好的CV其实不仅仅是数据竞赛中非常重要的一步,往大了说,这是能够正确评价模型的根本,但是现在很多论文和广告不尊重这项基本事实,在验证集或测试集的分割上做手脚,外行不懂也就算了,专职数据科学家搞这种玩意,真是道德沦丧,世风日下。