Answers:
另一个用于衡量分类器性能的流行工具是ROC / AUC;这个也有一个多类/多标签扩展名:请参阅[Hand 2001]
[Hand 2001]:将ROC曲线下的面积简单归纳为多个类别的分类问题
这是Coursera论坛主题中有关混淆矩阵和多类精度/召回率测量的一些讨论。
基本思想是计算所有类的所有精度和召回率,然后取它们的平均值以获得单个实数测量值。
混淆矩阵使计算精度和召回类变得容易。
以下是从该线程复制的有关混淆矩阵的一些基本说明:
混淆矩阵是当类别多于2种时对真阳性,真阴性,假阳性和假阴性进行分类的一种方法。它用于计算精度和召回率,因此用于计算多类问题的f1分数。
实际值由列表示。预测值由行表示。
例子:
10个实际为8的训练示例被错误地分类(预测)为5
13个实际为4的训练示例被错误地分类为9
混淆矩阵
厘米= 0 1 2 3 4 5 6 7 8 9 10 1 298 2 1 0 1 1 3 1 1 0 2 0 293 7 4 1 0 5 2 0 0 3 1 3263 0 8 0 0 3 0 2 4 1 5 0 261 4 0 3 2 0 1 5 0 0 10 0 254 3 0 10 2 1 6 0 4 1 1 4 300 0 1 0 0 7 1 3 2 0 0 0 264 0 7 1 8 3 5 3 1 7 1 0 289 1 0 9 0 1 3 13 1 0 11 1 289 0 10 0 6 0 1 6 1 2 1 4 304
对于x类:
真正值:对角线位置,cm(x,x)。
误报:x列的总和(无主对角线),sum(cm(:, x))-cm(x,x)。
假负数:第x行的总和(无主对角线),sum(cm(x,:),2)-cm(x,x)。
您可以按照课程公式计算准确性,召回率和F1分数。
对所有类别(带有或不带有加权)进行平均可得出整个模型的值。
对于多标签分类,您有两种方法。首先考虑以下内容。
指标以每个数据点的方式计算。对于每个预测标签,仅计算其得分,然后将这些得分汇总到所有数据点上。
还有其他指标。
在这里,事情是按标签进行的。对于每个标签,计算指标(例如,精度,召回率),然后将这些基于标签的指标进行汇总。因此,在这种情况下,最终需要像在二进制分类中一样(因为每个标签都有一个二进制赋值),为整个数据集计算每个标签的精度/召回率。
简单的方法是呈现一般形式。
这只是标准多类等效项的扩展。
宏平均
微观平均
此处仅是第标签的真实正计数,假正计数,真负计数和假负计数。 Ĵ 吨ħ
这里代表任何基于度量的混淆矩阵的。在您的情况下,您将插入标准精度并调用公式。对于宏平均值,请传递每个标签计数,然后求和;对于微观平均值,请先对计数进行平均值,然后应用度量函数。
你可能有兴趣去看看到了MULT标签指标的代码在这里,该包的一部分mldr在[R 。您可能也有兴趣研究Java多标签库MULAN。
这是一篇介绍不同指标的好论文: 多标签学习算法综述
我不知道多标签部分,但对于mutli-class分类,这些链接将为您提供帮助
该链接说明了如何构建混淆矩阵,可用于计算每个类别的精度和召回率
并且此链接说明了如何计算micro-f1和macro-f1度量来整体评估分类器。
希望您觉得有用。
该链接对我有帮助。.https ://www.youtube.com/watch?v=HBi- P5j0Kec我希望它也能对您有所帮助
说分布如下
A B C D
A 100 80 10 10
B 0 9 0 1
C 0 1 8 1
D 0 1 0 9
A的精度为
P(A)= 100/100 + 0 + 0 +0 = 100
P(B)= 9/9 + 80 + 1 + 1 = 9/91 psst ...本质上取类的真实正值,然后除以行中的列数据
召回将是
R(A)= 100 / 100+ 80 + 10 + 10 = 0.5
R(B)= 9 / 9+ 0 + 0 + 1 = 0.9
psst ...本质上是类的真实肯定,然后按行数据除以列
获得所有值后,取宏观平均值
平均(P)= P(A)+ P(B)+ P(C)+ P(D)/ 4
平均(R)= R(A)+ R(B)+ R(C)+ R(D)/ 4
F1 = 2 * avg(P)* avg(R)/ avg(P)+ avg(R)
在哈佛大学cs205.org上查看这些幻灯片。一旦到达“错误度量”部分,就可以讨论多类设置(例如,一对多或一对一)和混淆矩阵中的精度和召回率。混淆矩阵是您真正想要的。
仅供参考,在Python软件包scikits.learn中,内置了一些方法,可以根据经过多类数据训练的分类器自动计算诸如混淆矩阵之类的东西。它可能也可以直接为您计算精确调用图。值得一看。
从Ozgur等人(2005)可以看出,您应该遵循正则表达式来计算Precision和Recall,但是除了对数据集中的全部N个实例求平均值以外,您应该使用N = [具有至少一个带有有问题的课程分配给]。
这里是提到的参考:http : //citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf
与一般情况完全相同,使用set:
http://en.wikipedia.org/wiki/F1_score
http://en.wikipedia.org/wiki/Precision_and_recall
以下是简单的Python函数,正是这些函数可以做到这一点:
def precision(y_true, y_pred):
i = set(y_true).intersection(y_pred)
len1 = len(y_pred)
if len1 == 0:
return 0
else:
return len(i) / len1
def recall(y_true, y_pred):
i = set(y_true).intersection(y_pred)
return len(i) / len(y_true)
def f1(y_true, y_pred):
p = precision(y_true, y_pred)
r = recall(y_true, y_pred)
if p + r == 0:
return 0
else:
return 2 * (p * r) / (p + r)
if __name__ == '__main__':
print(f1(['A', 'B', 'C'], ['A', 'B']))