在很多竞赛平台(比如Kaggle)上,测试集确实可以反复提交来获得分数。但这里有一个关键的陷阱:如果你根据多次测试集的分数来调整模型或超参数,本质上是在用测试集训练,会导致模型对测试集过拟合——最终分数很好看,但换一批新数据就会崩溃。
🔍 为什么通常“禁止”反复用测试集调参?
· 信息泄漏:每次提交都在从测试集中“学习”模式。比如你发现某次提交分数低,于是改参数再试,这相当于把测试集当成了验证集。
· 泛化风险:反复优化测试集分数后,模型会“记住”测试集中的特定噪声,失去对新数据的预测能力。竞赛中这叫 “leaderboard overfitting”,常见于靠后提交反超、但最终换用Private Test Set时翻车的情况。
📌 什么时候可以反复提交?
· 有限次数:Kaggle每天只允许3-5次提交,并且有Public/Private榜——Public榜分数本身就是用来给你“探索”的,但最终排名由Private榜决定(通常只评一次)。
· A/B测试或固定测试集:如果你明确知道未来数据分布与当前测试集完全一致(比如公司内部的固定留出集),且不打算再更新,那反复调参是可行的。但严格的研究规范依然要求测试集只用一次。
✅ 正确的做法
在超参数调优(W&B Sweeps)阶段:
· 用验证集或交叉验证来指导搜索,不用Public LB来训练模型。
· 搜索结束后,用最佳参数在训练集+验证集上重新训练最终模型。
· 最后在测试集上只跑一次,记录最终分数。
· 从Public Leaderboard分数中反推验证集性能,但不要直接改模型超参数。
· 用Public分数作为参考,但最终模型选择依然基于本地交叉验证。
总之:原则上测试集只用一次,竞赛的多次提交本质是“公开验证集”。
公开测试集分数不理想时,千万不要直接对着公开分数改参数(否则会过拟合到公开测试集)。正确做法是:
1️⃣ 先诊断:是验证集就低,还是只有公开测试集低?
情况 诊断 对策


