Search code examples
classificationconfusion-matrixmulticlass-classification

Calculating accuracy for multi-class classification


Consider a three class classification problem with the following confusion matrix.

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    

The formula that I have used are:

Accuracy Of Each class=(TP ./total instances of that class)

( formula based on an answer here: Individual class accuracy calculation confusion)

Sensitivity=TP./TP+FN ;

The implementation of it in Matlab is:

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

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?

Question2) Is my formula for sensitivity correct? Then how come I am getting same answer as individual class accuracies?


Solution

  • Answer to question 1. It seems that accuracy is used only in binary classification, check this link. You refer to an answer on this site, but it concerns also a binary classification (i.e. classification into 2 classes only). You seem to have more than two classes, and in this case you should try something else, or a one-versus-all classification for each class (for each class, parse prediction for class_n and non_class_n).

    Answer to question 2. Same issue, this measure is appropriate for binary classification which is not your case.

    The formula for sensitivity is:

    TP./(TP + FN)
    

    The formula for accuracy is:

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

    See the documentation here.

    UPDATE

    And if you wish to use the confusion matrix, you have:

    TP on the diagonal, at the level of the class FN the sum of all the values in the column of the class. In the function getvalues start counting lines from the declaration of the function and check lines 30 and 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);
    

    If you apply the accuracy formula, you obtain, after calculating and simplifying :

    accuracy = c_matrix(i,i) / sum(c_matrix(:))
    

    For the sensitivity you obtain, after simplifying:

    sensitivity =  c_matrix(i,i) / sum(c_matrix(i,:))
    

    If you want to understand better, just check the links I sent you.