【问题标题】:Precision/recall for multiclass-multilabel classification多类多标签分类的精度/召回率
【发布时间】:2023-03-08 19:25:01
【问题描述】:

我想知道如何计算多类多标签分类的精度和召回度量,即有两个以上标签的分类,每个实例可以有多个标签?

【问题讨论】:

  • +1 没有 cmets 的反对票是怎么回事?我有同样的问题,我很高兴我找到了这个页面。 @ThomasJungblut 我了解如何计算给定类的精度,例如A 类,但我应该如何计算所有类的精度?它是每个类精度的算术平均值吗?
  • 我发现了一个类似的问题,这可能是重复的:stackoverflow.com/questions/3856013/…
  • 这个问题似乎是题外话,因为它询问教科书公式而不是对其进行编程,因此属于 CrossValidated。其实在问这个问题前几天就已经回答好了:stats.stackexchange.com/questions/21551/…

标签: machine-learning classification multilabel-classification precision-recall


【解决方案1】:

答案是您必须计算每个类别的准确率和召回率,然后将它们平均在一起。例如。如果您对 A、B 和 C 进行分类,那么您的精度是:

(precision(A) + precision(B) + precision(C)) / 3

召回也一样。

我不是专家,但这是我根据以下来源确定的:

https://list.scms.waikato.ac.nz/pipermail/wekalist/2011-March/051575.html http://stats.stackexchange.com/questions/21551/how-to-compute-precision-recall-for-multiclass-multilabel-classification

【讨论】:

  • 如果您的数据中的标签数量不平衡,则此平均值可能无法反映真实性能。
【解决方案2】:
  • 假设我们有一个带有标签 A、B 和 C 的 3 类多分类问题。
  • 首先要做的是生成一个混淆矩阵。请注意,对角线中的值始终是真阳性 (TP)。
  • 现在,要计算标签 A 的 recall,您可以从混淆矩阵中读取值并计算:

    = TP_A/(TP_A+FN_A)
    = TP_A/(Total gold labels for A)
    
  • 现在,让我们计算标签 A 的 精度,您可以从混淆矩阵中读取值并计算:

    = TP_A/(TP_A+FP_A)
    = TP_A/(Total predicted as A)
    
  • 您只需对剩余的标签 B 和 C 执行相同操作即可。这适用于任何多类分类问题。

Here 是关于如何计算任何多类分类问题的精度和召回率的完整文章,包括示例。

【讨论】:

  • 好的,这给出了每个类的精度和召回率。如何从这些中获取整体指标?
【解决方案3】:

如果类是平衡的,则可以进行简单的平均。

否则,每个真实类的召回率需要通过该类的流行度加权,每个预测标签的精度需要通过每个标签的偏差(概率)加权。无论哪种方式,您都可以获得兰德准确度。

更直接的方法是制作一个归一化的列联表(除以 N,因此每个标签和类组合的表加起来为 1)并添加对角线以获得 Rand Accuracy。

但是,如果类不平衡,则偏差仍然存在,kappa 等机会校正方法更合适,或者更好的是 ROC 分析或机会正确度量,例如知情度(ROC 中机会线以上的高度)。

【讨论】:

    【解决方案4】:

    对于多标签分类,您有两种方法 首先考虑以下几点。

    • 是示例数。
    • 示例的真实标签分配..
    • 示例。
    • 示例的预测标签。

    基于示例

    指标以每个数据点的方式计算。对于每个预测标签,仅计算其分数,然后将这些分数汇总到所有数据点。

    • 精度 = , 预测正确的比例。分子找出预测向量中有多少标签与基本事实相同,比率计算预测的真实标签中有多少实际在基本事实中。
    • 召回 = , 预测了多少实际标签的比率。分子找出预测向量中有多少标签与基本事实相同(如上),然后找到与实际标签数量的比率,从而得到预测的实际标签的比例。

    还有其他指标。

    基于标签

    这里的事情是按标签完成的。对于每个标签,计算指标(例如精度、召回率),然后聚合这些标签指标。因此,在这种情况下,您最终会计算整个数据集上每个标签的精度/召回率,就像对二元分类所做的那样(因为每个标签都有一个二元分配),然后聚合它。

    简单的方法是呈现一般形式。

    这只是标准多类等价物的扩展。

    • 宏观平均

    • 微平均

    这里的 分别是仅 标签 的真阳性、假阳性、真阴性和假阴性计数。

    这里的 $B$ 代表任何基于混淆矩阵的度量。在您的情况下,您将插入标准精度和召回公式。对于宏观平均,您传入每个标签计数然后求和,对于微观平均,您首先平均计数,然后应用您的度量函数。

    您可能有兴趣查看多标签指标 here 的代码,这是 Rmldr 包的一部分。此外,您可能有兴趣查看 Java 多标签库 MULAN

    这是一篇介绍不同指标的好论文:A Review on Multi-Label Learning Algorithms

    【讨论】:

    • 在使用基于示例的方法进行非多标签但多类分类时,召回率是否等于精度?
    【解决方案5】:

    在python中使用sklearnnumpy

    from sklearn.metrics import confusion_matrix
    import numpy as np
    
    labels = ...
    predictions = ...
    
    cm = confusion_matrix(labels, predictions)
    recall = np.diag(cm) / np.sum(cm, axis = 1)
    precision = np.diag(cm) / np.sum(cm, axis = 0)
    

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 2019-03-31
      • 2019-09-29
      • 2020-10-02
      • 2016-01-09
      • 1970-01-01
      • 2016-06-19
      • 2021-09-01
      • 2013-10-01
      相关资源
      最近更新 更多