15

Ich bin neu im maschinellen Lernen und in scikit-learn.Scikit-lernen: So erhalten Sie True Positive, True Negative, False Positive und False Negative

Mein Problem:

(Bitte korrigieren Sie jede Art von missconception)

Ich habe einen Datensatz, der ein BIG JSON ist, rufe ich sie und speichern sie in einer trainList variabel.

Ich pre-Prozess es um damit arbeiten zu können.

Sobald ich das getan haben, ich die Klassifizierung beginnen:

  1. I kfold Kreuzvalidierungsmethode verwenden, um die mittlere Genauigkeit zu erhalten, und ich trainiere einen Klassifikator.
  2. Ich mache die Voraussagen und ich erhalte die Genauigkeit und Verwirrung Matrix dieser Falte.
  3. Danach möchte ich die True Positive (TP), True Negative (TN), False Positive (FP) und False Negative (FN) -Werte erhalten. Ich würde diese Parameter verwenden, um die Sensitivität und die Spezifität zu erhalten, und ich würde ihnen und der Summe der TPs einen HTML geben, um ein Diagramm mit den TPs jedes Etiketts zu zeigen.

Code:

Die Variablen, die ich für den Moment haben:

trainList #It is a list with all the data of my dataset in JSON form 
labelList #It is a list with all the labels of my data 

Der größte Teil des Verfahrens:

#I transform the data from JSON form to a numerical one 
X=vec.fit_transform(trainList) 

#I scale the matrix (don't know why but without it, it makes an error) 
X=preprocessing.scale(X.toarray()) 

#I generate a KFold in order to make cross validation 
kf = KFold(len(X), n_folds=10, indices=True, shuffle=True, random_state=1) 

#I start the cross validation 
for train_indices, test_indices in kf: 
    X_train=[X[ii] for ii in train_indices] 
    X_test=[X[ii] for ii in test_indices] 
    y_train=[listaLabels[ii] for ii in train_indices] 
    y_test=[listaLabels[ii] for ii in test_indices] 

    #I train the classifier 
    trained=qda.fit(X_train,y_train) 

    #I make the predictions 
    predicted=qda.predict(X_test) 

    #I obtain the accuracy of this fold 
    ac=accuracy_score(predicted,y_test) 

    #I obtain the confusion matrix 
    cm=confusion_matrix(y_test, predicted) 

    #I should calculate the TP,TN, FP and FN 
    #I don't know how to continue 

Antwort

9

Wenn Sie zwei Listen, die die vorhergesagten und tatsächlichen haben Werte; wie es scheint, die Sie tun können Sie sie an eine Funktion, die TP, FP, TN, FN mit etwas wie folgt berechnen wird:

def perf_measure(y_actual, y_hat): 
    TP = 0 
    FP = 0 
    TN = 0 
    FN = 0 

    for i in range(len(y_hat)): 
     if y_actual[i]==y_hat[i]==1: 
      TP += 1 
     if y_hat[i]==1 and y_actual[i]!=y_hat[i]: 
      FP += 1 
     if y_actual[i]==y_hat[i]==0: 
      TN += 1 
     if y_hat[i]==0 and y_actual[i]!=y_hat[i]: 
      FN += 1 

return(TP, FP, TN, FN) 

Von hier denke ich, Sie in der Lage sein werden die Preise für Sie von Interesse zu berechnen, und andere Leistungsmaßstab wie Spezifität und Empfindlichkeit.

+0

Ich bin neugierig, warum Sie den Vergleich mit 1 und 0 setzen. Ist das die Standardklasse? –

+0

Klasse sklearn.preprocessing.LabelBinizer (neg_label = 0, pos_label = 1, sparse_output = False) Siehe: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html Dies ist am häufigsten I Schema haben über die Pakete gesehen, die ich verwendet habe und die Unternehmen, die ich in gearbeitet haben. – invoketheshell

+0

ich glaube, Sie sollten inter Änderung FP, FN https://en.wikipedia.org/wiki/False_positives_and_false_negatives „The Falsch-Positiv-Rate ist der Anteil an echten Negativen, die immer noch positive Testergebnisse liefern, dh die bedingte Wahrscheinlichkeit eines positiven Testergebnisses bei einem Ereignis, das nicht vorhanden war. " –

15

Sie können alle Parameter erhalten aus die Konfusionsmatrix. Die Struktur der Konfusionsmatrix (die Matrix 2X2) ist wie folgt

TP|FP 
FN|TN 

So

TP = cm[0][0] 
FP = cm[0][1] 
FN = cm[1][0] 
TN = cm[1][1] 

Weitere Details unter https://en.wikipedia.org/wiki/Confusion_matrix

+0

In meinem Fall ist die Verwirrung Matrix nicht 2x2, sondern 3x3 oder 4x4. Zum Beispiel kann ich diese zwei Arrays erhalten: 'y_predicted: [0 0 0 0 0 1 1 2 0 2 2 3 2 2 2 2] y_true: [0 0 0 0 0 1 1 2 2 2 2 2 2 2 2 2] ' Und ich erhalte diese Verwirrung Matrix: ' [[5 0 0 0] [0 2 0 0] [1 0 7 1] [0 0 0 0]] ' – Euskalduna

+0

ich nahm binär Einstufung. Es scheint, dass es 3 oder 4 Klassen für Ihren Klassifikator gibt. –

+1

Dafür gibt es ein Beispiel für Katzen, Hunde und Pferde, wenn man sich den Wikipedia-Link anschaut. Das Konzept von richtig positiv, richtig negativ usw. macht für mich mehr Sinn in Anwesenheit von zwei Klassen, d. H. Positiv und negativ. Für Ihren Fall bin ich mir nicht sicher, was TP, FP bedeutet. Sie können TP als eine Summe von Diagonalelementen verwenden, aber ich bin mir nicht sicher. Man könnte eine Klassifizierung als positiv und alle anderen als negativ annehmen, um TP, FP usw. dafür zu berechnen, aber ich bin mir auch nicht sicher. –

0

Ich denke, dass beide Antworten nicht vollständig korrekt sind.Angenommen, wir haben die folgenden Arrays;
y_actual = [1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0]

y_predic = [1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0]

Wenn wir die FP, FN, TP und TN Werte manuell zu berechnen, sollten sie sich wie folgt:

FP: 3 FN: 1 TP: 3 TN: 4

Wenn wir jedoch die erste Antwort verwenden, werden die Ergebnisse wie folgt angegeben:

FP: 1 FN: 3 TP: 3 TN: 4

Sie sind nicht korrekt, denn in der ersten Antwort False Positive sein sollte tatsächliche wobei 0, aber die vorhergesagten 1, nicht das Gegenteil . Es ist auch dasselbe für falsches Negativ.

Und wenn wir die zweite Antwort verwenden, werden die Ergebnisse wie folgt berechnet:

FP: 3 FN: 1 TP: 4 TN: 3

Wahre Positive und Wahre Negative Zahlen sind nicht korrekt, sie sollten entgegengesetzt sein.

Bin ich richtig mit meinen Berechnungen? Bitte lassen Sie mich wissen, wenn ich etwas vermisse.

+0

Ich denke, die beste Antwort für diese Frage ist diese: https://stackoverflow.com/questions/31345724/scikit-learn-how-to-calculate-the-true-negative?rq = 1 – ykorkmaz

+0

Ich entschuldige mich für diese dumme Frage, aber ist die wahre Position der scikit Verwirrung Matrix wie folgt? Obere Reihe 'TN | FP' und untere Reihe 'FN | TP'? Ich habe versucht herauszufinden, welches was ist. Vielleicht könnte die Dokumentation auch für Idioten wie mich geschrieben werden? :-) – salvu

7

Nach Scikit-Learn Dokumentation

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix

per Definition eine Konfusionsmatrix C so ist, dass C [i, j], das die Anzahl der Beobachtungen gleich ist bekannt, in der Gruppe zu sein, i, aber vorhergesagt in Gruppe j sein.

Somit ist in der binären Klassifikation die Anzahl der wahren negativen Werte C [0,0], falsche negative Werte C [1,0], wahre positive Werte C [1,1] und falsche positive Werte C [0,1 ].

CM = confusion_matrix(y_true, y_pred) 

TN = CM[0][0] 
FN = CM[1][0] 
TP = CM[1][1] 
FP = CM[0][1] 
0

Wenn Sie mehr als eine Klasse in Ihrem Klassifikator haben, möchten Sie möglicherweise pandas-ml in diesem Teil verwenden. Confusion Matrix von Pandas-ml geben detailliertere Informationen. check that

RESULT

28

Für die Multi-Class-Fall alles, was Sie können, müssen aus der Konfusionsmatrix gefunden werden.Zum Beispiel sieht, wenn Ihr Konfusionsmatrix wie folgt aus:

confusion matrix

Dann, was Sie suchen, pro Klasse, kann wie folgt gefunden werden:

overlay

Mit Pandas/numpy

FP = confusion_matrix.sum(axis=0) - np.diag(confusion_matrix) 
FN = confusion_matrix.sum(axis=1) - np.diag(confusion_matrix) 
TP = np.diag(confusion_matrix) 
TN = confusion_matrix.values.sum() - (FP + FN + TP) 

# Sensitivity, hit rate, recall, or true positive rate 
TPR = TP/(TP+FN) 
# Specificity or true negative rate 
TNR = TN/(TN+FP) 
# Precision or positive predictive value 
PPV = TP/(TP+FP) 
# Negative predictive value 
NPV = TN/(TN+FN) 
# Fall out or false positive rate 
FPR = FP/(FP+TN) 
# False negative rate 
FNR = FN/(TP+FN) 
# False discovery rate 
FDR = FP/(TP+FP) 

# Overall accuracy 
ACC = (TP+TN)/(TP+FP+FN+TN) 
+1

wenn ich den Wert von TN berechnen möchte, bekomme ich diesen Fehler: 'numpy.darray' Objekt hat kein Attribut 'Werte' Ich benutze Python 3. – Aizzaac

+0

Der gleiche Fehler bei der Verwendung von Python 2.7 – user3184877

+2

Dies setzt voraus, dass Sie sind Verwenden Sie hier eine Pandas DataFrame-Instanz für die Konfusionsmatrix. Wenn Sie ein numpy Array verwenden, entfernen Sie einfach den '.values' Teil. – macKaiver

0

im scikit-Learn ‚Metriken‘ Bibliothek gibt es eine confusio:, Sie dies für alle Klassen auf einmal wie so tun können, n_matrix-Methode, die Ihnen die gewünschte Ausgabe liefert.

Sie können einen beliebigen Klassifizierer verwenden. Hier habe ich die KNeighbors als Beispiel benutzt.

from sklearn import metrics, neighbors 

clf = neighbors.KNeighborsClassifier() 

X_test = ... 
y_test = ... 

expected = y_test 
predicted = clf.predict(X_test) 

conf_matrix = metrics.confusion_matrix(expected, predicted) 

>>> print conf_matrix 
>>> [[1403 87] 
    [ 56 3159]] 

Die docs: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix

0

Hier ist ein Update des fehlerhaften Code invoketheshell (die derzeit als die akzeptierten Antwort erscheint):

def performance_measure(y_actual, y_hat): 
    TP = 0 
    FP = 0 
    TN = 0 
    FN = 0 

    for i in range(len(y_hat)): 
     if y_actual[i] == y_hat[i]==1: 
      TP += 1 
     if y_hat[i] == 1 and y_actual[i] == 0: 
      FP += 1 
     if y_hat[i] == y_actual[i] == 0: 
      TN +=1 
     if y_hat[i] == 0 and y_actual[i] == 1: 
      FN +=1 

    return(TP, FP, TN, FN) 
0

Ich schrieb eine Version, die mit nur numpy funktioniert. Ich hoffe es hilft dir.

import numpy as np 

def perf_metrics_2X2(yobs, yhat): 
    """ 
    Returns the specificity, sensitivity, positive predictive value, and 
    negative predictive value 
    of a 2X2 table. 

    where: 
    0 = negative case 
    1 = positive case 

    Parameters 
    ---------- 
    yobs : array of positive and negative ``observed`` cases 
    yhat : array of positive and negative ``predicted`` cases 

    Returns 
    ------- 
    sensitivity = TP/(TP+FN) 
    specificity = TN/(TN+FP) 
    pos_pred_val = TP/ (TP+FP) 
    neg_pred_val = TN/ (TN+FN) 

    Author: Julio Cardenas-Rodriguez 
    """ 
    TP = np.sum( yobs[yobs==1] == yhat[yobs==1]) 
    TN = np.sum( yobs[yobs==0] == yhat[yobs==0]) 
    FP = np.sum( yobs[yobs==1] == yhat[yobs==0]) 
    FN = np.sum( yobs[yobs==0] == yhat[yobs==1]) 

    sensitivity = TP/(TP+FN) 
    specificity = TN/(TN+FP) 
    pos_pred_val = TP/ (TP+FP) 
    neg_pred_val = TN/ (TN+FN) 

    return sensitivity, specificity, pos_pred_val, neg_pred_val 
Verwandte Themen