Evaluate 怎样加载指标并处理批量预测
来源:17golang原创
时间:2026-11-14 21:02:19 261浏览 收藏
我第一次把模型预测接入 Evaluate 时,真正卡住的不是指标公式,而是“这一批结果到底什么时候交给指标对象”。如果数据很小,可以直接调用 compute();如果预测来自循环中的多个 batch,更稳妥的做法是先用 evaluate.load() 加载指标,再逐批调用 add_batch(),最后统一 compute()。
官方地址:https://huggingface.co/docs/evaluate/
把 Evaluate 想成一个带输入契约的指标容器:先确认它要接收哪些字段,再让每个预测批次和对应标签一起进入,所有批次完成后只计算一次。
先确认指标需要什么输入
Evaluate 的指标不是一个只接收任意两个列表的黑盒。加载后先看 features,可以确认字段名以及单个元素的形状。以分类准确率为例,最常见的字段就是 predictions 和 references。

import evaluate
# 先加载指标,再查看它声明的输入字段;字段名要和后续调用保持一致。
accuracy = evaluate.load("accuracy")
print(accuracy.features)
# 这里的 features 通常会说明 predictions 和 references 的数据类型。
这一步很适合排除“参数名写错”的问题。模型输出可能叫 logits、labels 或别的名字,但传给指标时仍要转换成该指标认识的 predictions 与 references。Evaluate 接受列表、NumPy 数组和部分张量格式,但输入语义不会因此改变。
用 evaluate.load 加载指标对象
最小加载方式是 evaluate.load("accuracy")。返回的对象同时提供一次性计算与增量提交接口。若名称存在歧义,还可以显式传入 module_type,但普通分类指标通常不需要额外参数。
import evaluate
# accuracy 是指标标识;返回对象后面会负责接收预测值和参考值。
metric = evaluate.load("accuracy")
# 小数据可以直接把完整数组交给 compute;关键字参数避免顺序传错。
result = metric.compute(
predictions=[1, 0, 0, 1],
references=[1, 1, 0, 1],
)
print(result)
结果是一个字典,而不是裸浮点数。官方示例展示的形式是 {'accuracy': 0.5},真实值取决于你的预测和标签。保留字典结构有一个好处:后续换成返回多个字段的指标时,调用方不必重新设计结果处理。
预测按批次到达时,用 add_batch 累积
实际推理经常是“拿一批输入、跑一批模型、得到一批预测”。这时没有必要为了调用一次 compute(),再把全部预测和标签复制到一个超大的列表里。每次得到一个 batch,就同时提交预测值和参考值。
import evaluate
metric = evaluate.load("accuracy")
# 每个元组代表一个已经完成推理的批次;两边必须一一对应。
batch_results = [
([0, 1], [0, 0]),
([1, 0], [1, 0]),
]
for references, predictions in batch_results:
# 只提交当前批次,Evaluate 会把数据放入指标对象的累计输入中。
metric.add_batch(
references=references,
predictions=predictions,
)
# 所有批次都提交后再计算,避免漏掉最后一个 batch。
result = metric.compute()
print(result)

这里最容易出现的错误是把参数方向写反,或者让一个 batch 的预测数量与参考值数量不一致。工程上可以在提交前做轻量的长度检查;检查失败时尽早报错,比等到最终指标阶段才发现样本错位更容易定位。
def add_checked_batch(metric, predictions, references):
# 先检查当前批次的样本数,防止预测与标签错位后继续累计。
if len(predictions) != len(references):
raise ValueError("predictions 和 references 的长度必须一致")
# 通过关键字传参,让字段含义清楚,也便于后续替换输入容器。
metric.add_batch(
predictions=predictions,
references=references,
)
compute 要放在所有批次之后
compute() 有两种常见用法:直接接收完整的 predictions 和 references,或者不带数据、读取前面通过 add()/add_batch() 累积的内容。不要在每个 batch 后都调用一次并把中间分数当成全量最终分数,除非你的业务明确需要观察阶段性结果。
如果循环没有产生任何 batch,直接计算可能无法表达“本轮没有样本”的业务含义;可以在业务层记录样本数,并在没有数据时返回自己的空结果。Evaluate 指标还可能要求额外字段,所以遇到缺少参数时,应回到 metric.features 和对应指标说明,而不是盲目添加同名参数。
一次性计算和批量计算怎么选
| 场景 | 推荐写法 | 关注点 |
|---|---|---|
| 数据已经在内存中且规模小 | metric.compute(predictions=..., references=...) | 调用短,适合脚本和小样本示例 |
| 预测在循环中分批产生 | 多次 add_batch(),最后一次 compute() | 每批字段对应,最后不要漏算 |
| 换了一个指标或模块 | 先查看 features,再传对应字段 | 不要假设所有模块都只需要两列 |
我会保留的排查顺序
出现结果为空、参数错误或分数异常时,我会按这个顺序看:第一,确认 evaluate.load() 加载的是预期模块;第二,打印 features 对照字段名;第三,检查每个 batch 的预测和参考值长度;第四,确认所有 batch 都调用了 add_batch();第五,最后才检查指标本身的计算语义。这个顺序的好处是先排输入契约,再排数据流,通常比从公式开始猜更快。
相关问题
可以每个 batch 都调用 compute 吗?
可以,但每次得到的通常只是当前累计状态下的结果,不等于把所有 batch 都处理完后的最终结果。批量推理场景一般在循环结束后统一调用。
add_batch 的 predictions 和 references 必须同长度吗?
应当保持同一批次逐样本对应。长度不一致时不要继续累计,先定位数据切分或模型输出的对齐问题。
什么时候直接传给 compute 更简单?
当完整预测和标签已经可靠地放在内存中,而且数据量不大时,直接传给 compute() 最清楚;一旦预测是流式或分批产生,再改用 add_batch()。
-
346 收藏
-
235 收藏
-
387 收藏
-
447 收藏
-
360 收藏
-
124 收藏
-
268 收藏
-
212 收藏
-
科技周边 · 人工智能 | 36分钟前 | python · 人工智能 · 并行处理 index Hugging Face Datasets Datasets shard num_shards contiguous417 收藏
-
280 收藏
-
科技周边 · 人工智能 | 38分钟前 | python · Transformers TextIteratorStreamer 流式生成 AsyncTextIteratorStreamer StoppingCriteria198 收藏
-
279 收藏
-
161 收藏
-
453 收藏
-
科技周边 · 人工智能 | 46分钟前 | 人工智能 · padding Transformers tokenizer max_length attention_mask truncation return_tensors352 收藏
-
科技周边 · 人工智能 | 49分钟前 | 人工智能 · 文本分类 softmax Transformers AutoModelForSequenceClassification logits id2label172 收藏
-
243 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习