Scikit-learn, получить оценки точности для каждого класса

Есть ли встроенный способ получения баллов точности для каждого класса отдельно? Я знаю, что в sklearn мы можем получить общую точность, используя metric.accuracy_score. Есть ли способ получить разбивку показателей точности для отдельных классов? Нечто похожее на 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 не дает оценки точности:

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(y_true, y_pred)
Out[10]: 0.59999999999999998

Ответ 1

Вы можете использовать склеренную матрицу путаницы, чтобы получить точность

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])

Рекомендации

Ответ 2

Вы можете запрограммировать его самостоятельно: точность - это не что иное, как соотношение между хорошо классифицированными образцами (истинными позитивами и истинными негативами) и общее количество образцов, которые у вас есть.

Затем для данного класса вместо рассмотрения всех образцов вы учитываете только те, что относятся к вашему классу.

Затем вы можете попробовать следующее: Сначала определим удобную функцию.

def indices(l, val):
   retval = []
   last = 0
   while val in l[last:]:
           i = l[last:].index(val)
           retval.append(last + i)
           last += i + 1   
   return retval

Функция выше вернет индексы в списке l определенного значения val

def class_accuracy(y_pred, y_true, class):
    index = indices(l, class)
    y_pred, y_true = ypred[index], y_true[index]
    tp = [1 for k in range(len(y_pred)) if y_true[k]==y_pred[k]]
    tp = np.sum(tp)
    return tp/float(len(y_pred))

Последняя функция вернет точность в классе, которую вы ищете.

Ответ 3

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
matrix = confusion_matrix(y_true, y_pred)
matrix.diagonal()/matrix.sum(axis=1)

Ответ 4

Вопрос вводит в заблуждение. Показатели точности для каждого класса равны общему показателю точности. Рассмотрим матрицу путаницы:

from sklearn.metrics import confusion_matrix
import numpy as np

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

#Get the confusion matrix
cm = confusion_matrix(y_true, y_pred)
print(cm)

Это дает вам:

 [[1 0 0]
  [1 0 0]
  [0 1 2]]

Точность рассчитывается как отношение правильно классифицированных образцов ко всем образцам:

accuracy = (TP + TN) / (P + N)

Что касается матрицы смешения, числитель (TP + TN) является суммой диагонали. Знаменатель - это сумма всех ячеек. Оба одинаковы для каждого класса.

Ответ 5

Ваш вопрос не имеет смысла. Точность - это глобальная мера, и нет такой вещи, как классовая точность. Предложения нормализовать по истинным случаям (строкам) дают то, что называется истинно-положительной скоростью, чувствительностью или отзывом, в зависимости от контекста. Аналогично, если вы нормализуетесь с помощью прогноза (столбцы), это называется точностью или положительным прогнозным значением.