怎么公平地对比两个模型
先把对比目标定清楚
很多人一上来就跑两个模型,看谁的分高。这样得到的结论通常不可用,因为「分高」可能来自数据划分、超参数、训练轮数甚至随机种子的差异。
动手之前先写下一句话:这次对比要回答什么问题。常见的有三类:
- 在同一份数据上,哪个模型泛化更好;
- 在固定的算力预算下,哪个模型更划算;
- 在某个具体子集上,哪个模型的错误更少。
这三类问题的实验设计完全不同。第一类要严格控制变量,第二类要固定训练成本,第三类要做分层评测。目标没定清楚,后面的数字再多也没意义。
把数据切分固定下来
公平对比的第一条是:两个模型看到的数据必须一致。
具体做法是先用固定随机种子切出训练集、验证集、测试集,把切分结果落盘保存,之后两个模型都读同一份文件。不要各自切一次,哪怕种子相同,不同库的切分实现也可能有差异。
同时注意测试集的隔离。调参、选特征、决定早停轮数,都只在验证集上做。测试集只在前面的流程全部冻结之后跑一次。如果反复用测试集挑模型,测试分数就不再是泛化能力的估计,而是过拟合到测试集的结果。
如果数据有时间维度,按时间切分比随机切分更接近真实使用场景。随机切分会把未来的信息泄漏进训练集,让两个模型的差距看起来比实际小。
指标要能反映你要解决的问题
单一指标往往不够。准确率在类别不平衡时会失真,一个把所有样本判为多数类的模型也能拿到很高的准确率。
选择指标时对照下面几条:
- 类别是否均衡,不均衡就补看召回率、F1 或 AUC;
- 错误代价是否对称,不对称就用带权重的指标或混淆矩阵;
- 是否关心排序,关心排序就看排序类指标而不是分类阈值上的指标;
- 业务上是否有硬约束,比如某些类别的漏判率不能超过某个水平。
两个模型对比时,除了看整体指标,还要看子群上的表现。比如有一份数据包含多个地区,整体分数接近,但某个地区上差距很大,这种差异在合并指标里会被掩盖。按关键维度分层算一遍,往往能发现真正的问题。
控制算力和调参预算
一个模型分数高,可能只是因为它被调得更久。如果两个模型的超参搜索预算不同,对比就不成立。
可行的做法有三种:
- 给两个模型相同的搜索次数或相同的训练时长;
- 先用一份预算各自粗调,再给最优配置相同的精调预算;
- 直接固定超参,只对比结构差异。
选哪种取决于你想回答的问题。想比较「上限」,就给足预算;想比较「同成本下的表现」,就严格限时。无论选哪种,都要在报告里写清楚,否则别人无法复现你的结论。
随机种子也要处理。单次运行的结果波动可能很大,尤其是小数据集。至少跑 3 到 5 个种子,报告均值和标准差,而不是只报最好的一次。
用差异的置信区间判断是否真的不同
两个模型的分数差 0.5 个百分点,算不算有差别?看单点分数没法回答,要看这个差异是否稳定。
简单做法是把测试集做自助抽样(bootstrap),每次重采样算一遍两个模型的分数差,得到差异的分布,再看这个分布是否跨过 0。如果跨过 0,说明当前数据量下无法断定谁更好。
另一种做法是用配对检验:对同一批样本,比较两个模型的预测是否一致,只看它们不一致的那部分样本。这种方法通常比直接比较整体指标更敏感。
报告结论时写清楚不确定性。与其说「模型 A 更好」,不如说「在当前测试集上,模型 A 的平均指标高 X,差异的置信区间为……」。后者才是可复核的表述。
记录足够的复现信息
一次对比做完,三个月后别人(包括你自己)要能重跑出同样的结果。所以要记录:
- 数据版本或切分文件的具体标识;
- 两个模型的完整配置,包括超参和训练轮数;
- 随机种子列表;
- 评测脚本的版本;
- 每个指标的均值和波动范围。
把这些和结论放在一起。只给一个分数表格,别人无法判断这个对比是否公平,也无法在你漏掉某个变量时发现它。
相关文章
准确率高就代表模型好吗
准确率只统计猜对的比例,在类别不均衡时会严重失真。本文说明为什么高准确率可能毫无价值,并给出查准率、查全率、混淆矩阵与基线对比等更可靠的评估做法。
怎么评估一个分析模型稳不稳定
模型上线后结果忽好忽坏,往往不是数据变了,而是稳定性没测过。这篇讲 4 种可落地的检验方法:参数扰动、数据子集重跑、时间切分、指标波动区间,并给出判断阈值和记录方式。
数据分析软件怎么选?看这 5 个标准
选数据分析软件别只看功能列表。数据在哪运行、模型能不能解释、断网能不能用、更新是否持续、结果能不能导出,这 5 点决定了它能不能长期用下去。