TATECHATLAS
◎ 简体中文
人工智能 / 建议

在比较模型之前,先固定评估集和比较规则

在运行实验之前,必须固定评估集、指标、聚合规则和比较规则,以确保结果的可复现性,并防止单一的聚合指标掩盖模型在关键子集上的失败。

本文内容

单一的最终指标会将实验压缩为一个数字,从而掩盖模型在哪些方面获胜或失败。在运行实验之前,必须固定评估集、指标、聚合顺序和比较规则。评估集必须明确划分方式、子集、权重、指标方向和聚合方法。比较规则必须规定模型应在相同的划分上进行比较,每个子集应单独报告,且聚合结果应为加权平均值。这使得结果在不同运行和作者之间具有可复现性。Hugging Face 的 Evaluate 库和 scikit-learn 的 scoring API 都支持这种工作流程。Evaluate 让您可以一致地加载指标并进行计算,而 scikit-learn 的 scoring 参数定义了模型选择的评估规则。关键在于将规范记录在文件或配置中,以便相同的输入始终产生相同的输出。如果不这样做,模型可能会因为聚合值掩盖了在关键子集上的失败而显得更好。示例显示了两个分类器,准确率分别为 0.91 和 0.89,但在子集 B 上,召回率从 0.78 降至 0.62。如果仅报告聚合值,这种损失是不可见的。通过固定规范,报告会同时显示聚合值和每个子集的详细分解,从而使比较透明且有据可依。

背景与建议

在进行任何模型比较之前,必须固定评估规范。这意味着要在文件或配置中记录划分、子集、权重、指标及其方向。Hugging Face 的 Evaluate 库提供了加载指标并一致地进行计算的工具,而 scikit-learn 的 scoring 参数定义了模型选择的评估规则。当规则被记录下来时,两者都支持可复现的评估。建议创建一个评估规范,准确说明使用了哪些样本、计算了哪些指标以及如何聚合结果。如果没有这个规范,两次运行或两位作者可能会产生无法比较的不同数值。规范应包括聚合顺序(例如子集的加权平均值)以及模型在相同划分上进行比较的规则。这可以防止预处理或数据排序的意外更改改变结论。目标是使实验具有可复现性且比较过程透明。

评估规范应存储在 YAML 或 JSON 等文件中,以便进行版本控制和复用。该文件应列出划分、子集、权重、指标和比较规则。例如,一个分类实验可能会使用两个子集 A 和 B,权重分别为 0.6 和 0.4,以及两个指标:准确率和召回率,两者均为最大化。比较规则规定使用相同的划分,分别报告每个子集,且聚合值为加权平均值。该文件成为了实验的唯一事实来源。当运行两个模型时,它们都读取相同的规范,因此结果是直接可比的。报告应包括每个子集的得分和聚合值,而不仅仅是聚合值。这样,一个平均表现胜出的模型可能会被发现在一个关键子集上表现不佳。规范还记录了指标方向(如准确率和召回率最大化),从而使聚合具有意义。

Hugging Face 的 Evaluate 库和 scikit-learn 的 scoring API 是实现这一工作流程的实用工具。Evaluate 允许以一致的方式在数据集上加载指标并进行计算。scikit-learn 的 scoring 参数为交叉验证和参数搜索定义了模型评估规则。这两个库都支持“评估是一套规则,而不仅仅是一个数字”的观点。关键是将规则记录在文件或配置中,以便相同的输入始终产生相同的输出。这在涉及多个作者或多次运行时尤为重要。规范应与团队共享,并作为最终报告的基础。报告应显示原始的子集数值、聚合值和比较规则。这使得实验是可审计的,结论是站得住脚的。

本任务中的示例显示了两个分类器,准确率分别为 0.91 和 0.89,但在子集 B 上,召回率从 0.78 降至 0.62。如果仅报告聚合值,这种损失是不可见的。通过固定规范,报告会同时显示聚合值和每个子集的详细分解,从而使比较透明且有据可依。同样的原则也适用于任何使用多个子集或指标的领域。评估集必须固定,规则必须记录,且报告必须显示详细分解。这防止了基于一个掩盖了重要失败的单一数字来选择模型的常见错误。规范应在实验开始前创建,而不是在结果已知后创建。这确保了比较的公平性,并且结论是基于预先注册的规则得出的。

eval_spec:
  splits: [train, validation, test]
  subsets:
    A: {weight: 0.6}
    B: {weight: 0.4}
  metrics:
    accuracy:
      direction: maximize
    recall:
      direction: maximize
  comparison:
    same_splits: true
    report_per_subset: true
    aggregate: weighted_average

原理与权衡

单一的最终指标简化了排名,但掩盖了误差在子组、时间跨度(horizons)和误差类型中的分布情况。

权衡显而易见:记录规则需要前期的额外工作,但当考虑到关键子集时,单一的聚合值可能会逆转排名。编写规范文件只需几分钟;而发现模型在少数群体子集上失败可能需要数周时间。这种成本的不对称性使得编写规范更具优势。

在示例中,模型 X 的准确率为 0.91,模型 Y 的准确率为 0.89。在子集 B 上,召回率从模型 Y 的 0.78 降至模型 X 的 0.62。如果聚合值是子集 A 和 B 的准确率加权平均值(权重分别为 0.6 和 0.4),则模型 X 的总分为 0.91,而模型 Y 的总分为 0.89。聚合值的差异仅为 0.02,但子集 B 上的召回率差距为 0.16,这是一个被单一数字所掩盖的逆转。

固定的规范强制要求报告同时显示聚合值和每个子集的详细分解。如果没有规范,分析师可能会根据较高的聚合值选择模型 X,而忽略了在子集 B 上的召回率失败。有了规范,比较变得透明,失败在部署前就是可见的。

# Evaluation spec used for model comparison
spec = {
    "splits": ["train", "validation", "test"],
    "subsets": {"A": 0.6, "B": 0.4},
    "metrics": {"accuracy": "maximize", "recall": "maximize"},
    "aggregate": "weighted_average"
}

# Example: compare two models on the same splits with per-subset reporting
# Model X: accuracy 0.91, recall on subset B 0.62
# Model Y: accuracy 0.89, recall on subset B 0.78
# The aggregate alone hides the subset B failure for Model X

# The same spec is used for both models so the comparison is fair
# Report per-subset scores and the weighted aggregate
# This prevents a high aggregate from hiding a low score on a critical subset

具体说明

考虑两个分类器,它们在一个数据集上进行评估,该数据集分为子集 A(占样本的 60%)和子集 B(占样本的 40%)。模型 X 在 A 上的准确率为 0.91,在 B 上为 0.90。模型 Y 在 A 上的准确率为 0.88,在 B 上为 0.90。模型 X 的加权聚合准确率为 0.6 * 0.91 + 0.4 * 0.90 = 0.906,而模型 Y 的加权聚合准确率为 0.6 * 0.88 + 0.4 * 0.90 = 0.888。模型 X 在聚合指标上领先 0.018。

现在专门查看子集 B 上的召回率。模型 X 在 B 上的召回率为 0.62,而模型 Y 在 B 上的召回率为 0.78。差距为 0.16,远大于 0.018 的聚合准确率差异。如果子集 B 代表一个关键的少数群体,其中漏报的代价很高,那么模型 X 表现出的优势就是虚假的。

固定的规范规定必须单独报告子集 B 上的召回率,并且比较规则要求具备子集可见性。当根据规范生成报告时,聚合值和每个子集的召回率会并排显示。读者会看到模型 X 在聚合准确率上胜出,但在子集 B 的召回率上表现糟糕,从而可以做出明智的决定,而不是盲目信任一个数字。

这个实际案例展示了规范在操作层面的重要性。如果没有规范,分析师计算出一个准确率数字,看到 0.91 对比 0.89,然后选择了模型 X。有了规范,同一名分析师被要求展示详细分解,子集 B 上的召回率失败将变得无法忽视。

eval_spec:
  splits: [train, validation, test]
  subsets:
    A: {weight: 0.6}
    B: {weight: 0.4}
  metrics:
    accuracy:
      direction: maximize
    recall:
      direction: maximize
  comparison:
    same_splits: true
    report_per_subset: true
    aggregate: weighted_average

# Model X: accuracy 0.91, recall on subset B 0.62
# Model Y: accuracy 0.89, recall on subset B 0.78
# Aggregate alone hides the subset B failure for Model X
# The report must show per-subset scores and the weighted aggregate

适用范围的限制

当调整超参数时,这种方法不能取代独立的最终测试集。它本身不能提供统计显著性;对于微小或有噪声的差异,需要进行正式检验。只有在评估集和规则保持不变时,结果才具有可比性,因为更改划分或权重需要重新进行比较。它还不能消除根据数据类型选择验证策略(如交叉验证或按时间顺序划分)的必要性。该方法假设存在多个子集或指标,并且决策是基于模型比较的。它无法保证加权聚合符合正确的业务目标,并且在没有配对编码器和独立参考标签的情况下,无法对齐嵌入空间或建立相关性基准真相。

当评估集包含具有不同操作成本的不同子组时,当多个作者或团队必须复现结果时,以及当决策阈值足够接近以至于单一数字可能逆转排名时,这种方法最为有效。

eval_spec:
  splits: [train, validation, test]
  subsets:
    A: {weight: 0.6}
    B: {weight: 0.4}
  metrics:
    accuracy:
      direction: maximize
    recall:
      direction: maximize
  comparison:
    same_splits: true
    report_per_subset: true
    aggregate: weighted_average

适用条件

  • 在运行任何模型之前,评估规范是否列出了所有的划分、子集、权重和指标方向?
  • 在比较两个模型时,是否使用了相同的划分和预处理方式?
  • 聚合值是否是各子集得分的加权平均值,而不是单一的汇总指标?
  • 报告是否包含每个子集的结果,以免高聚合值掩盖关键子集上的低分?
  • 是否记录了指标方向,例如准确率和召回率是最大化还是误差指标是最小化?
  • 评估集是否进行了版本控制或详细描述,以便结果在不同运行之间具有可比性?
  • 如果差异较小或存在噪声,比较是否包含了统计检验?
  • 最终测试集是否与用于模型选择的评估集保持分离?
  • 评分规则是否记录在可供他人复用的文件或配置中?
  • 报告是否显示了原始的子集数值,而不仅仅是聚合值?

当调整超参数时,此方法不能取代独立的最终测试集。它本身不能提供统计显著性;对于微小或有噪声的差异,需要进行正式检验。只有在评估集和规则保持不变时,结果才具有可比性,因为更改划分或权重需要重新进行比较。它还不能消除根据数据类型选择验证策略(如交叉验证或按时间顺序划分)的必要性。该方法假设存在多个子集或指标,并且决策是基于模型比较的。它无法保证加权聚合符合正确的业务目标,并且在没有配对编码器和独立参考标签的情况下,无法对齐嵌入空间或建立相关性基准真相。

参考来源

  1. Hugging Face: evaluation ↗
  2. scikit-learn: model evaluation ↗
返回顶部 ↑