计算多类别分类的准确性

时间:2020-03-17 15:51:12

标签: classification confusion-matrix multiclass-classification

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

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)我的灵敏度公式正确吗?那我怎么能得到与个人课堂准确性相同的答案?

2 个答案:

答案 0 :(得分: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,:))

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

答案 1 :(得分:1)

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

否,您使用的公式用于灵敏度(调用)。见下文。

要计算每个单独类别的准确性,例如对于正类别,我应该将TP作为分子。同样,对于仅负数类的准确性,我应该在公式中考虑分子中的TN以获得准确性。相同的公式适用于二进制分类吗?我的实现正确吗?

精度是正确分类的实例数与实例总数之比。 TN或正确识别为 not 属于类的实例数也属于正确分类的实例。您不能简单地将它们排除在外。

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

他们为每个类使用的公式是:

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是第1行的总和

sum(cm_matrix(1,:) 

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

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