Я проверил все вопросы SO, которые генерируют матрицу путаницы и вычисляют TP, TN, FP, FN.
В основном это использование
from sklearn.metrics import confusion_matrix
Для двух классов это легко
из sklearn.metrics импортировать путаницу_матрицу
y_true = [1, 1, 0, 0]
y_pred = [1, 0, 1, 0]
tn, fp, fn, tp = confusion_matrix(y_true, y_pred, labels=[0, 1]).ravel()
Для мультикласса есть одно решение, но оно подходит только для первого класса. Не весь класс
def perf_measure(y_actual, y_pred):
class_id = set(y_actual).union(set(y_pred))
TP = []
FP = []
TN = []
FN = []
for index ,_id in enumerate(class_id):
TP.append(0)
FP.append(0)
TN.append(0)
FN.append(0)
for i in range(len(y_pred)):
if y_actual[i] == y_pred[i] == _id:
TP[index] += 1
if y_pred[i] == _id and y_actual[i] != y_pred[i]:
FP[index] += 1
if y_actual[i] == y_pred[i] != _id:
TN[index] += 1
if y_pred[i] != _id and y_actual[i] != y_pred[i]:
FN[index] += 1
return class_id,TP, FP, TN, FN
Но это по умолчанию рассчитывается только для одного класса.
Но я хочу рассчитать значения для каждого класса с учетом 4 класса. Для https://extendsclass.com/csv-editor.html#0697f61
Я сделал это с помощью excel, как это.
Затем вычислите результаты для каждого
Я автоматизировал это на листе Excel, но есть ли какое-либо программное решение в python или sklearn для этого?
Это намного проще с multilabel_confusion_matrix. В вашем примере вы также можете передать labels=["A", "N", "O", "~"]
в качестве аргумента, чтобы получить метки в предпочтительном порядке.
from sklearn.metrics import multilabel_confusion_matrix
import numpy as np
mcm = multilabel_confusion_matrix(y_true, y_pred)
tps = mcm[:, 1, 1]
tns = mcm[:, 0, 0]
recall = tps / (tps + mcm[:, 1, 0]) # Sensitivity
specificity = tns / (tns + mcm[:, 0, 1]) # Specificity
precision = tps / (tps + mcm[:, 0, 1]) # PPV
В результате получается массив для каждой метрики:
[[0.83333333 0.94285714 0.64 0.25 ] # Sensitivity / Recall
[0.99029126 0.74509804 0.91666667 1. ] # Specificity
[0.9375 0.83544304 0.66666667 1. ]] # Precision / PPV
Кроме того, вы можете просмотреть точность, зависящую от класса, и вспомнить в classification_report. Вы можете получить те же списки с output_dict=True
и каждой меткой класса.
>>> print(classification_report(y_true, y_pred))
precision recall f1-score support
A 0.94 0.83 0.88 18
N 0.84 0.94 0.89 70
O 0.67 0.64 0.65 25
~ 1.00 0.25 0.40 8
accuracy 0.82 121
macro avg 0.86 0.67 0.71 121
weighted avg 0.83 0.82 0.81 121
Извините, я не понимаю. specificity = tns / (tns + mcm[:, 0, 1])
дает специфику для каждого класса. Если вам нужен один класс, вы можете выбрать его с помощью specificity[0]
, specificity[1]
и т. д.
Не могли бы вы включить, как мы можем увидеть чувствительность, специфичность, pos pred для каждого класса отдельно?