计算 multi-class classification 的准确度

Calculating accuracy for multi-class classification

考虑具有以下混淆矩阵的三 class class化问题。

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) 我计算每个 class 的准确度的公式是否正确?为了计算每个人的准确度 class,对于正数 class,我应该将 TP 作为分子。同样,对于只有负 class 的准确性,我应该考虑公式中分子中的 TN 以提高准确性。相同的公式是否适用于二进制 classification?我的实现是否正确?

问题2)我的灵敏度公式正确吗?那我怎么会得到与个人 class 准确度相同的答案?

问题1的答案 accuracy好像只用在二进制class化,查this link。 您参考了此站点上的答案,但它还涉及二进制 classification(即仅 classification 为 2 classes)。您似乎有两个以上的 classes,在这种情况下,您应该尝试其他方法,或者对每个 class 进行一对一 class 化(对于每个 class,解析 class_n 和非_class_n) 的预测。

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

灵敏度的公式为:

TP./(TP + FN)

准确度公式为:

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

请参阅文档 here

更新

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

对角线上的 TP,在 class 的水平 FN class 列中所有值的总和。在函数 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,:))

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

Question1) Is my formula for Accuracy of each class correct?

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

For calculating accuracy of each individual class, say for positive class I should take the TP in the numerator. Similarly, for accuracy of only the negative class, I should consider TN in the numerator in the formula for accuracy. Is the same formula applicable to binary classification? Is my implementation of it correct?

准确率是正确class化实例的数量与实例总数的比率。 TN,或者正确识别为 not 的实例数在 class 中,也是正确的 classified 实例。你不能简单地将它们排除在外。

准确性通常也仅用于评估所有 classes 的整个 classifier,而不是单个 classes。但是,您可以将精度公式概括为处理单个 classes,就像 here for computing the average classification accuracy for a multiclass classifier. (See also the referenced article 所做的那样。)

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

如你所见,它与通常的准确性公式相同,但我们只考虑了个体class的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

这至少更直观,因为前两个 classes 有错误的 classified 实例,而第三个没有。这些措施是否有用是另一个问题。


Question2) Is my formula for sensitivity correct?

是的,灵敏度给出为:

TP / TP+FN

这是在此class中正确识别的实例与class中实例总数的比率]。在二进制 class 运算符中,您默认计算正值 class 的灵​​敏度。负值 class 的灵​​敏度是错误率(在维基百科文章中也称为未命中率或假阴性率),简单来说就是:

FN / TP+FN === 1 - Sensitivity

FN无非就是TP对负class! (TP 的含义同样是相反的。)因此很自然地将它扩展到所有 classes,就像你所做的那样。

Then how come I am getting same answer as individual class accuracies?

因为您对两者使用相同的公式。

看看你的混淆矩阵:

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