24

This is a simple example of classification_report in sklearn

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))
#             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
#
#avg / total       0.70      0.60      0.61         5

I want to have access to avg/total row. For instance, I want to extract f1-score from the report, which is 0.61.

How can I have access to the number in classification_report?

Hadij
  • 3,661
  • 5
  • 26
  • 48

4 Answers4

23

You can output the classification report by adding output_dict=True to the report:

report = classification_report(y_true, y_pred, output_dict=True)

And then access its single values as in a normal python dictionary.

For example, the macro metrics:

macro_precision =  report['macro avg']['precision'] 
macro_recall = report['macro avg']['recall']    
macro_f1 = report['macro avg']['f1-score']

or Accuracy:

accuracy = report['accuracy']
Hadij
  • 3,661
  • 5
  • 26
  • 48
Rmobdick
  • 396
  • 3
  • 2
21

you can use precision_recall_fscore_support for getting all at once

from sklearn.metrics import precision_recall_fscore_support as score
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
precision,recall,fscore,support=score(y_true,y_pred,average='macro')
print 'Precision : {}'.format(precision)
print 'Recall    : {}'.format(recall)
print 'F-score   : {}'.format(fscore)
print 'Support   : {}'.format(support)

here is the link to the module

Pratik Kumar
  • 2,211
  • 1
  • 17
  • 41
9

You can use output_dict parameter in build-in classification_report to return a dictionary:

classification_report(y_true,y_pred,output_dict=True)

Gamugo
  • 121
  • 1
  • 2
5

classification_report is string so I would suggest you to use f1_score from scikit-learn

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']

print(f1_score(y_true, y_pred, average=None)

output

Sociopath
  • 13,068
  • 19
  • 47
  • 75
  • Thank you. so there is no way to extract from classification_report? what about the other reports? – Hadij Jan 24 '18 at 08:40
  • maybe you can use regex to extract this value. can you name the other reports ? – Sociopath Jan 24 '18 at 08:43
  • If you are talking about recall and precision, yes there are functions like recall_score and precision_score in sklearn – Sociopath Jan 24 '18 at 08:45