2016-05-13 2 views
3

Ich habe den folgenden Code:Wie Vorhersage-Score bei der Schaffung von ROC-Kurve mit verwenden Scikit-Learn

from sklearn.metrics import roc_curve, auc 

actual  = [1,1,1,0,0,1] 
prediction_scores = [0.9,0.9,0.9,0.1,0.1,0.1] 
false_positive_rate, true_positive_rate, thresholds = roc_curve(actual, prediction_scores, pos_label=1) 
roc_auc = auc(false_positive_rate, true_positive_rate) 
roc_auc 
# 0.875 

die Interpretation von prediction_scores In diesem Beispiel nämlich einfach ist, die höher die Punktzahl desto sicherer die Vorhersage ist.

Jetzt habe ich eine andere Reihe von Vorhersage Vorhersage Punktzahlen. Es ist nicht gebrochen, und die Interpretation ist umgekehrt. Das heißt, die unteren der Score ist sicherer die Vorhersage ist.

prediction_scores_v2 = [10.3,10.3,10.2,10.5,2000.34,2000.34] 
# so this is equivalent 

Meine Frage ist: wie kann ich skalieren, dass in prediction_scores_v2 so dass es Ähnliche AUC-Score wie die ersten gibt?

Um es anders auszudrücken, Scikit's ROC_CURVE die y_score erfordertWahrscheinlichkeitsschätzungen der positiven Klasse. Wie kann ich den Wert behandeln, wenn die y_score Ich habe Wahrscheinlichkeitsschätzungen der falschen Klasse?

+0

Ich bin mir nicht sicher, was Sie fragen. Was repräsentieren Ihre neuen Vorhersagewerte? – BrenBarn

+0

@BrenBarn: Sie können es als die "Umkehrung" des Vertrauens sehen. – neversaint

+1

In welchem ​​Sinne? Sie generieren die AUC aus bestimmten Informationen, nämlich der Falsch-Positiv-Rate und der echten Positivrate für verschiedene Diskriminierungsschwellen. Sie können nicht einfach willkürliche Zahlen nehmen und daraus eine AUC berechnen. Sie müssen erklären, was diese Zahlen darstellen, statistisch/mathematisch gesprochen. – BrenBarn

Antwort

4

Für AUC kümmern Sie sich wirklich nur um die Bestellung Ihrer Vorhersagen. Solange dies der Fall ist, können Sie Ihre Vorhersagen einfach in ein Format bringen, das AUC akzeptiert.

Sie werden durch den max teilen mögen Ihre Vorhersagen zwischen 0 und 1, um zu bekommen und dann von 1 subtrahieren, da niedrigeren besser in Ihrem Fall ist:

max_pred = max(prediction_scores_v2) 
prediction_scores_v2[:] = (1-x/max_pred for x in prediction_scores_v2) 

false_positive_rate, true_positive_rate, thresholds = roc_curve(actual, prediction_scores_v2, pos_label=1) 
roc_auc = auc(false_positive_rate, true_positive_rate) 
# 0.8125 
0

Wie kann ich behandeln der Wert, wenn die y_score ich habe ist Wahrscheinlichkeitsschätzungen der falschen Klasse?

Dies ist ein wirklich billig Schuss, aber haben Sie die ursprüngliche Klassenliste betrachtet Umkehr, wie in

actual  = [abs(x-1) for x in actual] 

Dann könnte man die Normalisierung gelten noch @Tchotchke proposed.

Noch am Ende scheint @BrenBarn richtig. Schauen Sie sich nach Möglichkeit eingehend an, wie diese Werte im anderen Vorhersagewerkzeug erstellt und/oder verwendet werden.