直接回答:公开排行榜只用测试集的一部分计算分数,最终名次由你没见过的另一部分决定。如果分数上涨来自针对公开榜的反复调参,而不是本地验证同步确认的真实改进,这种上涨本质上是过拟合——最终榜揭晓时大概率会回落,这就是社区常说的 shake-up。
判断一次上涨是好是坏,关键看它能否被解释、能否被本地验证复现。下面是三种最常见的「假上涨」。
先看懂机制:公开榜和最终榜是怎么算分的
大多数 Kaggle 竞赛会把测试集切成两部分:一部分用于计算比赛期间可见的公开排行榜(Public Leaderboard),另一部分保留到比赛结束,才用于计算最终排名(Private Leaderboard)。两部分的比例在赛事页公布,常见比例如 30% 对 70%。比赛结束前,参赛者要从所有历史提交中选出至多两个作为最终提交——最终名次只由这两个提交在保留数据上的成绩决定。这个机制意味着:整场比赛你反复优化的可见分数,和最终决定名次的分数,从来不是同一个数。理解了这一点,「公开榜上涨」就只是一个待验证的信号,而不是结论。
围榜调参:把提交当成了训练信号
每天的提交次数有限,但仍有人用它做参数搜索:改一个参数、提交、看分数,再改再提交。公开榜样本量有限,这样做等于直接在一小部分测试数据上做优化,分数自然会「涨」,但涨的是对这部分样本的拟合程度,不是模型的泛化能力。自查方法很简单:回顾最近十次提交,如果大多数改动在本地验证上没有同方向的变化,只有公开榜在动,就应当停下来重建验证。
验证失真:本地分数早就不可信
当训练数据里存在时间顺序、同一实体的多条记录或聚合特征时,随机切分会让「未来的信息」或「同一实体的信息」同时出现在训练集和验证集里,本地分数被系统性抬高。此时你以为的改进可能只是泄漏程度的变化。检查三件事(交叉验证的系统学习路径见学习路线):切分方式是否模拟了测试集的生成方式(按时间、按分组);特征工程是否只使用了预测时刻真实可得的信息;训练与推理阶段的预处理是否完全一致。
分布偏差:公开榜与最终榜本来就不同
部分赛事的公开榜和最终榜样本来自不同的时间段或不同的子集。这种情况下,即使方法完全正确,两个榜的分数也可能存在稳定的差距。应对方式不是去猜测试集,而是让本地验证尽可能贴近最终榜的分布假设,并观察模型在不同切分上的方差:跨折波动很大的方案,在最终榜上翻车的概率也更高。
一个典型场景:本地 0.86,线上只有 0.79
假设你的五折交叉验证平均分是 0.86,提交后公开榜只有 0.79。合理的排查顺序是:先检查提交文件——行数、ID 对齐、输出的是概率还是标签、列名是否与样例一致;再检查预处理——训练阶段的编码映射、缺失值填充、标准化参数是否原样应用到了测试数据;然后对比训练集与测试集的特征分布,确认是否存在时间断层或群体差异;最后才轮到怀疑模型本身。多数「线上掉分」发生在前两步,而不是模型层。反过来,如果本地 0.79、线上 0.86,同样不该高兴——这说明你的验证在系统性低估,一样不可信。
把公开榜放回正确的位置
公开榜的合理用途是低频校准:验证提交文件格式正确、确认本地分数与线上分数的相关方向、以及在方法出现较大改动时做一次外部确认。日常迭代应当以本地交叉验证为主要依据,每次实验记录配置、分数与结论(实验记录如何整理成可复现作品,见七个检查项)。一个可靠的判断标准是:如果本地验证和公开榜长期同涨同跌,你的验证体系是可信的;一旦两者背离,优先怀疑验证,而不是庆祝上涨。如果反复排查仍找不到验证失真的原因,可以通过一对一赛事辅导做一次验证诊断。选择最终提交时,稳妥的组合是一个本地验证最好的方案加一个公开榜最好的方案:两者指向一致时说明验证体系可信;不一致时,至少两种假设各押了一边。