分类评估指标:准确率、精确度、召回率和 F1 详解

概述

在构建分类系统时,我们需要一种方法来评估分类模型的性能,我们希望有能够反映分类模型真实性能的评估指标。准确率(Accuracy)、精确度(Precision)、召回率(Recall)和 F1 分数都是评估分类模型性能的指标。

分类任务可以分为以下两类:

  • 二分类:类别数为二,例如垃圾邮件分类,分为垃圾邮件和非垃圾邮件两类。
  • 多分类:类别数大于二,例如将电子商务查询电子邮件分为三种类型:运输、退货或跟踪。

二分类任务评测

为了直观地解释这些概念,让我们考虑一个简单的例子,假设我们有一个用于预测邮件是否为垃圾邮件的分类模型,我们的任务是将电子邮件列表分为两类:垃圾邮件或非垃圾邮件。我们将用整数 1(或正数)表示垃圾邮件,用 0(或负数)表示非垃圾邮件。这里我们有一个包含 20 个电子邮件标题的数据集,我们将每个数据点通过二元分类模型来获得预测类别,然后将其与实际类别进行比较,分类模型返回以下结果:

准确率

准确率(Accuracy) : 准确率是分类正确的样本数占总样本数的比例。也就是说,它是模型正确预测正类和负类的总次数除以总的预测次数。

准确率 = (真正例 + 真负例) / (真正例 + 假正例 + 真负例 + 假负例)

在我们的例子中,我们有20封邮件,模型正确地识别出了15封邮件的真实类别(不管是垃圾邮件还是非垃圾邮件),那么准确率就是75%。

准确性通常被用作分类性能的衡量标准,因为它计算简单且易于解释,然而在处理正负样本不平衡的数据时,它可能会产生误导。让我们回到我们的数据集来理解这一点,假设分类器没有学习任何内容 ,只是将所有输出分类为 0(不是垃圾邮件),我们将在 20 个正确分类中得到 17 个,这意味着 85% 的极高准确度!显然,我们不能说模型的性能很好,因此必须有一种比单独使用准确度更好的方法来衡量分类模型的性能。在介绍其他指标之前有必要了解一下混淆矩阵。

  • 优点:
    • 直观易懂,用于度量分类正确的样本与总样本数之比。
    • 对于均衡数据集(每个类的样本数相近)很有用。
  • 缺点:
    • 在不平衡数据集上可能会产生误导性的高分数,即使模型对少数类别预测效果很差。
    • 不适合评估需要对某一类别更敏感的任务。

混淆矩阵

在我们的例子中,我们将事件(1 - 垃圾邮件)称为"正",将事件(0 - 非垃圾邮件)称为"负"。二分类的混淆矩阵是一个 2×2 矩阵,其中每一列代表一个类,如下所示:

混淆矩阵将分类结果分为四类:

  • 真正例(TP):True Positive(简写为TP)表示实际上这个样本为Positive,模型也把这个样本预测为Positive的情况。这是我们预测正确的部分。
  • 真负例 (TN):True Negative(简写为TN)表示实际上这个样本为Negative,模型也把这个样本预测为Negative的情况。这是我们预测正确的部分。
  • 假正例 (FP):False Positive(简写为FP)表示实际上这个样本为Negative,但是模型预测为了Positive的情况。这是预测错误的部分,也是统计学上的第一类错误(Type I Error)。
  • 假负例(FN):False Negative(简写为FN)表示实际上这个样本为Positive,但是模型预测为了Negative的情况。这是预测错误的部分,也是统计学上的第二类错误(Type II Error)。

应用于前面的数据集,我们得到以下值:

  • 真正例(TP):1
  • 真负例 (TN):14
  • 假正例 (FP):3
  • 假负例(FN):2

我们可以将这些值填充到混淆矩阵中,如下所示:

我们还可以将混淆矩阵映射到我们之前看到的准确率公式,如下所示:

现在我们可以通过这个矩阵了解为什么准确性有时会隐藏不平衡数据集的细微差别,原因是在此类数据集中,真负例(真正的非垃圾邮件)类别占主导地位,削弱了其余类别的影响。因此,即使分类模型在其他三个类别中表现不佳,其准确性仍然看起来不错,掩盖了其缺陷。

精确率

精确度(Precision) : 精确度是在所有被模型预测为正类的样本中,实际上为正类的样本的比例。它反映了模型预测为正类的结果的可信度。在信息检索领域,precision也被称为"查准率"

精确度 = 真正例 / (真正例 + 假正例)

在我们的例子中,我们有20封邮件,模型预测了4封邮件是垃圾邮件,但实际上只有1封是垃圾邮件,那么精确度就是1/4或25%。

从上图精确率的计算中可以看到真负例(真正的非垃圾邮件)不再参与计算,精确率反映了模型预测为正类(垃圾邮件)结果的可信度。虽然之前的准确率高达 75%,但是我们发现精确度只有25%。对于正负样本不平衡的数据,只关注准确率无法衡量模型的性能。

  • 优点:
    • 关注模型在预测为正类(例如,患病)的样本中有多少是正确的。
    • 适合在误报(false positives)成本高的情况下使用,例如垃圾邮件检测中将非垃圾邮件预测为垃圾邮件,这就是误报的成本很高,需要减少误报(FP),来提高精确率。
  • 缺点:
    • 不考虑被错误分类为负类(false negatives)的正类样本。
    • 可能会忽略实际正类样本中的很大一部分。

召回率

召回率(Recall) : 召回率是在所有实际为正类的样本中,被模型正确预测为正类的样本的比例。它反映了模型捕获正类样本的能力。在信息检索领域,recall也被称为"查全率"。

召回率 = 真正例 / (真正例 + 假负例)

在我们的例子中,我们有20封邮件,实际上有3封是垃圾邮件,被模型正确预测为垃圾邮件的有1封,那么召回率就是1/3或33%。

  • 优点:
    • 关注在所有实际正类样本中,有多少被模型正确预测。
    • 适合在漏报(遗漏真正的正例,即FN)代价很高的情况下使用,如疾病筛查。
  • 缺点:
    • 不考虑错误分类为正类的负类样本(false positives)。
    • 可能导致模型过分关注正类而忽略负类的预测精度。

精确率和召回率的区别

精确率和召回率的区别是分母不同,精确率的分母是模型预测为正样本的数量(TP+FP),关注的是模型预测的正样本,召回率的分母是实际为正样本的数量(TP+FN),关注的是实际的正样本。

我们应该优先考虑哪个指标------精确率还是召回率?

答案是,这取决于我们任务的性质,让我们看看为什么。

例如,我们有1000封邮件,其中垃圾邮件有100封,仍然是希望预测出其中的垃圾邮件。

如果我们希望precision高,那么在极端情况下,我们只把最最可能是垃圾邮件的那一封邮件,也就是No.1的那一封挑出来,这时候precision高达 1/1 = 100%。但是,Recall相应的就会非常低就只有 1/100 = 1%。

如果我们希望recall高,那么极端情况下,我们只要无脑把所有的样本都预测为垃圾邮件,那么此时我们的recall就可以高达 100/100 = 100%,但是此时precision相应的只有 100/1000 = 10%。

我们发现,如果仅仅看recall或者precision中的一个,有可能会在不知情的情况下走向极端;而Accuracy又会受到不平衡样本的影响。

对于垃圾邮件分类任务,可能更希望避免重要的电子邮件被移入垃圾邮件文件夹,而不是将偶尔的垃圾邮件移入收件箱,因此对于这项任务,我们希望优先考虑精确度而不是召回率。

  • 精确率高意味着较少的误报,即较少的非相关实例被错误地识别为相关。
  • 召回率高意味着较少的漏报,即更多的相关实例被正确地识别出来。

如何选择:

选择精确率还是召回率取决于具体应用和业务目标。

  • 如果错误的预测正类(误报)的成本非常高,你可能会倾向于更高的精确率。例如,在推荐系统中,如果系统频繁推荐用户不喜欢的产品,将导致用户体验下降。
  • 如果错过实际正类(漏报)的成本非常高,你可能会选择更高的召回率。例如,在疾病筛查中,错过一个病例的代价可能是生命,因此需要更高的召回率。

在某些情况下,你可能需要在精确率和召回率之间找到一个折衷。这时候可以使用F1分数作为综合指标,它结合了精确率和召回率的信息,提供了一个平衡两者的方式。如果精确率和召回率同等重要,那么F1分数是一个很好的选择。但是在某些情况下,可能需要根据具体应用调整对精确率和召回率的权重,这时可以使用F-β分数(一个更一般化的F1分数)来调整精确率和召回率之间的相对重要性。

F1分数

F1 分数: F1 分数是精确度和召回率的调和平均值,它同时考虑精确度和召回率,给出一个总体的性能指标。

F1 = 2 * (精确度 * 召回率) / (精确度 + 召回率)

如果精确度是25%而召回率是33%,F1 分数就是 2 * (0.25 * 0.33) / (0.25 + 0.33) ≈ 0.28 或 28%。

F1 提供了精确率和召回率之间的平衡

  • 优点:
    • 是精确率和召回率的调和平均,平衡了精确率和召回率。
    • 对于不平衡数据集,比单纯的准确率指标更有信息量。
    • 适合在精确率和召回率都同等重要的场景中使用。
  • 缺点:
    • 不考虑真正的负类样本,即对于多分类问题可能不够灵敏。
    • 在一些情况下,可能需要更侧重于精确率或召回率,F1分数可能会隐藏模型在这两个方面的潜在偏差。

多分类任务评测

在多类别分类问题中,宏平均(Macro Average)和微平均(Micro Average)是两种常用的方法来计算整体的精确率、召回率和F1分数。这两种方法考虑了类别不平衡的情况,即不同类别的样本数量可能不同。

宏平均

在多分类任务中,宏平均是对每个类别独立计算指标,然后取所有类别指标的平均值。

宏平均(Macro Average)计算方法:

  • 对每个类别单独计算精确率、召回率和F1分数。
  • 然后计算所有类别精确率、召回率和F1分数的算术平均值。

宏平均精确率 = (精确率1 + 精确率2 + ... + 精确率N) / N

宏平均召回率 = (召回率1 + 召回率2 + ... + 召回率N) / N

宏平均F1分数 = (F1分数1 + F1分数2 + ... + F1分数N) / N

其中N是类别的数量。

宏平均计算举例

下面通过一个例子来展示如何计算多分类任务中的宏平均精确率、召回率和F1分数。假设我们的任务是将电子商务客户电子邮件列表分类为三个类别之一:发货、退货和跟踪,将分别用整数值 0、1 和 2 来表示每个类。

这里我们有一个包含 15 个电子邮件标题的数据集。我们将每个数据点通过多类分类器来获得预测类别,然后将其与实际类进行比较。

首先,准确率的计算与二分类相同------正确预测的数量除以预测的总数。对于我们的数据集,有 10 个正确的预测和 5 个错误的预测,这使我们的准确率为 10/15 ≈ 67%。

接下来,为了计算精度、召回率和 F1,我们将构建混淆矩阵。由于我们有三个类,因此矩阵现在变成了 3×3 矩阵,每一列代表一个类。应用于我们的数据集,我们得到以下矩阵:

在这个混淆矩阵中,行表示真实的类别,列表示模型的预测类别,对角线上的值是每个类别的真正例(TP)。

首先,我们计算每个类别的精确率和召回率:

对于类别 0(Shipping):

  • TP(0) = 3
  • FP(0) = 1 + 0 = 1
  • FN(0) = 0 + 2 = 2
  • 精确率(0) = TP(0) / (TP(0) + FP(0)) = 3 / (3 + 1) = 0.75
  • 召回率(A) = TP(0) / (TP(0) + FN(0)) = 3 / (3 + 2) = 0.60
  • F1分数(A) = 2 * (精确率(A) * 召回率(A)) / (精确率(A) + 召回率(A)) = 2 * (0.75 * 0.60) / (0.75 + 0.60) ≈ 0.67

对于类别 1(Returns):

  • TP(1) = 4
  • FP(1) = 0 + 2 = 2
  • FN(1) = 1 + 0 = 1
  • 精确率(1) = TP(1) / (TP(1) + FP(1)) = 4 / (4 + 2) = 0.67
  • 召回率(1) = TP(1) / (TP(1) + FN(1)) = 4 / (4 + 1) = 0.80
  • F1分数(B) = 2 * (0.67 * 0.80) / (0.67 + 0.80) ≈ 0.73

对于类别 2(Tracking):

  • TP(2) = 3
  • FP(2) = 2 + 0 = 2
  • FN(2) = 0 + 2 = 2
  • 精确率(2) = TP(2) / (TP(2) + FP(2)) = 3 / (3 + 2) = 0.60
  • 召回率(2) = TP(2) / (TP(2) + FN(2)) = 3 / (3 + 2) = 0.60
  • F1分数(2) = 2 * (0.60 * 0.60) / (0.60 + 0.60) ≈ 0.60

现在,我们用这些值来计算宏平均指标:

宏平均精确率 = (精确率(0) + 精确率(1) + 精确率(2) ) / 3 = (0.75 + 0.67+ 0.6) / 3 ≈ 0.66

宏平均召回率 = (召回率(0) + 召回率(1) + 召回率(2) ) / 3 = (0.60 + 0.80 + 0.60) / 3 ≈ 0.67

宏平均F1分数 = (F1分数(0) + F1分数(1) + F1分数(2) ) / 3 = (0.67 + 0.73 + 0.60) / 3 ≈ 0.66

因此,我们计算得到的多个类别的宏平均F1分数大约为0.66,它代表了模型在所有类别上的平均性能,不考虑类别之间的样本数量不平衡。通过宏平均,我们可以了解模型在所有类别上的整体表现,特别适用于类别平衡的情况或者你想给每个类别同等的重要性。

微平均

在多分类任务中,微平均(Micro Average)用于计算整个数据集的统一精确率和召回率,而不区分不同的类别。

微平均(Micro Average)计算方法:

  • 将所有类别的真正例(TP)、假正例(FP)和假负例(FN)累加起来,得到总的TP、FP和FN。
  • 然后使用这些总量来计算整体的精确率、召回率和F1分数。

微平均精确率 = 总TP / (总TP + 总FP)

微平均召回率 = 总TP / (总TP + 总FN)

微平均F1分数 = 2 * (微平均精确率 * 微平均召回率) / (微平均精确率 + 微平均召回率)

微平均计算举例

下面通过一个例子来展示如何计算多分类任务中的微平均精确率和召回率。我们还是以前面的任务举例:

假设我们的任务是将电子商务客户电子邮件列表分类为三个类别之一:发货、退货和跟踪,将分别用整数值 0、1 和 2 来表示每个类。

在这个混淆矩阵中,行表示真实的类别,列表示模型的预测类别,对角线上的值是每个类别的真正例(TP)。

首先,我们计算每个类别的真正例(TP),假正例(FP)和假负例(FN)。

对于类别 0 :

  • TP(0) = 3(预测和真实都是0的数量)
  • FP(0) = 1 + 0 (其他真实类别预测为0的数量)
  • FN(0) = 0 + 2(预测为其他类别,但真实为0的数量)

类似地,我们可以计算B、C和D的TP、FP和FN。

然后,我们将所有类别的TP、FP和FN合计起来得到总的TP、FP和FN。

总TP = TP(0) + TP(1) + TP(2)

总FP = FP(0) + FP(1) + FP(2)

总FN = FN(0) + FN(1) + FN(2)

使用上面的混淆矩阵数据,我们有:

总TP = 3 + 4 + 3 = 10

总FP = 1 + 0 + 0 + 2 + 2 + 0 = 5

总FN = 0 + 2 + 1 + 0 + 0 + 2 = 5

现在我们可以计算微平均精确率和召回率:

微平均精确率 = 总TP / (总TP + 总FP)

微平均召回率 = 总TP / (总TP + 总FN)

计算得出:

微平均精确率 = 10 / (10 + 5) ≈ 0.66

微平均召回率 = 10 / (10 + 5) ≈ 0.66

最后,如果需要计算微平均F1分数,可以使用以下公式:

微平均F1分数 = 2 * (微平均精确率 * 微平均召回率) / (微平均精确率 + 微平均召回率)

微平均F1分数 = 2 * (0.66 * 0.66) / (0.66 + 0.66) ≈ 0.66

这样,我们得到了微平均精确率、召回率和F1分数,它们反映了模型在整个数据集上的总体性能,不考虑类别间的不平衡。

宏平均和微平均的区别

宏平均和微平均的区别在于它们对不同类别的权重处理。宏平均给予每个类别相同的权重,不论类别的样本数量大小。因此,它可能会受到小类别(样本数量少的类别)的过度影响。微平均则将所有类别的贡献视为等同,无论类别的大小,因此在每个样本对结果有同等贡献时,微平均可能是更好的选择。

通常情况下:

  • 如果你关心的是每个类别的平等权重,比如在进行文档分类时,每个类别都同等重要,那么可以使用宏平均。
  • 如果你关心的是每个样本的平等权重,比如在预测用户行为时,每个用户的行为都同等重要,那么可以使用微平均。

在类别不平衡的数据集中,微平均可能更能反映模型的实际性能,因为它确保了大类别不会对整体的评估指标产生过大影响。

评测指标计算工具

前面详细介绍了一下分类任务常用评价指标的计算方法,在评测的时候可以根据计算公式自定义方法计算指标,也可以现成的开源工具进行计算,下面我将介绍一下 Hugging Face 开源的 evaluate ,以及如何通过 evaluate 计算精确率、召回率和F1分数。

evaluate 库介绍

Hugging Face 开源的 evaluate 是一个构建在其 Transformers 库之上的评估工具库,它提供了一种简单、统一的方式来评估机器学习模型,特别是自然语言处理(NLP)领域的模型。evaluate 旨在使评估模型变得更加容易、灵活和可复现。

evaluate 库的关键特点包括:

  1. 多样的评估指标: 提供了一系列标准化的评估指标,用于不同类型的NLP任务,如文本分类、序列标注、问答和语言生成等。这些指标包括但不限于准确率(accuracy)、F1分数、BLEU、ROUGE和METEOR等。
  2. 简单的API: evaluate 设计了简单直观的API,易于使用。用户只需少量代码就可以计算各种评估指标。
  3. 与Transformers库集成: evaluate 与 Hugging Face 的 Transformers 库紧密整合,方便用户在模型训练和测试过程中直接应用评估指标。
  4. 社区贡献: Hugging Face社区鼓励用户贡献新的评估指标和数据集,这些社区驱动的贡献都经过严格的审核,确保质量和可用性。
  5. 结果复现: 由于评估指标的标准化和自动化,evaluate 可以帮助研究人员和开发者更容易地复现实验结果,从而促进透明度和学术诚信。

evaluate 库包含了一系列的评估指标和数据集,允许用户使用一致的接口来计算常用的指标,比如准确率(accuracy)、精确率(precision)、召回率(recall)、F1 分数等。此外,该库也支持更具体的任务相关指标,比如机器翻译的 BLEU 分数、文本生成的 ROUGE 分数等。

使用 evaluate 库可以非常方便地对模型进行评估。用户只需要加载相应的指标,并将模型的预测输出以及真实标签传递给评估函数即可获得评估结果。这样做的好处在于,用户无需自己编写评估代码,可以保证评估结果的准确性和可比较性。

evaluate 库使用

使用 Hugging Face 的 evaluate 库进行模型评估通常涉及以下步骤:

  1. 安装 evaluate : 首先需要安装 evaluate 库。可以使用 pip 进行安装:

    pip install evaluate

  2. 选择评估指标 : 根据你的任务类型,选择适合的评估指标。evaluate 库支持多种指标,如accuracy, precision, recall, f1 等。你可以访问Hugging Face 的 evaluate 页面查看支持的所有指标。

  3. 加载评估指标: 通过 evaluate 库中的 load 函数加载你选择的评估指标:

ini 复制代码
import evaluate
# 加载计算准确率的指标
accuracy = evaluate.load("accuracy")
  1. 收集模型预测和真实标签: 在你有了模型的预测输出和对应的真实标签后,就可以计算指标了。这些数据可以来自于验证集、测试集或者其他任何你想要评估模型性能的数据集。
  2. 计算指标: 调用指标对象的 compute 方法,传入预测和标签,计算得到评估结果:
ini 复制代码
predictions = [...] # 模型的预测结果列表
references = [...]  # 真实标签列表
results = accuracy.compute(predictions=predictions, references=references)
  1. 分析结果: 查看计算得到的指标值,分析模型的性能。根据需要,你可以对模型进行调优,然后重复上述步骤进行评估,直到达到满意的性能水平。
  2. (可选)使用多个指标: 有时候,你可能需要根据多个指标来综合评估模型性能。在这种情况下,可以重复加载和计算步骤,针对不同的指标进行评估。

这个流程的优点是它提供了一个标准化且易于使用的方式来评估模型,而且可以确保评估的一致性和可复现性。通过 evaluate 库,研究者和开发者能够更专注于模型的开发和改进,而不需要花费过多的时间在实现和校验评估指标上。

计算准确率

使用 accuracy 计算准确率,官网中给出的运行代码如下:

python 复制代码
import evaluate

accuracy_metric = evaluate.load("accuracy")
results = accuracy_metric.compute(references=[0, 1], predictions=[0, 1])
print(results) # {'accuracy': 1.0}

直接运行上面的代码会报错,因为默认情况下 evaluate.load("accuracy")会从 huggingface 下载对应 metric 评测文件,也从 huggingface 找到 metrics/accuracy/accuracy.py文件,但是在国内无法访问 huggingface,所以需要在evaluate.load()方法中指定 accuracy.py文件的路径才能运行。

在使用 evaluate.load()加载评测脚本时,其中的参数 path 是计算处理脚本路径,可以是处理脚本路径或包含该脚本的目录(如果该脚本与该目录具有相同的名称) ,例如./metrics/rouge ./metrics/rouge/rouge.py

下面我将使用 evaluate 工具对我们前面多分类任务的评估指标,宏平均和微平均进行计算,如下所示:

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]

accuracy_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/accuracy", module_type='metric')
results = accuracy_metric.compute(references=actual, predictions=predicted)

print(results)
# 输出结果:{'accuracy': 0.6666666666666666}

其中 accuracy.py 文件可以从 github.com/huggingface... 下载。

计算精确率

使用 precision 计算精确率:

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]

precision_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/precision", module_type='metric')
results = precision_metric.compute(references=actual, predictions=predicted, average='macro')

print(results) 
# 输出结果:{'precision': 1.0}

计算召回率

使用 recall 计算召回率:

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]


recall_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/recall", module_type='metric')
results = recall_metric.compute(references=actual, predictions=predicted, average='macro')
print(results)
# 输出结果:{'recall': 0.6666666666666666}

计算F1分数

使用 F1 计算F1分数:

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]

f1_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/f1", module_type='metric')
results = f1_metric.compute(references=actual, predictions=predicted, average='macro')

print(results) 
# 输出结果:{'f1': 0.6646464646464646}

同时计算精确率、召回率、F1分数

二分类

对于二分类评估指标精确率、召回率、F1分数的计算,可以使用如下方式直接计算出来,下面将以前面的二分类的例子计算相关的评测指标,例子中的 20 个样本分类如下:

可以直接使用下面的代码计算评估结果:

python 复制代码
import evaluate

actual  =   [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
predicted = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]

accuracy_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/accuracy", module_type='metric')
precision_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/precision", module_type='metric')
recall_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/recall", module_type='metric')
f1_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/f1", module_type='metric')

clf_metrics = evaluate.combine([accuracy_metric, precision_metric, recall_metric, f1_metric])

result = clf_metrics.compute(predictions=predicted, references=actual)

print(result)
# 输出结果如下:
"""
{
 'accuracy': 0.75,
 'precision': 0.25,
 'recall': 0.3333333333333333,
 'f1': 0.28571428571428575
 }
"""

多分类

对于多分类任务,我们可以分别计算各个评测指标,然后将结果合并到一下,下面介绍一下使用evaluate 工具对我们前面多分类任务的评估指标,宏平均和微平均进行计算。分别用整数值 0、1 和 2 来表示每个类,如下所示:

  • 发货: 0
  • 退货: 1
  • 跟踪: 2

宏平均计算 ,需要在 compute()方法中指定 average='macro'

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]

# 准确率
accuracy_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/accuracy", module_type='metric')
accuracy_results = accuracy_metric.compute(references=actual, predictions=predicted)

# 精确率
precision_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/precision", module_type='metric')
precision_results = precision_metric.compute(references=actual, predictions=predicted, average='macro')

# 召回率
recall_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/recall", module_type='metric')
recall_results = recall_metric.compute(references=actual, predictions=predicted, average='macro')

# F1分数
f1_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/f1", module_type='metric')
f1_results = f1_metric.compute(references=actual, predictions=predicted, average='macro')

results = {
    **accuracy_results, 
    **precision_results,
    **recall_results,
    **f1_results,
}
results
# 输出结果
"""
{
 'accuracy': 0.6666666666666666,
 'precision': 0.6722222222222222,
 'recall': 0.6666666666666666,
 'f1': 0.6646464646464646
}
"""

微平均计算 ,需要在 compute()方法中指定 average='micro'

python 复制代码
import evaluate

actual  =   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
predicted = [0, 0, 2, 0, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2]

# 准确率
accuracy_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/accuracy", module_type='metric')
accuracy_results = accuracy_metric.compute(references=actual, predictions=predicted)

# 精确率
precision_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/precision", module_type='metric')
precision_results = precision_metric.compute(references=actual, predictions=predicted, average='micro')

# 召回率
recall_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/recall", module_type='metric')
recall_results = recall_metric.compute(references=actual, predictions=predicted, average='micro')

# F1分数
f1_metric = evaluate.load(path="/Users/xiniao/myproject/evaluate/metrics/f1", module_type='metric')
f1_results = f1_metric.compute(references=actual, predictions=predicted, average='micro')

results = {
    **accuracy_results, 
    **precision_results,
    **recall_results,
    **f1_results,
}
results
# 输出结果
"""
{
 'accuracy': 0.6666666666666666,
 'precision': 0.6666666666666666,
 'recall': 0.6666666666666666,
 'f1': 0.6666666666666666
}
"""

可以看到与我们前面通过公式计算的结果是一致的。

参考文档

Classification Evaluation Metrics: Accuracy, Precision, Recall, and F1 Visually Explained

huggingface.co/evaluate-me...

机器学习的评价指标(一):Accuracy、Precision、Recall、F1 Score

相关推荐
Code哈哈笑2 小时前
【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
数据库·spring boot·后端·mysql·mybatis·交互
Javatutouhouduan2 小时前
线上问题排查:JVM OOM问题如何排查和解决
java·jvm·数据库·后端·程序员·架构师·oom
多多*2 小时前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet
Villiam_AY3 小时前
Go 后端中双 token 的实现模板
开发语言·后端·golang
拾贰_C7 小时前
【SpringBoot】MyBatisPlus(MP | 分页查询操作
java·spring boot·后端·spring·maven·apache·intellij-idea
就叫飞六吧13 小时前
Spring Security 集成指南:避免 CORS 跨域问题
java·后端·spring
冼紫菜14 小时前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos
秋野酱15 小时前
Spring Boot 项目的计算机专业论文参考文献
java·spring boot·后端
香饽饽~、15 小时前
【第二篇】 初步解析Spring Boot
java·spring boot·后端