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

时间:2012-01-25 14:19:06

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

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

5 个答案:

答案 0 :(得分:16)

对于多标签分类,您有两种方法可以选择 首先考虑以下事项。

  • $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}$ 标签的真正阳性,假阳性,真阴性和假阴性计数。

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

您可能有兴趣查看多标签指标here的代码,该代码是mldr中包R的一部分。您也可能有兴趣查看Java多标签库MULAN

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

答案 1 :(得分:7)

答案是你必须计算每个班级的精确度和召回率,然后将它们平均在一起。例如。如果你是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 :(得分:5)

  • 我们假设我们有一个带有标签A,B和C的3级多分类问题。
  • 首先要做的是生成一个混淆矩阵。请注意,对角线中的值始终为真阳性(TP)。
  • 现在,要为标签A计算召回,您可以从混淆矩阵中读取值并计算:

    = 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 :(得分:1)

在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)

答案 4 :(得分:0)

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

否则,每个真实类的召回需要按类的普遍性加权,每个预测标签的精确度需要通过每个标签的偏差(概率)加权。无论哪种方式,你都可以获得Rand Accuracy。

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

但是如果课程不平衡,那么偏见仍然存在,并且机会校正方法(例如kappa)更合适,或者更好的是ROC分析或机会正确的衡量标准,例如知情度(高于ROC机会线的高度)。 / p>