scikit-learn - ROC-Kurve mit Konfidenzintervall
Ich bin in der Lage, eine ROC-Kurve mit scikit-learn
mit
fpr
, tpr
, thresholds = metrics.roc_curve(y_true,y_pred, pos_label=1)
, wo y_true
ist eine Liste von Werten basierend auf meinen gold-standard (d.h., 0
negativen 1
für positive Fälle) und y_pred
ist eine entsprechende Liste von scores (z.B., 0.053497243
, 0.008521122
, 0.022781548
, 0.101885263
, 0.012913795
, 0.0
, 0.042881547
[...])
Ich versuche, herauszufinden, wie man Konfidenzintervalle um die Kurve, aber nicht finden, eine einfache Möglichkeit zu tun, die mit sklearn.
- Vielen Dank für die änderungen! Neue user mich versuchen, und verwenden Sie die richtige Formatierung in der Zukunft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie das bootstrap der roc-Berechnungen (Probe mit Ersatz neue Versionen von
y_true
/y_pred
aus dem ursprünglicheny_true
/y_pred
und berechnen einen neuen Wert fürroc_curve
jedes mal) und die Schätzung ein Konfidenzintervall auf diese Weise.Zu nehmen, die Variabilität, die durch die Zug-test in split-Konto, können Sie auch die ShuffleSplit CV iterator viele Male, passen Sie ein Modell auf dem Zug split, generieren
y_pred
für jedes Modell und so versammeln Sie eine empirische Verteilung derroc_curve
s als gut und schließlich berechnen von Konfidenzintervallen für diese.Bearbeiten: - bootstrapping in python
Hier ist ein Beispiel für bootstrapping die ROC-AUC-Wert der Vorhersagen von einem einzigen Modell. Ich entschied mich für die bootstap die ROC-AUC um es einfacher zu Folgen, wie einem Stack-Überlauf-Antwort, aber es kann angepasst werden, um die bootstrap die ganze Kurve statt:
Können Sie sehen, dass wir verwerfen müssen einige ungültige passt in diesem Fall. Jedoch auf realen Daten mit viele Vorhersagen dieses ist ein sehr Seltenes Ereignis und sollte keine Auswirkung auf das Konfidenzintervall deutlich (Sie können versuchen, variieren die
rng_seed
zu prüfen).Hier ist das Histogramm:
Beachten Sie, dass die Resampling erzielt werden zensiert, in die [0 - 1] Bereich verursacht eine hohe Anzahl von Bewertungen in der Letzte bin.
Erhalten ein Konfidenzintervall kann man die Sortierung der Proben:
gibt:
Das Konfidenzintervall ist sehr breit, aber dies ist wahrscheinlich eine Folge meiner Wahl Vorhersagen (3 Fehler von 9 Vorhersagen) und die Gesamtzahl der Vorhersagen ziemlich klein.
Andere Bemerkung auf den Plan: die Noten quantisiert (viele leere Histogramm-bins). Dies ist eine Folge der kleinen Anzahl von Vorhersagen. Man könnte sich vorstellen, ein bisschen von Gauß-Rauschen auf die Noten (oder der
y_pred
Werte) zur Glättung der Verteilung und machen das Histogramm besser Aussehen. Aber dann ist die Wahl des smoothing-Bandbreite ist heikel.Schließlich-wie bereits erwähnt-dieses Konfidenzintervall ist speziell auf die Ausbildung legen. Um eine bessere Schätzung der Variabilität der ROC an, die durch Ihre model-Klasse und die Parameter, die Sie tun sollten, bekräftigte cross-Validierung statt. Dies ist jedoch oft sehr viel teurer als Sie benötigen, zu trainieren, ein neues Modell für jedes zufällige Bahn /test-split.
numpy.random.random_integer
zum Beispiel mit Ersatz. Ich bearbeitete die Antwort.DeLong Lösung
[KEIN bootstrapping]
Wie von einigen hier vorgeschlagen, eine
pROC
Ansatz wäre nett. NachpROC
Dokumentation, Konfidenzintervalle berechnet werden, die über DeLong:Yandex Daten, die Schule hat eine Schnelle DeLong Umsetzung auf Ihre öffentlichen repo:
https://github.com/yandexdataschool/roc_comparison
Also alle credits, um Sie für die DeLong Umsetzung der in diesem Beispiel verwendet.
Also hier ist, wie Sie ein CI erhalten über DeLong:
Ausgabe:
Habe ich auch überprüft, dass diese Implementierung entspricht der
pROC
Ergebnisse ausR
:Ausgabe:
Dann
Ausgabe
R
's pROC-Paket. Hat sonst jemand überprüft diese?