Scikit-learn: Unterstützung für roc_auc-Scores mit mehreren Klassen

Erstellt am 19. Juni 2014  ·  47Kommentare  ·  Quelle: scikit-learn/scikit-learn

Funktionsanforderung mit niedriger Priorität: Unterstützung für die Berechnung des roc_auc-Scores mit mehreren Klassen in sklearn.metrics Verwendung der Methode „Eins gegen alle“ wäre unglaublich nützlich.

New Feature

Hilfreichster Kommentar

Bei der Mikromittelung wird Ihre True Positive Rate (TPR) berechnet, indem die Summe aller TPs aller Klassen genommen und durch die Summe aller TPs und FNs aller Klassen geteilt wird, dh für ein 3-Klassen-Problem:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

Beispiel Verwirrungsmatrix:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
Machen Sie dasselbe für die False-Positive-Rate und Sie können die AUC berechnen.

Die Makromittelung berechnet lediglich den TPR für jede Klasse separat und mittelt sie (gewichtet nach der Anzahl der Beispiele in dieser Klasse oder nicht):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

Mit dem gleichen Beispiel:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

Vielleicht hilft das (dies verwendet Präzision, aber die Idee ist dieselbe):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Ich persönlich würde nie einen ungewichteten Makro-Durchschnitt verwenden, aber ich werde sehen, ob ich die Papiere finde, die dies untersucht haben.

Alle 47 Kommentare

Ich bin mir nicht sicher, was das bedeutet. Hast du eine Referenz dazu?

Am 19. Juni 2014 um 09:51 Uhr schrieb Madison May [email protected] :

Funktionsanforderung mit niedriger Priorität: Unterstützung für roc_auc-Score mit mehreren Klassen
Berechnung in sklearn.metrics nach der Methode „one against all“
wäre unglaublich nützlich.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298.

Hier ist eine ziemlich anständige Erklärung zusammen mit Referenzen: https://www.cs.bris.ac.uk/~flach/ICML04tutorial/ROCtutorialPartIII.pdf

hmm, was ist ein empfohlener Scorer, wenn Multi-Class-AUC nicht implementiert ist?

Unterstützung für die Berechnung des roc_auc-Scores mit mehreren Klassen in sklearn.metrics unter Verwendung der Methode „Eins gegen alle“ wäre unglaublich nützlich

Sprechen Sie davon, was diese Folien als Annäherung an das Volumen unter der Oberfläche betrachten, in dem der frequenzgewichtete Durchschnitt der AUC für jede Klasse genommen wird? Dies scheint identisch mit der Verwendung des aktuellen roc_auc_score mit einer binarisierten Darstellung und average='weighted' . ( @arjoly , warum verbieten diese kurvenbasierten Bewertungen Mehrklassen?)

Ansonsten konzentrieren sich diese Folien und die meisten Referenzen, die ich zu "Multi-Class-ROC" finden kann, auf die Multi-Class-Kalibrierung von OvR, nicht auf eine Bewertungsmetrik. Interessiert Sie das? Ich habe keine Ahnung, wie weit verbreitet diese Technik ist, ob es sich lohnt, sie in scikit-learn zur Verfügung zu stellen und ob die gierige Optimierung verbessert werden sollte.

( @arjoly , warum verbieten diese kurvenbasierten Bewertungen Mehrklassen?)

Wenn in y_true eine Klasse fehlt, ist es nicht möglich, die Punktzahl zu berechnen. Ich wollte die Magie für die Klasseninferenz nicht hinzufügen und brachte die Benutzer in Schwierigkeiten.

Es ist möglich, dass wir im Fall von y_pred . nicht angemessen vorgehen
mit einem Label, das y_true nicht hat. Dieses Etikett sollte wahrscheinlich nicht
an so etwas wie einem Makrodurchschnitt teilnehmen (nach Weka,
auch) oder einen ROC-Score.

Am 1. August 2014 um 17:08 Uhr schrieb Arnaud Joly [email protected] :

( @arjoly https://github.com/arjoly, warum sind diese ?
Mehrklassen nicht zulassen?)

Immer wenn eine Klasse in y_true fehlt, ist es nicht möglich zu berechnen
Die Punktzahl. Ich wollte die Magie für die Klassenschlussfolgerung nicht hinzufügen und bekam
Benutzer in Probleme.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -50855460
.

@jnothman @arjoly es gab viele Fortschritte bei der Mittelwertbildung. Wie schwer ist das jetzt umzusetzen?

es könnte vielleicht der R-Funktion aus dem pROC-Paket ähneln
http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

Hallo, ich habe einen Entwurf des makrogemittelten ROC/AUC-Scores implementiert, bin mir aber nicht sicher, ob er für Sklearn geeignet ist.

Hier ist der Code:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Könnte es so einfach sein?

@fbrundu, wenn dies die Standardbedeutung ist. Es ist sicherlich eine mögliche Interpretation.

Eine schöne Zusammenfassung gibt es hier:
http://people.inf.elte.hu/kiss/13dwhdm/roc.pdf

Das pROC-Paket implementiert Hand and Till:
http://download.springer.com/static/pdf/398/art%253A10.1023%252FA%253A1010920819831.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1023%2FA% 3A1010920819831&token2=exp=1469743016 ~acl=%2Fstatic%2Fpdf%2F398%2Fart%25253A10.1023%25252FA%25253A1010920819831.pdf%3ForiginUrl%3Dhttp%253A%252F%252Flink.springer.com%2F%3102510.13% *~hmac=bc68686d3782ac6af3c3cda13c1b36aad6de5d01d16a25870cace5fe9699fb8a

Die Version von Hand and Till scheint allgemein akzeptiert zu sein und ich stimme dafür, dass wir das implementieren.
Es gibt auch eine Version von Provost und Domingos, für die ich wahrscheinlich Wurzeln schlagen sollte, da Provost derzeit mein Regisseur ist, aber das hat sich nicht durchgesetzt.
Der Provost-Domingos ist das, was @fbrundu nur mit average='weighted' gesagt hat.

TLDR: PR für Hand and Till willkommen. Optional Provost und Domingos mit Option zum Ändern der Mittelwertbildung.

Hallo, gibt es Fortschritte bei der Umsetzung?
Was ich in den meisten anderen Bibliotheken (zB WEKA) gesehen habe, ist, dass sie den gewichteten Durchschnitt verwenden. Ich würde denken, dass @fbrundu dies mit Average='micro' vorgeschlagen hat?

@joaquinvanschoren R verwendet die Hand und die Till. Das wäre mir auch lieber. Ich habe einen Studenten, der bald daran arbeiten wird.

@amueller Daran kann ich arbeiten :)

@kchen17 danke!

Wir haben dies bei OpenML ziemlich viel diskutiert. Für Mehrklassen-AUC gibt es keine Garantien dafür, dass ein Ansatz (Makro-Mittelwertbildung, Mikro-Mittelwertbildung, gewichtete Mittelwertbildung, ...) besser ist als der andere. In R finden Sie mindestens 5 verschiedene Ansätze (jetzt alle auch in MLR verfügbar).
Wenn Sie dies in scikit-learn implementieren, wäre es großartig, wenn Sie zumindest die Möglichkeit haben, die für Ihre Anwendung am sinnvollsten auszuwählen, auch wenn Sie Hand-Till als Standard verwenden. Hand-Till ist übrigens ein nicht gewichteter Ansatz, er berücksichtigt keine Label-Unwucht.

Ich bin froh, mehrere Versionen zu haben. ungewichtet und "ohne Berücksichtigung der Label-Unwucht" sind zwei verschiedene Dinge ;) Hast du eine Liste und Referenzen?

Was ist in diesem Fall die Mikromittelung?

Beachten Sie, dass wir bereits eine mikro- und makrogemittelte ROC AUC für Mehrklassenprobleme in diesem Beispiel implementiert haben:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass -settings

Eigentlich denke ich, dass die Dokumentation falsch ist und sollte sagen
Multilabel...

Am 26. September 2016 um 23:16, Olivier Grisel [email protected]
schrieb:

Nicht, dass wir bereits die mikro- und makrogemittelte ROC AUC für Multiclass
Probleme, die in diesem Beispiel implementiert wurden:

http://scikit-learn.org/stable/auto_examples/model_
selection/plot_roc.html#multiclass-settings


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -249566346,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz65IeU7k2CFwyHxTTAjk-5orIxWe6ks5qt8WsgaJpZM4CFzud
.

Bei der Mikromittelung wird Ihre True Positive Rate (TPR) berechnet, indem die Summe aller TPs aller Klassen genommen und durch die Summe aller TPs und FNs aller Klassen geteilt wird, dh für ein 3-Klassen-Problem:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

Beispiel Verwirrungsmatrix:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
Machen Sie dasselbe für die False-Positive-Rate und Sie können die AUC berechnen.

Die Makromittelung berechnet lediglich den TPR für jede Klasse separat und mittelt sie (gewichtet nach der Anzahl der Beispiele in dieser Klasse oder nicht):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

Mit dem gleichen Beispiel:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

Vielleicht hilft das (dies verwendet Präzision, aber die Idee ist dieselbe):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Ich persönlich würde nie einen ungewichteten Makro-Durchschnitt verwenden, aber ich werde sehen, ob ich die Papiere finde, die dies untersucht haben.

Hi! Ich konnte letzte Woche damit beginnen, mich mit diesem Problem zu befassen, und wollte ein kurzes Update / einige Fragen posten, um sicherzustellen, dass ich auf dem richtigen Weg bin.

  • Bisher: Ich beginne mit der Implementierung einer Funktion multiclass_roc_auc_score die standardmäßig einige average Parameter auf None gesetzt hat. Dieser Standard verwendet den Hand-Till-Algorithmus (wie besprochen berücksichtigt dies nicht das Label-Ungleichgewicht).
  • Würde die Methode dieselben Parameter akzeptieren wie in roc_auc_score ?
  • Und davon ausgehend wäre der Unterschied dann, dass y_true mehr als 2 Klassen von Labels haben könnte. Hand-Till würde bedeuten, alle möglichen Paare von Labels zu finden, roc_auc_score für jedes dieser Paare zu berechnen und dann den Mittelwert daraus zu bilden.

Lassen Sie mich wissen, welche Korrekturen/Anregungen Sie haben!

Normalerweise würden wir es vermeiden, eine weitere Funktion zu erstellen, wenn die Wiederverwendung von roc_auc_score vernünftigerweise machbar ist. Ich denke, es ist akzeptabel, die Standardeinstellung als "Makro" zu belassen.

Eine wichtige Sache, über die Sie nachdenken sollten, ist, wie Sie diese Änderungen testen können, einschließlich der Änderung der Merkmale von roc_auc_score in metrics/tests/test_common.py

Ja, wir sollten die Dokumente aktualisieren.

@joaquinvanschoren interessanterweise hat dieses Papier keines der oben genannten Multi-Class-AUC-Papiere diskutiert, insbesondere nicht das Fawcett-Papier von 2005 .... hm, ich denke, es ist eine Renormalisierung der 1-vs-1-Multi-Klasse?

Daher haben wir derzeit nur Multi-Label und möchten Multi-Class mit 1vs1 und 1vsRest hinzufügen, und sie haben jeweils gewichtete und ungewichtete Varianten.
Ich verstehe nicht wirklich, wie die Mittelwertbildung von sample und micro für AUC funktioniert :(

Also... Ich schlage vor, wir fügen AUC einen Parameter multi-class , der ovo oder ovr , und berücksichtigen den Gewichtungsparameter. Ich bin mir nicht sicher, ob wir sample und micro zulassen wollen, da das für mich keinen Sinn ergibt.

@arjoly also micro und sample auf den Zeilen und nicht auf den Spalten der Matrix? Gibt es dazu Papiere? Das habe ich in der ROC-Literatur nicht gefunden.

Das Problem dabei ist, dass wir den gewichteten Durchschnitt von OvO durchführen müssten, um die Hand-Till-Messung als Standard zu verwenden, und wir die Gewichtungsoption nicht wirklich ändern können. Vielleicht machen wir also standardmäßig OVR und erklären in der Erzählung, dass OvO mit Gewichtung auch eine gute Wahl ist und fügen eine Referenz hinzu?

Die Zusammenfassung des zitierten Papiers von @joaquinvanschoren besagt auch, dass alle AUC-Versionen so ziemlich die gleichen Ergebnisse liefern.

@amueller : Hatte die Gelegenheit, Ihren Kommentar noch einmal zu lesen, und ich bin etwas verwirrt über diesen Teil:

Das Problem dabei ist, dass wir den gewichteten Durchschnitt von OvO durchführen müssten, um die Hand-Till-Messung als Standard zu verwenden, und wir die Gewichtungsoption nicht wirklich ändern können. Vielleicht machen wir also standardmäßig OVR und erklären in der Erzählung, dass OvO mit Gewichtung auch eine gute Wahl ist und fügen eine Referenz hinzu?

Ich wollte roc_auc_score ändern, um einen multiclass=['ovo', 'ovr'] Parameter gemäß Ihrer Antwort zu integrieren. Wenn OvR Standard ist ( roc_auc_score(y_true, y_score, multiclass="ovo" ... ) ), aber Hand & Till OvO ist, was mache ich, um den OvR-Teil der Implementierung zu adressieren? (dh wenn ich erkenne, dass y_true multiclass ist, geben Sie einfach einen Fehler aus, wenn "ovr" nicht implementiert ist, und weisen Sie die Benutzer an, "ovo" einzugeben?)

Entschuldigung, ich habe erwartet, dass Sie sowohl ovo als auch ovr implementieren ;) Ich denke, das sollte ziemlich einfach sein.

@amueller : y_score überprüft, aber sehr schnell wurde mir klar, dass dies nicht ausreichen würde. (dh nur überprüfen, ob die Labels nur 0s und 1s sind?)

Multilabel bedeutet, dass mehrere Labels gleichzeitig vorhergesagt werden: Sie erhalten a
Vektor von Vorhersagen pro Instanz. Multiclass bedeutet, dass Sie eine Single bekommen
Vorhersage, aber diese Vorhersage kann mehr als zwei Werte haben (ist es nicht
binär).

Manchmal lösen die Leute den Fall mit mehreren Klassen, indem sie die Ausgabe binarisieren, daher
Sie erhalten mehrere Binärwerte pro Instanz (daher Multilabel) und dies
sorgt oft für Verwirrung.
Am Samstag, den 8. Oktober 2016 um 16:33 Uhr schrieb Kathy Chen [email protected] :

@amueller https://github.com/amueller : Notiert und das wird sein
auch eingearbeitet! Wollte auch fragen: Gibt es Tipps, wie man es macht?
den Unterschied zwischen Multiclass und Multilabel erkennen? Zuerst war ich
Ich habe nur die Dimensionen von y_score überprüft, aber das ist sehr schnell klar geworden
würde nicht ausreichen.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252427642,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ABpQV7Mv0rHGEfrkYi5Xezz3PItyrLZ6ks5qx6mdgaJpZM4CFzud
.

Hallo, ich hoffe, type_of_target könnte den Zweck der Unterscheidung zwischen multi-label und multi-class Ausgaben lösen. HTH

Die Verwendung von type_of_target ist eine gute Idee. Obwohl in scikit-learn die Dimensionalität von y tatsächlich der Indikator ist, ob wir Multi-Label oder Multi-Target machen wollen. Wenn Sie die Ausgabe wie von @joaquinvanschoren vorgeschlagen binarisieren, geht scikit-learn immer von mehreren Labels aus.

type_of_target ist gut, um zwischen den y_trues zu unterscheiden, @amueller

Am 9. Oktober 2016 um 05:18 Uhr, Andreas Mueller [email protected]
schrieb:

Die Verwendung von type_of_target ist eine gute Idee. Obwohl in scikit-lernen Sie die
Die Dimensionalität von y ist eigentlich der Indikator, ob wir das machen wollen
Multi-Label oder Multi-Target. Wenn Sie die Ausgabe binarisieren als
@joaquinvanschoren https://github.com/joaquinvanschoren vorgeschlagen
scikit-learn geht immer von mehreren Labels aus.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252439908,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz6wa5fnE_LX3LLXbCoc0Z4hBbSAQ0ks5qx95rgaJpZM4CFzud
.

Hallo zusammen, ich wollte Ihnen nur mitteilen, dass ich eine "vorläufige" PR eingereicht habe. Ich bin an Feedback zur Implementierung interessiert (z. B. bin ich sicher, dass es Möglichkeiten gibt, numpy/etc. besser zu nutzen als ich es jetzt tue), zusammen mit Best Practices zum Hinzufügen neuer Tests, Dokumentationsformulierungen usw.

Vielen Dank für die bisherige Hilfe!

Gibt es Fortschritte beim Hinzufügen von Multiclass-Support für AUC?

@joaquinvanschoren : Arbeiten an Überarbeitungen nach einem Code-Review von @jnothman in #7663. Werde wahrscheinlich nächste Woche ein weiteres Update dazu einreichen, wenn ich mit den Midterms fertig bin

Hallo @kathyxchen , @jnothman ,

Gibt es Neuigkeiten zum PR?

Einfach einchecken, um zu sehen, ob es Fortschritte beim Hinzufügen von Multi-Class-Support für AUC gibt?

Wir haben Schwierigkeiten zu bestimmen, was sowohl akzeptiert als auch prinzipientreu ist
Formulierung von ROC AUC für Mehrklassen. Sehen
https://github.com/scikit-learn/scikit-learn/pull/7663#issuecomment -307566895
und darunter.

Also Kameraden. Gibt es Fortschritte beim Multiclass Auc Score? Ich fand den offiziellen Dokumentationscode mit dem Iris-Dataset sehr verwirrend. Denn diese Methode zeigt, dass mein Modell Zufallszahlen ziemlich gut vorhersagt.

Dies ist fast fertig, wir müssen uns vor dem Zusammenführen für ein API-Detail entscheiden: https://github.com/scikit-learn/scikit-learn/pull/12789#discussion_r295693965

@trendsearcher kannst du bitte ein Beispiel geben? Es ist jetzt zusammengeführt, aber ich würde gerne das Problem sehen, das Sie erlebt haben.

Froh, dass ich Helfen kann. Wie kann ich ein Beispiel geben (es hat viel Code und ist es möglicherweise nicht?)
intuitiv)? Vielleicht kann ich es im Klartext schreiben?

т, 18 июл. 2019 г. в 00:35, Andreas Mueller [email protected] :

@trendsearcher https://github.com/trendsearcher können Sie eine
Beispiel bitte? Es ist jetzt zusammengeführt, aber ich würde gerne das Problem sehen Sie
erfahren.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/3298?email_source=notifications&email_token=AKS7QOFYRQY7RZJBWUVVJSTP76GDFA5CNFSM4AQXHOO2YY3PNVWWK3TUL52HS4DFVREXG73
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AKS7QOFQ5LAIZ2ZBR4M4EATP76GDFANCNFSM4AQXHOOQ
.

Hallo, ich habe einen Entwurf des makrogemittelten ROC/AUC-Scores implementiert, bin mir aber nicht sicher, ob er für Sklearn geeignet ist.

Hier ist der Code:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Könnte es so einfach sein?

@fbrunnu Danke fürs Teilen! Ich habe deinen Code ausprobiert. Aber wenn ich diese Funktion aufrufe, stoße ich auf das Problem "Multioutput-Zieldaten werden bei der Label-Binarisierung nicht unterstützt". Dann entferne ich den Code "pred=lb.transform(pred)" in der Funktion. Ich stoße jedoch auf ein anderes Problem, das "Eingabevariablen mit inkonsistenter Anzahl von Stichproben gefunden: [198, 4284]".

Darf ich fragen, ob Sie mir bei der Lösung helfen könnten? Dankeschön!

@Junting-Wang

 I meet a problem saying "Multioutput target data is not supported with label binarization". 

Sie müssen Predict anstelle von Predict_proba verwenden

@fgrundu ist deine Implementierung korrekt? Ich benutze es und funktioniert.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen