如何在Hugging Face Trainer中调用Macro-Precision指标?
Hugging Face Datasets未内置Macro-Precision的解决方案
你在老版datasets库的list_metrics里找不到宏精确率是正常的——datasets的指标模块早就拆分到独立的evaluate库了,老版本内置的指标覆盖本来就不全,要满足DEFT-2015数据集的结果对比需求,选以下任意一种方案都可以,优先选和你参考的公开研究口径一致的实现:
- 方案1:调用scikit-learn内置的宏精确率接口
这是和2015年前后研究使用的计算逻辑对齐度最高的方案,绝大多数早年NLP分类论文的宏精确率都是用这个接口算的,基本不会出现口径偏差。
示例代码:
提示:多分类/多标签场景下加from sklearn.metrics import precision_score # 传入真实标签序列、模型预测标签序列,指定average='macro'即为宏精确率 macro_p = precision_score(y_true=gold_labels, y_pred=model_preds, average='macro', zero_division=0)zero_division=0参数,是为了匹配DEFT-2015官方的计算规则,遇到没有预测样本的类别时直接记该类别精确率为0,不会触发计算报错。 - 方案2:用Hugging Face官方的
evaluate库加载精确率指标计算
如果你用的是Hugging Face Trainer做训练,这个方案和训练流程的兼容性最好,不需要额外做预测结果的格式转换。计算时只要指定平均模式为宏平均即可,不需要自己写计算逻辑。
示例代码:import evaluate precision = evaluate.load("precision") macro_p = precision.compute( predictions=model_preds, references=gold_labels, average="macro", zero_division=0 )["precision"] - 方案3:手动实现宏精确率计算逻辑
如果你参考的公开研究对边缘类别(无真实样本/无预测样本的类别)有特殊的计算规则,自己写逻辑可以100%对齐口径,避免第三方库默认规则带来的数值差。计算步骤很简单:- 遍历所有类别,分别统计每个类别的真阳性(预测为该类且真实标签为该类的样本数)、假阳性(预测为该类但真实标签不是该类的样本数)
- 逐类计算单类精确率:
单类P = 真阳性 / (真阳性 + 假阳性),分母为0时按参考研究的规则赋值(一般为0) - 所有类别的单类精确率求和,除以总类别数,得到最终的宏精确率
口径校验提示:拿到计算结果后,可以先抽1-2个类别手动算下精确率,核对和代码输出的单类值是否一致,避免标签编码错位(比如标签id和类别名映射错)导致的结果偏差,和公开结果对比时这点尤其重要。
内容的提问来源于stack exchange,提问作者Eliott Thomas
相关产品推荐
相关产品推荐

