Search code examples
pythonscikit-learnclassificationsupervised-learning

sklearn: multi-class problem and reporting sensitivity and specificity


I have a three-class problem and I'm able to report precision and recall for each class with the below code:

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

which gives me the precision and recall nicely for each of the 3 classes in a table format.

My question is how can I now get sensitivity and specificity for each of the 3 classes? I looked at sklearn.metrics and I didn't find anything for reporting sensitivity and specificity.


Solution

  • If we check the help page for classification report:

    Note that in binary classification, recall of the positive class is also known as “sensitivity”; recall of the negative class is “specificity”.

    So we can convert the pred into a binary for every class, and then use the recall results from precision_recall_fscore_support.

    Using an example:

    from sklearn.metrics import classification_report
    y_true = [0, 1, 2, 2, 2]
    y_pred = [0, 0, 2, 2, 1]
    target_names = ['class 0', 'class 1', 'class 2']
    print(classification_report(y_true, y_pred, target_names=target_names))
    

    Looks like:

                  precision    recall  f1-score   support
    
         class 0       0.50      1.00      0.67         1
         class 1       0.00      0.00      0.00         1
         class 2       1.00      0.67      0.80         3
    
        accuracy                           0.60         5
       macro avg       0.50      0.56      0.49         5
    weighted avg       0.70      0.60      0.61         5
    

    Using sklearn:

    from sklearn.metrics import precision_recall_fscore_support
    res = []
    for l in [0,1,2]:
        prec,recall,_,_ = precision_recall_fscore_support(np.array(y_true)==l,
                                                          np.array(y_pred)==l,
                                                          pos_label=True,average=None)
        res.append([l,recall[0],recall[1]])
    

    put the results into a dataframe:

    pd.DataFrame(res,columns = ['class','sensitivity','specificity'])
    
        class   sensitivity specificity
    0   0   0.75    1.000000
    1   1   0.75    0.000000
    2   2   1.00    0.666667