多类分类的准确率计算

5
考虑一个三类分类问题,具有以下混淆矩阵。
cm_matrix = 
                predict_class1    predict_class2    predict_class3
                 ______________    ______________    ______________

Actual_class1         2000                 0                 0     
Actual_class2           34              1966                 0     
Actual_class3            0                 0              2000   



Multi-Class Confusion Matrix Output
                     TruePositive    FalsePositive    FalseNegative    TrueNegative
                     ____________    _____________    _____________    ____________

    Actual_class1        2000             34                0              3966    
    Actual_class2        1966              0               34              4000    
    Actual_class3        2000              0                0              4000    

我使用的公式是:
Accuracy Of Each class=(TP ./total instances of that class)

(基于这里的答案制定公式:各类别准确率计算混淆)


Sensitivity=TP./TP+FN ;

在Matlab中的实现方式是:
acc_1  = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100
acc_2  = 100*(cm_matrix(2,2))/sum(cm_matrix(2,:)) =  100*(1966)/(34+1966+0) = 98.3
acc_3  = 100*(cm_matrix(3,3))/sum(cm_matrix(3,:)) = 100*(2000)/(0+0+2000) = 100

sensitivity_1 = 2000/(2000+0)=1 = acc_1
sensitivity_2 =  1966/(1966+34) = 98.3 = acc_2
sensitivity_3 = 2000/2000 = 1 = acc_3

问题1) 我计算每个类别的准确率公式是否正确?为了计算每个单独类别的准确率,例如正类,我应该在分子中取TP。同样地,对于只有负类的准确率,我应该在计算准确率公式的分子中考虑TN。这个公式是否适用于二元分类?我的实现是否正确?

问题2) 我的敏感度公式是否正确?为什么我得到与单个类别准确率相同的答案?


1
你为什么对这些公式表示怀疑?你做了哪些研究?你的研究如何导致你的困惑,或者至少没有消除它?你应用这些公式是否未能提供有意义的结果?你的实际问题是什么,因为我大约95%确定你发布的不是问题。 - beaker
1
如果您查看您其他问题中的维基百科链接,您的准确性公式是错误的。它应该是 TP+TN / TP+TN+FP+FN - beaker
@beaker: 您编写的公式是用于计算整个混淆矩阵的准确率:正确预测的数量/样本总数。如果需要计算单个类别的准确率,则应该只考虑:类别1中正确预测的数量/类别中的样本数,其他类别同理。我认为这个公式可以扩展到多类情况,因为我最终找到了一个工具箱。但是该工具箱存在两个问题:https://www.mathworks.com/matlabcentral/fileexchange/60900-multi-class-confusion-matrix。 - Sm1
@beaker:感谢您抽出时间查看那段代码。确实,精度的分母是不正确的。但是,如果我使用常识来计算每个类别的准确性,那么就应该是:该类别的正确预测数/属于该类别的总实例数。巧合的是,我的答案与运行代码得出的答案相匹配。然而,每个类别的敏感度和准确性都相同。这可能是另一个巧合。我在问题中展示了工作过程以表明我的观点。如果可能的话,请回答我的问题。我的实现和答案是否正确? - Sm1
非常理解你的愤怒和失望。抱歉。 - Sm1
显示剩余5条评论
2个回答

3
问题1) 我的每个类别的准确率公式正确吗? 不,您使用的公式是用于灵敏度(召回率)的。请参见下文。 对于计算每个单独类别的准确性,例如对于正类,我应该在分子中考虑TP。同样,对于仅负类的准确性,我应该在准确性公式的分子中考虑TN。同样的公式适用于二元分类吗?我的实现是否正确? 准确性是正确分类实例数与总实例数之比。 TN或正确识别为不属于某一类的实例数也是正确分类的实例数。您不能简单地将它们留出来。
准确性通常仅用于评估所有类别的分类器,而不是单个类别。但是,您可以将准确度公式概括为处理单个类别,就像这里所做的那样,用于计算多类分类器的平均分类准确度。(另请参见引用文章。)
他们用于每个类的公式如下:

enter image description here

正如您所看到的,它与准确性的通常公式完全相同,但我们只考虑单个类别的TP和TN得分(分母仍为观察总数)。将其应用于您的数据集,我们得到:

acc_1 = (2000+3966)/(2000+34+0+3966) = 0.99433
acc_2 = (1966+4000)/(1966+0+34+4000) = 0.99433
acc_3 = (2000+4000)/(2000+0+0+4000)  = 1.00000

这至少更符合直觉,因为前两个类别有错误分类的实例,而第三个类别没有。这些度量是否有用是另一个问题。

问题2) 我的灵敏度公式是否正确?

是的,灵敏度公式为:

TP / TP+FN

这是正确识别为该类的实例数与类中总实例数之比。在二元分类器中,默认计算正类别的灵敏度。负类别的灵敏度是错误率(也称为维基百科文章中的漏检率或假阴性率),是简单的:
FN / TP+FN === 1 - Sensitivity

FN仅仅是负类的TP!(同样,TP的含义也被颠倒了。)因此,像您所做的那样将其扩展到所有类别是很自然的。

那我为什么得到的答案和单个类别的准确率一样呢?

因为您正在使用相同的公式。

看看您的混淆矩阵:

cm_matrix = 
                predict_class1    predict_class2    predict_class3
                 ______________    ______________    ______________

Actual_class1         2000                 0                 0     
Actual_class2           34              1966                 0     
Actual_class3            0                 0              2000

1班的TP显然是2000

cm_matrix(1,1)

FN是该行其他两列的总和。因此,TP+FN是第一行的总和。

sum(cm_matrix(1,:) 

那正是您用于准确性的公式。
acc_1  = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100

谢谢您的回答和链接。然而,这里 https://stackoverflow.com/questions/51255247/individual-class-accuracy-calculation-confusion 另一个答案提供了不同的公式(我在多类分类中使用),用于计算单个类别的准确性。他没有在分子中放置“TN”。他回答说,单个类别的准确性是“该类别的TP /该类别的总实例数”。这个例子是针对二元分类的。我认为同样适用于多类分类。 - Sm1
这可能是一个错误。在你的例子中,你没有在分子中放置TN,Cris也没有这样做。你需要问他为什么那样做。每当你从随机的互联网人士那里得到建议时,你必须自己进行研究并查看他们的建议是否有意义。在这种情况下,对我来说是没有意义的。顺便说一下,是一个随机的互联网人,所以你必须检查我的建议是否有意义。但我不会坐在这里试图打倒你能想出的每个链接中的每个公式。 - beaker
没错,我明白了,我也应该做好自己的研究。这里有另一个链接,介绍了我一直在强调的个体类别准确性公式。这个公式被称为用户准确性公式。http://gis.humboldt.edu/OLM/Courses/GSP_216_Online/lesson6-2/metrics.html 与我的混淆矩阵相比,它的矩阵是翻转的,所以公式是TP/列总数,其中列总数表示该类别的实例数量。 - Sm1
你真的做到了那件事吗? :-) - beaker
请别误会,我的意图并不是要冒犯你或任何人。我来这里是为了学习,但我对两个答案和你的观点都不太信服。因此,我只是在寻找和研究以找到正确的答案。 - Sm1
好的。质疑一切。如果你发现一个看起来更适合你情况的方法,太棒了!去分享吧,我很愿意学习新东西。如果你对我的理解有任何问题,我将乐意尽可能澄清。 - beaker

2
问题1的答案:似乎准确性只用于二元分类,请查看this link。您提到了该网站上的一个答案,但它也涉及二元分类(即仅将分类分为2类)。您似乎有超过两个类别,在这种情况下,您应该尝试其他方法,或者对于每个类别进行一对多分类(对于每个类别,解析class_n和non_class_n的预测)。
问题2的答案:相同的问题,这个度量标准适用于二元分类,而不是您的情况。
灵敏度的公式为:
TP./(TP + FN)

准确度的公式是:
(TP)./(TP+FN+FP+TN)

查看文档这里更新 如果您想使用混淆矩阵,则需要:
- 对角线上的TP表示该类别的正确分类数量。 - 列总和中的FN表示该类别被错误分类的数量。在函数getvalues中,从函数声明开始计算行数并检查第30行和第31行。
TP(i)=c_matrix(i,i);
FN(i)=sum(c_matrix(i,:))-c_matrix(i,i);
FP(i)=sum(c_matrix(:,i))-c_matrix(i,i);
TN(i)=sum(c_matrix(:))-TP(i)-FP(i)-FN(i);

如果你应用精确度公式,计算并简化后,你会得到以下结果:
accuracy = c_matrix(i,i) / sum(c_matrix(:))

您获得的灵敏度,在简化后为:
sensitivity =  c_matrix(i,i) / sum(c_matrix(i,:))

如果你想更好地理解,只需查看我发给你的链接。

谢谢您的回答。必须有一种方法可以通过考虑对角线元素来找到各个类别的准确性和敏感性,就像这个例子中所示:https://www.mathworks.com/matlabcentral/fileexchange/60900-multi-class-confusion-matrix 如果您能够看到函数“getvalues”下的第二个“switch case”,您将看到计算单个类别准确性的公式:有一个“for循环”,那些变量被用于“RefereceResult.AccuracyOfSingle=(TP ./ P)' = TP/TP+FN”。 - Sm1
感谢您抽出时间查看那个Matlab链接。但是我的困惑在于灵敏度公式似乎存在错误,这就是为什么单个类别的灵敏度等于准确率的原因。另外,您能否请写出单个类别准确性的数学公式,因为该代码提供了两个公式,我不知道哪一个是正确的:准确率=(TP)./(TP+FN+FP+TN)(TP ./ TP+FN) - Sm1
你的准确率公式是错误的,但你的灵敏度公式是正确的。这两个公式在Matlab代码中都是正确的。你也可以在我发给你的链接中找到这些公式。请点击链接,其中包含更详细的信息。 - Catalina Chircu
1
我已经回答了。请仔细阅读我的回答。里面有你需要的一切。 - Catalina Chircu
1
@beaker:已更新。 - Catalina Chircu
显示剩余4条评论

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