Myślę, że powinieneś traktować tę klasyfikację wieloplatformową w sposób jeden do reszty (tak, że każda tablica 2x2 i
mierzy wydajność binarnego problemu klasyfikacji, czy każdy z nich należy do etykiety i
czy nie). W związku z tym można obliczyć wartości TP, FP, FN, TN dla każdej etykiety.
import numpy as np
confusion_matrix = np.array([[2,0,3,4],
[0,4,5,1],
[1,0,3,2],
[5,0,0,4]])
def process_cm(confusion_mat, i=0, to_print=True):
# i means which class to choose to do one-vs-the-rest calculation
# rows are actual obs whereas columns are predictions
TP = confusion_mat[i,i] # correctly labeled as i
FP = confusion_mat[:,i].sum() - TP # incorrectly labeled as i
FN = confusion_mat[i,:].sum() - TP # incorrectly labeled as non-i
TN = confusion_mat.sum().sum() - TP - FP - FN
if to_print:
print('TP: {}'.format(TP))
print('FP: {}'.format(FP))
print('FN: {}'.format(FN))
print('TN: {}'.format(TN))
return TP, FP, FN, TN
for i in range(4):
print('Calculating 2x2 contigency table for label{}'.format(i))
process_cm(confusion_matrix, i, to_print=True)
Calculating 2x2 contigency table for label0
TP: 2
FP: 6
FN: 7
TN: 19
Calculating 2x2 contigency table for label1
TP: 4
FP: 0
FN: 6
TN: 24
Calculating 2x2 contigency table for label2
TP: 3
FP: 8
FN: 3
TN: 20
Calculating 2x2 contigency table for label3
TP: 4
FP: 7
FN: 5
TN: 18
Świetna odpowiedź! Aby dodać trochę do dyskusji, zwrócę uwagę, że "scikit-learn" ma również funkcjonalność dla wielopoziomowych metryk punktacji. Jeśli planowałeś zgrupować TP, FP, FN i TN w ROC, sugerowałbym użycie metod metrycznych z punktacją, które są [udokumentowane tutaj] (http://scikit-learn.org/stable/modules/classes.html # sklearn-metics-metry) i omówione w [podręczniku użytkownika tutaj] (http://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics). Metryki takie jak F1-score stają się bardzo mylące, gdy wprowadzono wiele klas, więc te dane są BARDZO przydatne. – AN6U5