计算多类分类的准确度

Sm1*_*Sm1 5 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    
Run Code Online (Sandbox Code Playgroud)

我使用的公式是:

Accuracy Of Each class=(TP ./total instances of that class)
Run Code Online (Sandbox Code Playgroud)

(公式基于此处的答案:个别类别准确度计算混乱

Sensitivity=TP./TP+FN ;
Run Code Online (Sandbox Code Playgroud)

其在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
Run Code Online (Sandbox Code Playgroud)

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

Question2)我的灵敏度公式正确吗?那么为什么我会得到与个别班级准确率相同的答案呢?

Cat*_*rcu 2

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

问题 2 的回答。同样的问题,此方法适用于二元分类,但不是您的情况。

灵敏度的计算公式为:

TP./(TP + FN)
Run Code Online (Sandbox Code Playgroud)

准确度的公式为:

(TP)./(TP+FN+FP+TN)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档。

更新

如果您想使用混淆矩阵,您可以:

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);
Run Code Online (Sandbox Code Playgroud)

如果应用精度公式,经过计算和简化后,您将得到:

accuracy = c_matrix(i,i) / sum(c_matrix(:))
Run Code Online (Sandbox Code Playgroud)

对于您在简化后获得的灵敏度:

sensitivity =  c_matrix(i,i) / sum(c_matrix(i,:))
Run Code Online (Sandbox Code Playgroud)

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