多分类-多标签分类的精确度/召回率

32

我想知道如何计算多类多标签分类中的精度和召回率,即存在多个标签且每个实例可以有多个标签的分类?


2
+1 没有评论的踩怎么了?我也有同样的问题,很高兴找到了这个页面。@ThomasJungblut 我知道如何计算给定类别(例如A类)的精度,但是如何计算所有类别的精度呢?是每个类别的精度的算术平均值吗? - Mark E. Haase
我找到了一个类似的问题,这可能是一个重复的问题:http://stackoverflow.com/questions/3856013/get-recall-sensitivity-and-precision-ppv-values-of-a-multi-class-problem-in - Mark E. Haase
2
这个问题似乎不属于讨论编程,而是关于教科书公式的内容,因此应该在CrossValidated上提问。实际上,在这个问题被提问几天前,它已经得到了很好的回答:http://stats.stackexchange.com/questions/21551/how-to-compute-precision-recall-for-multiclass-multilabel-classification - demongolem
5个回答

24

对于多标签分类,您有两种选择。首先考虑以下内容。

  • $n$ 表示样本数量。
  • $Y_i$ 是第 $i^{th}$ 个样本的真实标签。
  • $x_i$ 是第 $i^{th}$ 个样本。
  • $h(x_i)$ 是第 $i^{th}$ 个样本的预测标签。

基于示例

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

  • 精度 = $\frac{1}{n}\sum_{i=1}^{n}\frac{|Y_{i}\cap h(x_{i})|}{|h(x_{i})|}$ ,正确预测的比例。分子计算预测向量中有多少标签与真实值相同,分母计算在真实值中有多少被正确预测,从而得出预测正确的标签占真实值的比例。
  • 召回率 = $\frac{1}{n}\sum_{i=1}^{n}\frac{|Y_{i}\cap h(x_{i})|}{|Y_{i}|}$ ,正确预测的标签占所有实际标签的比例。分子计算预测向量中有多少标签与真实值相同(如上所述),然后找到与实际标签数的比例,从而得出预测正确的标签占所有实际标签的比例。

还有其他指标。

基于标签

在这里,一切都是按标签完成的。对于每个标签,计算度量指标(例如精确度、召回率),然后聚合这些标签度量指标。因此,在这种情况下,您将计算整个数据集中每个标签的精确度/召回率,就像对于二元分类一样(因为每个标签都有一个二元分配),然后进行聚合。
简单的方法是呈现一般形式。
这只是标准多类等价物的扩展。
  • 宏平均 $\frac{1}{q}\sum_{j=1}^{q}B(TP_{j},FP_{j},TN_{j},FN_{j})$

  • 微平均 $B(\sum_{j=1}^{q}TP_{j},\sum_{j=1}^{q}FP_{j},\sum_{j=1}^{q}TN_{j},\sum_{j=1}^{q}FN_{j})$

这里$TP_{j},FP_{j},TN_{j},FN_{j}$分别表示仅针对$j^{th}$ 标签 的真正例数、假正例数、真负例数和假负例数。请保留HTML标签。

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

你可能会对多标签度量中的代码感兴趣,它是这里的一部分,属于mldr包在R中。此外,您可能还想查看Java多标签库MULAN
这是一篇不错的论文,可以了解不同的度量方法:多标签学习算法综述

使用基于示例的方法进行非多标签但多类别分类时,召回率是否等于精确度? - WetFish

8
答案是你需要计算每个类别的精准度和召回率,然后将它们平均。例如,如果你有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


8
如果你的数据标签数量不平衡,那么进行平均可能无法反映真实的性能表现。 - tashuhka

6
  • Let us assume that we have a 3-class multi classification problem with labels A, B and C.
  • The first thing to do is to generate a confusion matrix. Note that the values in the diagonal are always the true positives (TP).
  • Now, to compute recall for label A you can read off the values from the confusion matrix and compute:

    = TP_A/(TP_A+FN_A)
    = TP_A/(Total gold labels for A)
    
  • Now, let us compute precision for label A, you can read off the values from the confusion matrix and compute:

    = TP_A/(TP_A+FP_A)
    = TP_A/(Total predicted as A)
    
  • You just need to do the same for the remaining labels B and C. This applies to any multi-class classification problem.

这里是一篇完整的文章,介绍了如何计算任何多类别分类问题的精确度和召回率,包括示例。


好的,这给出了每个类别的精确度和召回率。如何从中获取总体指标? - Alex

4

使用sklearnnumpy的Python代码:

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)

1
简单平均对于平衡的类别是可以的。
否则,每个真实类别的召回率需要根据该类别的普遍性加权,并且每个预测标签的精度需要根据每个标签的偏差(概率)加权。无论哪种方式,您都会得到Rand准确度。
更直接的方法是制作一个归一化的列联表(将其除以N,使得每个标签和类别的组合总和为1),然后将对角线相加以获得Rand准确度。
但如果类别不平衡,则偏差仍然存在,更适合使用kappa等机会校正方法,或者更好的是ROC分析或类似于ROC中的机会校正度量的informedness(在机会线上方的高度)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接