我想知道如何计算多类多标记分类的精确度和召回度量,即分类中有两个以上的标签,每个实例可以有多个标签?
答案 0 :(得分:16)
对于多标签分类,您有两种方法可以选择 首先考虑以下事项。
指标以每个数据点方式计算。对于每个预测标签,仅计算其得分,然后将这些得分汇总在所有数据点上。
还有其他指标。
这里的事情是以标签方式完成的。对于每个标签,计算度量(例如,精确度,召回),然后聚合这些标签方式度量。因此,在这种情况下,您最终会计算整个数据集上每个标签的精度/召回率,就像您对二进制分类一样(因为每个标签都有二进制赋值),然后聚合它。
简单的方法是呈现一般形式。
这只是标准多类等价物的扩展。
这里$ 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计算召回,您可以从混淆矩阵中读取值并计算:
= 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中使用sklearn
和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)
答案 4 :(得分:0)
如果类平衡,则可以进行简单平均。
否则,每个真实类的召回需要按类的普遍性加权,每个预测标签的精确度需要通过每个标签的偏差(概率)加权。无论哪种方式,你都可以获得Rand Accuracy。
更直接的方法是制作一个标准化的列联表(除以N,因此对于每个标签和类的组合,表格加起来为1)并添加对角线以获得兰德精度。
但是如果课程不平衡,那么偏见仍然存在,并且机会校正方法(例如kappa)更合适,或者更好的是ROC分析或机会正确的衡量标准,例如知情度(高于ROC机会线的高度)。 / p>