动手前先建个基准线
很多人调完参数、换完脚本,就想马上看新结果比旧结果好多少。但如果一开始没有记录旧结果是什么样,这个「好多少」根本无从谈起。基准线的作用,就是给你一个固定参考点,让后面每一次改动都能被量化。
先明确要衡量的对象
建基准线之前,先确定你关心的目标是什么。常见的有三类:
- 处理耗时:从输入到产出结果用了多久。
- 结果质量:比如分类的准确率、匹配的命中率、缺失值的比例。
- 资源开销:内存峰值、磁盘读写量、外部调用次数。
一次只盯一到两个指标,不要全都上。指标越多,基准线越难稳定复现,后面比对时干扰也越多。如果确实要同时看多个,就分开记录,不要合成一个总分。
固定数据口径和运行环境
基准线之所以能当参照,是因为它可复现。要做到这一点,需要把两件事固定下来。
数据口径:用哪一批数据、取哪个时间范围、过滤条件是什么。比如有一份数据,是按天记录的,你决定只用完整工作日、剔除字段缺失的行,那这个规则就要写下来,之后每次跑基准都用同一套规则。
运行环境:机器配置、依赖版本、并行度、随机种子。涉及随机过程的步骤,务必设固定种子,否则每次结果都会有细微差异,你就分不清是改动的效果还是噪声。
把这些写进一份简短的记录里,不用长,几行就够。关键是别人拿着这份记录能复现出接近的结果。
留出对照样本
只在一个数据集上跑一遍,得到的只是一个快照,不是基准线。更可靠的做法是留出一份不参与调优的对照样本。
具体做法是:从全量数据里划出一部分,调参、改脚本时都不去看它,只在一轮改动定型后才拿它验证。这样能避免一种常见偏差——反复在同一批数据上试,越试越贴合,看起来指标涨了,换成新数据却未必。
对照样本的规模不必很大,但要能代表整体分布。如果数据本身分层明显,比如按地区或类别分布不均,就分层抽样,别只取头部那部分。
重复运行,看波动范围
单次运行的结果可能碰巧偏高或偏低。建基准线时至少重复跑 3 到 5 次,记录每次的数值,算出大致范围。
判断标准很简单:后续改动后的结果,要明显超出这个波动范围,才算真的改善。如果基准线本身在正负几个百分点之间来回跳,那改动带来的提升如果也在这个区间内,就说明不了问题。
波动太大时,先别急着往下走。多半是有未固定的变量在起作用,比如并发顺序、缓存命中、外部接口响应时间。把基准线做稳,比多跑几轮优化更省时间。
基准线失效了怎么办
基准线不是一劳永逸的。数据分布变了、上游接口改了、依赖库升级了,旧基准线就不再可比。这时候不用推翻重来,但要重新建一条。
判断是否需要重建,看两点:一是当前数据的关键分布指标是否明显偏离当初;二是运行环境是否发生了实质变化。只要有一项成立,就在新条件下重跑一份基准线,并在记录里标明切换的时间点。
把每次的基准线都留存下来,附上日期和条件,这样回头看时能分清哪一段的对比是有效的,哪一段跨了版本不可直接比较。
有了稳定的基准线,后面的每次改动都变成一次有据可查的对照。省下的不是一次两次的计算,而是反复推翻结论的时间。
相关文章
试得越多越容易碰巧成功
本文讲多重检验下的过拟合问题:为什么试的策略越多,越容易撞上一个看似有效的结果。给出回测中识别与处理这类假阳性的具体做法,包括记录试错次数、样本切分、参数敏感度检查与效应量估计。
回测里的幸存者偏差怎么避免
回测中最隐蔽的误差往往来自数据本身。这篇讲清楚幸存者偏差是怎么混进样本的,给出检查数据集、重建历史成分、设定对照组的可操作方法,尽量在动手之前就把这类误差挡在外面。
训练集和验证集该怎么分
数据集划分没有万能比例,关键看样本量、时间结构和类别分布。本文给出随机划分、分层抽样与按时间切分的判断标准,并说明验证集该留多大、如何避免信息泄露。