0 votes
1 view
in Machine Learning by (13.5k points)

Is there a built-in way for getting accuracy scores for each class separatetly? I know in sklearn we can get overall accuracy by using metric.accuracy_score. Is there a way to get the breakdown of accuracy scores for individual classes? Something similar to metrics.classification_report.

from sklearn.metrics import classification_report

from sklearn.metrics import accuracy_score

y_true = [0, 1, 2, 2, 2]

y_pred = [0, 0, 2, 2, 1]

target_names = ['class 0', 'class 1', 'class 2']

classification_report does not give accuracy scores:

print(classification_report(y_true, y_pred, target_names=target_names, digits=4))

Out[9]:         precision    recall  f1-score   support

class 0     0.5000    1.0000    0.6667         1

class 1     0.0000    0.0000    0.0000         1

class 2     1.0000    0.6667    0.8000         3

avg/total   0.7000    0.6000    0.6133         5

Accuracy score gives only the overall accuracy:

accuracy_score(y_true, y_pred)

Out[10]: 0.59999999999999998

1 Answer

0 votes
by (33.1k points)

Simply use sklearn's confusion matrix to get the accuracy

For example:

from sklearn.metrics import confusion_matrix

import numpy as np

y_true = [0, 1, 2, 2, 2]

y_pred = [0, 0, 2, 2, 1]

target_names = ['class 0', 'class 1', 'class 2']

#Get the confusion matrix

cm = confusion_matrix(y_true, y_pred)

#array([[1, 0, 0],

#   [1, 0, 0],

#   [0, 1, 2]])

#Now the normalize the diagonal entries

cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

#array([[1.        , 0.        , 0.        ],

#      [1.        , 0.        , 0.        ],

#      [0.        , 0.33333333, 0.66666667]])

#The diagonal entries are the accuracies of each class

cm.diagonal()

#array([1.        , 0.        , 0.66666667])

Hope this answer helps you!

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...