【问题标题】:Calculating accuracy for multi-class classification计算多类分类的准确度
【发布时间】:2020-03-19 01:46:36
【问题描述】:

考虑具有以下混淆矩阵的三类分类问题。

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)

(基于此处答案的公式:Individual class accuracy calculation confusion

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) 我的敏感度公式是否正确?那为什么我得到的答案和个别班级的准确率一样呢?

【问题讨论】:

  • 你为什么怀疑这些公式?你做了什么研究?您的研究如何导致您的困惑,或者至少未能减轻它?您对这些公式的应用是否未能提供有意义的结果?你的实际问题是什么,因为我大约 95% 确定你发布的不是它。
  • 请参阅我已详细解释的更新问题。问题是在任何地方给出的整体类准确度公式都是 (TP +TN./ TP+FP+FN+TN)。我找不到任何参考来计算多类分类的单个类精度的公式。因此我不得不从 Matlab 链接中借用。在整体准确度公式中,分母有TN,但对于个别类别的准确度,根据我的理解,不应该有TN。对于多类分类情况,我一定是对单个类的敏感性公式犯了错误。
  • 因此我发布了因为我没有任何地方可以找到多类案例的参考。
  • 如果您查看其他问题中的维基百科链接,您的准确度公式是错误的。应该是TP+TN / TP+TN+FP+FN
  • @beaker:您编写的公式用于计算整个混淆矩阵的准确度:number of correct prediction / total samples。如果需要计算单个类的准确度,那么也许应该只考虑:number of correct prediction for class1/number of samples in class 对于其他类也是如此。我认为这个公式可以扩展到多类案例,因为我终于找到了一个工具箱。但是该工具箱中有两个问题:mathworks.com/matlabcentral/fileexchange/…

标签: classification confusion-matrix multiclass-classification


【解决方案1】:

问题1的答案。 看来准确率只用在二元分类中,检查this link。 您参考了本网站上的答案,但它也涉及二进制分类(即仅分类为 2 个类别)。您似乎有两个以上的类,在这种情况下,您应该尝试其他方法,或者对每个类进行一对多分类(对于每个类,解析 class_n 和 non_class_n 的预测)。

回答问题 2。 同样的问题,此措施适用于二进制分类,但您的情况并非如此。

灵敏度的公式是:

TP./(TP + FN)

准确度公式为:

(TP)./(TP+FN+FP+TN)

请参阅文档here

更新

如果你想使用混淆矩阵,你有:

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,:))

如果您想更好地理解,请查看我发送给您的链接。

【讨论】:

  • 感谢您的回答。必须有一种方法可以通过考虑对角线元素来找到单个类的精度和单个敏感度,就像在这个例子中一样:mathworks.com/matlabcentral/fileexchange/… 如果你能在getvalues 函数下看到第二个switch case,你会看到公式用于计算单个类的准确率:有一个 for loop 并使用这些变量 RefereceResult.AccuracyOfSingle=(TP ./ P)' = TP/TP+FN;
  • 现在这个公式与灵敏度相同,但与您拥有的不同。
  • 感谢您花时间浏览该 Matlab 链接。但我的困惑是,敏感度公式似乎存在错误,这就是为什么敏感度的答案 = 各个类别的准确度。您还可以写出各个类精度的数学公式,因为该代码提供了两个公式,我不知道哪个是正确的:accuracy=(TP)./(TP+FN+FP+TN) or(TP ./ TP+FN)
  • 我已经回答过了。请仔细阅读我的回答。你拥有一切。
  • @beaker:已更新。
【解决方案2】:

问题 1) 我的每个类别的准确度公式是否正确?

不,您使用的公式是针对敏感度(召回)的。见下文。

为了计算每个单独类的准确性,比如说对于正类,我应该在分子中取 TP。同样,对于仅负类的准确度,我应该在准确度公式中考虑分子中的 TN。相同的公式是否适用于二元分类?我的实现是否正确?

准确率是正确分类的实例数与实例总数的比率。 TN,或正确识别为在一个类中的实例数,也是正确分类的实例。你不能简单地将它们排除在外。

准确性通常也仅用于评估所有类的整个分类器,而不是单个类。但是,您可以推广准确度公式来处理单个类,就像 here 计算多类分类器的平均分类准确度所做的那样。 (另请参阅referenced article。)

他们对每个班级使用的公式是:

如您所见,它与通常的准确度公式相同,但我们只考虑了单个类的 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

class 1 的 TP 显然是 2000

cm_matrix(1,1)

FN 是该行中其他两列的总和。所以TP+FN就是第1行的和

sum(cm_matrix(1,:) 

这正是您用于准确度的公式。

acc_1  = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100

【讨论】:

  • 感谢您的回答和链接。然而这里的另一个答案stackoverflow.com/questions/51255247/… 为单个类的准确性提出了一个不同的公式(我在多类分类中使用过)。他没有将TN 放在分子中。他回答说个别类的准确率是TP of that class/total instances in that class 这个例子是用于二进制分类的。我认为这同样适用于多类。
  • 这可能是一个错误。在您的示例中,您没有将 TN 放在分子中,Cris 没有将它放在他的分子中。你得问问他为什么那样做。每当您从 Random Internet People 那里获得建议时,您都必须自己进行研究,看看他们的建议是否有意义。在这种情况下,对我来说不是。顺便说一句,是一个随机的互联网人,所以你必须检查我的的建议是否有意义。但我不会坐在这里,试图从你能想到的每个链接中敲下每一个公式。
  • 没错,我明白你的意思,我也应该做我的研究。这是另一个链接,它给出了我正在谈论的单个类准确性的相同公式。该公式被称为用户的准确度gis.humboldt.edu/OLM/Courses/GSP_216_Online/lesson6-2/… 混淆矩阵与我的相比是翻转的,因此公式是 TP/列总数,其中列总数表示该类的实例数。
  • 你并没有真正做到这一点,是吗? :-)
  • 请不要误会我的意思,我的目的不是冒犯您或任何人。我是来学习的,但我对答案和你的观点都不太信服。因此,我只是在搜索和研究以找到正确的答案。
猜你喜欢
  • 2021-09-03
  • 2020-01-03
  • 1970-01-01
  • 2021-11-02
  • 2016-01-12
  • 2018-02-09
  • 2018-09-22
  • 2018-11-14
  • 2018-10-01
相关资源
最近更新 更多