🫧 泡泡库 软件下载中心
实时数据

累计下载 1,021 次

在库软件 13 款

怎么公平地对比两个模型

模型评估 更新于 2026-10-22 #模型对比#评估#测试

先把对比目标定清楚

很多人一上来就跑两个模型,看谁的分高。这样得到的结论通常不可用,因为「分高」可能来自数据划分、超参数、训练轮数甚至随机种子的差异。

动手之前先写下一句话:这次对比要回答什么问题。常见的有三类:

  • 在同一份数据上,哪个模型泛化更好;
  • 在固定的算力预算下,哪个模型更划算;
  • 在某个具体子集上,哪个模型的错误更少。

这三类问题的实验设计完全不同。第一类要严格控制变量,第二类要固定训练成本,第三类要做分层评测。目标没定清楚,后面的数字再多也没意义。

把数据切分固定下来

公平对比的第一条是:两个模型看到的数据必须一致。

具体做法是先用固定随机种子切出训练集、验证集、测试集,把切分结果落盘保存,之后两个模型都读同一份文件。不要各自切一次,哪怕种子相同,不同库的切分实现也可能有差异。

同时注意测试集的隔离。调参、选特征、决定早停轮数,都只在验证集上做。测试集只在前面的流程全部冻结之后跑一次。如果反复用测试集挑模型,测试分数就不再是泛化能力的估计,而是过拟合到测试集的结果。

如果数据有时间维度,按时间切分比随机切分更接近真实使用场景。随机切分会把未来的信息泄漏进训练集,让两个模型的差距看起来比实际小。

指标要能反映你要解决的问题

单一指标往往不够。准确率在类别不平衡时会失真,一个把所有样本判为多数类的模型也能拿到很高的准确率。

选择指标时对照下面几条:

  • 类别是否均衡,不均衡就补看召回率、F1 或 AUC;
  • 错误代价是否对称,不对称就用带权重的指标或混淆矩阵;
  • 是否关心排序,关心排序就看排序类指标而不是分类阈值上的指标;
  • 业务上是否有硬约束,比如某些类别的漏判率不能超过某个水平。

两个模型对比时,除了看整体指标,还要看子群上的表现。比如有一份数据包含多个地区,整体分数接近,但某个地区上差距很大,这种差异在合并指标里会被掩盖。按关键维度分层算一遍,往往能发现真正的问题。

控制算力和调参预算

一个模型分数高,可能只是因为它被调得更久。如果两个模型的超参搜索预算不同,对比就不成立。

可行的做法有三种:

  • 给两个模型相同的搜索次数或相同的训练时长;
  • 先用一份预算各自粗调,再给最优配置相同的精调预算;
  • 直接固定超参,只对比结构差异。

选哪种取决于你想回答的问题。想比较「上限」,就给足预算;想比较「同成本下的表现」,就严格限时。无论选哪种,都要在报告里写清楚,否则别人无法复现你的结论。

随机种子也要处理。单次运行的结果波动可能很大,尤其是小数据集。至少跑 3 到 5 个种子,报告均值和标准差,而不是只报最好的一次。

用差异的置信区间判断是否真的不同

两个模型的分数差 0.5 个百分点,算不算有差别?看单点分数没法回答,要看这个差异是否稳定。

简单做法是把测试集做自助抽样(bootstrap),每次重采样算一遍两个模型的分数差,得到差异的分布,再看这个分布是否跨过 0。如果跨过 0,说明当前数据量下无法断定谁更好。

另一种做法是用配对检验:对同一批样本,比较两个模型的预测是否一致,只看它们不一致的那部分样本。这种方法通常比直接比较整体指标更敏感。

报告结论时写清楚不确定性。与其说「模型 A 更好」,不如说「在当前测试集上,模型 A 的平均指标高 X,差异的置信区间为……」。后者才是可复核的表述。

记录足够的复现信息

一次对比做完,三个月后别人(包括你自己)要能重跑出同样的结果。所以要记录:

  • 数据版本或切分文件的具体标识;
  • 两个模型的完整配置,包括超参和训练轮数;
  • 随机种子列表;
  • 评测脚本的版本;
  • 每个指标的均值和波动范围。

把这些和结论放在一起。只给一个分数表格,别人无法判断这个对比是否公平,也无法在你漏掉某个变量时发现它。

看完想直接上手?

软件下载即用,遇到问题加客服 QQ 475831049 直接问。