7

Sto usando Scikit-learning e ho bisogno di calcolare il vero positivo (TP), il falso positivo (FP), il vero negativo (TN) e il falso negativo (FN) da una matrice di confusione come questo:Scikit-learn: come calcolare il vero negativo

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

so come calcolare il TP, la FP e FN, ma non so come ottenere il TN. Qualcuno può dirmelo?

risposta

8

Penso che dovresti trattare questa classificazione multi-classe in modo one-to-the-rest (quindi ogni tabella 2x2 i misura le prestazioni di un problema di classificazione binaria che ogni oggetto appartenente all'etichetta i o meno). Di conseguenza, è possibile calcolare TP, FP, FN, TN per ogni singola etichetta.

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

Ottima risposta! Per aggiungere un po 'alla discussione, farò notare che 'scikit-learn' ha anche funzionalità per le metriche di punteggio multi-classe. Se stavi progettando di aggregare TP, FP, FN e TN in un ROC, ti suggerirei di utilizzare i metodi di metrica del punteggio che sono [documentati qui] (http://scikit-learn.org/stable/modules/classes.html # sklearn-metrics-metrics) e indirizzati in [la guida dell'utente qui] (http://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics). Le metriche come il punteggio F1 diventano molto confuse quando vengono introdotte molte classi, quindi queste metriche sono MOLTO utili. – AN6U5

-2

Penso che per un problema multiclasse come questo devi decidere quale di queste 4 classi può essere considerata positiva e devi combinare il riposo 3 come negativo per calcolare il vero negativo. Una discussione dettagliata è stata fatta here.

Problemi correlati