直接回答:一份可复现的比赛 Notebook 需要通过七项检查——环境可重建、数据来源明确、随机性受控、结构可读、验证方法透明、结论有证据支撑、贡献边界清晰。七项都通过,别人才能在自己的机器上重现你的结果,你也才能在几个月后看懂自己当时做了什么。
一:环境可重建
在 Notebook 开头列出关键依赖库及其版本,说明运行环境(Kaggle Notebook、本地 GPU 还是云端),必要时附上环境文件。检验标准:一台干净的机器按你的说明安装后,能不报错地运行到底。实践上最省事的做法,是在 Notebook 第一个单元固定打印关键库版本(Python、NumPy、Pandas 与模型库),并注明运行平台和加速器类型;依赖复杂时导出环境文件随作品一起提供。
二:数据来源明确
写清每个输入文件来自哪里:赛事官方数据、公开数据集还是自己生成的中间产物。使用外部数据时注明许可证和赛事规则允许的依据。中间产物要么附上生成代码,要么说明如何获得,不要出现「凭空出现的 feature.parquet」。一个实用做法是在开头维护一份「输入清单」:每个文件的来源链接、版本号或下载日期,以及它是原始数据还是派生产物——审阅者据此能快速重建你的数据环境。
三:随机性受控
固定随机种子,包括数据切分、模型初始化和采样过程中的每一处。如果结果对种子敏感,如实报告多个种子下的分数范围,而不是只展示最好的一次。「换个种子就复现不出来」是公开作品最常见的翻车点。容易漏掉的随机源包括:GPU 上的非确定性算子、数据加载的多进程顺序、以及任何依赖系统时间的逻辑。深度学习任务即使固定了全部种子也可能有微小波动,此时如实报告波动范围,比追求逐位一致更诚实。
四:结构可读
按「配置、数据读取、特征、训练、验证、推理、提交」的顺序组织代码,删除废弃的实验分支和被注释掉的大段代码。读者应当能在五分钟内说出这份 Notebook 做了什么、分几步、每步的输入输出是什么。常量、路径和超参数集中放在开头的配置单元,正文只引用配置——审阅者改一处就能在自己的环境重跑。
五:验证方法透明
明确写出切分方式、折数、分组依据和使用的指标实现,并解释为什么这样切分能模拟测试分布。给出本地验证分数与线上分数的对照,让读者能判断你的验证体系是否可信(两者为什么会背离,见公开排行榜解读)。
六:结论有证据支撑
每个关键结论都应当对应一个可查的实验记录:哪个改动带来多少分数变化、在哪个切分上测得。避免「感觉这个特征有用」式的表述;不确定的判断就标注为假设,并说明验证它还需要什么实验。最简单的落地方式是维护一张实验记录表:实验编号、改动点、验证分数与一句话结论,正文引用实验编号即可溯源,不必在文字里复述每次实验。
七:贡献边界清晰
说明哪些部分复用了公开 Notebook 或论文(附来源和许可证),哪些是你自己的改进。这既是对原作者的尊重,也是对自己能力的准确呈现(引用与合规的完整边界见学术诚信页)——面试或交流时,你能讲清楚的那部分才真正属于你。
整理时最常见的三个翻车点
第一个是本地路径:代码里残留着只在你机器上存在的绝对路径,换一台机器立即中断,应统一改为相对路径或在配置单元集中声明。第二个是隐藏状态:Notebook 单元曾被乱序执行,重启内核从头运行反而报错——发布前必须完整做一次 Restart & Run All。第三个是数据版本漂移:比赛数据在赛中更新过,而你的结论建立在旧版本上;在开头注明所用数据版本或下载日期,读者复现时才不会对不上数字。
整理的顺序建议
实际操作时不必从第一项做起:先做结构(四),把代码理成线性流程;再补环境与数据说明(一、二);然后逐个实验核对证据(三、五、六);最后写贡献边界(七)。整理完成后,在一个全新环境里从头运行一遍,通过了再公开。公开分享与讨论区的实践方式,见社区与成长指南。