2016-02-03 10 views
6

Non riesco a capire se ho impostato correttamente il mio problema di classificazione binaria. Ho etichettato la classe positiva 1 e quella negativa 0. Tuttavia è a mia conoscenza che per impostazione predefinita scikit-learn utilizza la classe 0 come classe positiva nella sua matrice di confusione (quindi l'inverso di come l'ho impostata). Questo mi confonde. La riga superiore è, nell'impostazione predefinita di scikit-learn, la classe positiva o negativa? lascia supporre l'uscita matrice di confusione:Scikit-learn confusion matrix

confusion_matrix(y_test, preds) 
[ [30 5] 
    [2 42] ] 

Come apparirebbe come in una matrice di confusione? Le istanze attuali sono le righe o le colonne in scikit-learn?

  prediction      prediction 
      0  1       1  0 
     ----- -----      ----- ----- 
     0 | TN | FP  (OR)   1 | TP | FP 
actual ----- -----    actual ----- ----- 
     1 | FN | TP      0 | FN | TN 

risposta

10

scikit imparare ordinamenti etichette in ordine crescente, quindi 0 sono prima colonna/riga e 1 del sono il secondo

>>> from sklearn.metrics import confusion_matrix as cm 
>>> y_test = [1, 0, 0] 
>>> y_pred = [1, 0, 0] 
>>> cm(y_test, y_pred) 
array([[2, 0], 
     [0, 1]]) 
>>> y_pred = [4, 0, 0] 
>>> y_test = [4, 0, 0] 
>>> cm(y_test, y_pred) 
array([[2, 0], 
     [0, 1]]) 
>>> y_test = [-2, 0, 0] 
>>> y_pred = [-2, 0, 0] 
>>> cm(y_test, y_pred) 
array([[1, 0], 
     [0, 2]]) 
>>> 

Questo è scritto nel docs:

etichette: array, shape = [n_classes], opzionale Elenco delle etichette per indicizzare la matrice. Questo può essere usato per riordinare o selezionare un sottoinsieme di etichette. Se non viene assegnato nessuno, quelli che appaiono almeno una volta in y_true o y_pred sono utilizzati nell'ordine.

Così è possibile modificare questo comportamento, fornendo le etichette per confusion_matrix chiamare

>>> y_test = [1, 0, 0] 
>>> y_pred = [1, 0, 0] 
>>> cm(y_pred, y_pred) 
array([[2, 0], 
     [0, 1]]) 
>>> cm(y_pred, y_pred, labels=[1, 0]) 
array([[1, 0], 
     [0, 2]]) 

E effettivo/previsto sono oredered proprio come nelle immagini - previsioni sono in colonne e valori effettivi in ​​righe

>>> y_test = [5, 5, 5, 0, 0, 0] 
>>> y_pred = [5, 0, 0, 0, 0, 0] 
>>> cm(y_test, y_pred) 
array([[3, 0], 
     [2, 1]]) 
  • true: 0, predetto: 0 (valore: 3, Esposizione [0, 0])
  • true: 5, previsto: 0 (valore: 2, posizione [1, 0])
  • true: 0, previsto: 5 (valore: 0, posizione [0, 1])
  • true: 5, previsto : 5 (valore: 1, posizione [1, 1])
+0

Mi hai appena salvato così tanto tempo. Grazie. – Chuck