7

Używam nauki Scikit i muszę obliczyć True pozytywny (TP), fałszywy pozytywny (FP), True Negative (TN) i fałszywy ujemny (FN) z matrycą zamieszanie jak ten:Scikit-learn: Jak obliczyć True Negative

[[2 0 3 4] 
[0 4 5 1] 
[1 0 3 2] 
[5 0 0 4]] 

wiem jak obliczyć TP, FP i FN, ale nie wiem, jak uzyskać TN. Czy ktoś może mi powiedzieć?

Odpowiedz

8

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 
+0

Ś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

-2

Myślę, że w przypadku takiego problemu wieloklasowego trzeba zdecydować, która z tych 4 klas może być uznana za pozytywną, a resztę 3 należy połączyć jako ujemną, aby obliczyć wartość rzeczywistą. Szczegółową dyskusję przeprowadzono na here.