Есть ли встроенный способ получения баллов точности для каждого класса отдельно? Я знаю, что в 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
Ваш вопрос не имеет смысла. Точность - это глобальная мера, и нет такой вещи, как классовая точность. Предложения нормализовать по истинным случаям (строкам) дают то, что называется истинно-положительной скоростью, чувствительностью или отзывом, в зависимости от контекста. Аналогично, если вы нормализуетесь с помощью прогноза (столбцы), это называется точностью или положительным прогнозным значением.