Search code examples
scikit-learnneural-networkartificial-intelligencemetrics

Precision, recall and confusion matrix problems in sklearn


I have trained a model in keras and I have made some predictions. To evaluate the performance of my model I have calculated the precision and recall scores and the confusion matrix with sklearn library. This is my code:

final_predictions = model.predict_generator(generator_test, steps=steps_per_epoch_test)
rounded_pred = [0 if x<=0.5 else 1 for x in final_predictions]
test_precision_score = round(precision_score(y_test, rounded_pred), 3)
test_recall_score = round(recall_score(y_test, rounded_pred), 3)
test_confusion_matrix = confusion_matrix(y_test, rounded_pred)

These are my results:

Test confusion matrix :

 [[1555   13]

 [   9   49]]

Precision and recall:

Test Precision :: 0.845
Test Recall :: 0.79

Does somebody know why is the precision score calculated incorrectly? (It should be (1555/(1555+13) instead of (13/(13+49)))


Solution

  • The default pos_label of precision_score and recall_score are 1.

    from sklearn.metrics import confusion_matrix,precision_score,recall_score,classification_report
    
    y_true = [0]*1568 + [1]*58
    y_pred = [0]*1555 + [1]*13 + [0]* 9+ [1]* 49
    
    print('confusion matrix :\n',confusion_matrix(y_true,y_pred))
    print('precision_score :\n',precision_score(y_true,y_pred,pos_label=1))
    print('recall_score :\n',recall_score(y_true,y_pred,pos_label=1))
    print('classification_report :\n',classification_report(y_true,y_pred))
    
    confusion matrix :
     [[1555   13]
     [   9   49]]
    precision_score :
     0.7903225806451613
    recall_score :
     0.8448275862068966
    classification_report :
                   precision    recall  f1-score   support
    
               0       0.99      0.99      0.99      1568
               1       0.79      0.84      0.82        58
    
       micro avg       0.99      0.99      0.99      1626
       macro avg       0.89      0.92      0.90      1626
    weighted avg       0.99      0.99      0.99      1626
    

    If you want to get precision_score and recall_score of label=1. You can set pos_label=0 to set class.

    print('precision_score :\n',precision_score(y_true,y_pred,pos_label=0))
    print('recall_score :\n',recall_score(y_true,y_pred,pos_label=0))
    
    precision_score :
     0.9942455242966752
    recall_score :
     0.9917091836734694