我想知道如何计算多类多标签分类的精度和召回度量,即有两个以上标签的分类,每个实例可以有多个标签?
5 回答
对于多标签分类,您有两种方法首先考虑以下内容。
基于示例
指标以每个数据点的方式计算。对于每个预测标签,仅计算其分数,然后将这些分数汇总到所有数据点上。
- Precision = , 预测正确的比例。分子找出预测向量中有多少标签与基本事实相同,比率计算预测的真实标签中有多少实际在基本事实中。
- Recall = ,预测的实际标签数量的比率。分子找出预测向量中有多少标签与基本事实相同(如上),然后找到与实际标签数量的比率,从而得到预测的实际标签的比例。
还有其他指标。
基于标签
在这里,事情是按标签完成的。对于每个标签,计算指标(例如精度、召回率),然后聚合这些标签指标。因此,在这种情况下,您最终会计算整个数据集上每个标签的精度/召回率,就像您对二进制分类所做的那样(因为每个标签都有一个二进制分配),然后聚合它。
简单的方法是呈现一般形式。
这只是标准多类等价物的扩展。
这里 $B$ 代表任何基于混淆矩阵的度量。在您的情况下,您将插入标准精度和召回公式。对于宏观平均,您传入每个标签计数然后求和,对于微观平均,您首先平均计数,然后应用您的度量函数。
您可能有兴趣在此处查看多标签指标的代码,它是R中mldr包的一部分。此外,您可能有兴趣查看 Java 多标签库MULAN。
这是一篇介绍不同指标的好论文: A Review on Multi-Label Learning Algorithms
答案是您必须计算每个类的准确率和召回率,然后将它们平均在一起。例如,如果您对 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 -多类多标签分类
- 让我们假设我们有一个带有标签 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 执行相同的操作。这适用于任何多类分类问题。
这是关于如何计算任何多类分类问题的精度和召回率的完整文章,包括示例。
在 python 中使用sklearn
and numpy
:
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)
如果类是平衡的,简单的平均就可以了。
否则,每个真实类的召回率需要通过该类的流行度来加权,并且每个预测标签的精度需要通过每个标签的偏差(概率)来加权。无论哪种方式,您都会获得 Rand Accuracy。
更直接的方法是制作一个归一化的列联表(除以 N,因此对于标签和类的每个组合,表加起来为 1)并添加对角线以获得 Rand Accuracy。
但是,如果类不平衡,则偏差仍然存在,并且诸如 kappa 之类的机会校正方法更合适,或者更好的是 ROC 分析或诸如知情度(ROC 中机会线以上的高度)之类的机会正确度量。