1.16. Wahrscheinlichkeitskalibrierung#

Bei der Durchführung von Klassifizierungsaufgaben möchte man oft nicht nur die Klassenbezeichnung vorhersagen, sondern auch die Wahrscheinlichkeit der jeweiligen Bezeichnung erhalten. Diese Wahrscheinlichkeit gibt Ihnen eine Art Vertrauensniveau für die Vorhersage. Einige Modelle können schlechte Schätzungen der Klassenwahrscheinlichkeiten liefern, und einige unterstützen nicht einmal die Wahrscheinlichkeitsvorhersage (z. B. einige Instanzen von SGDClassifier). Das Kalibrierungsmodul ermöglicht es Ihnen, die Wahrscheinlichkeiten eines gegebenen Modells besser zu kalibrieren oder Unterstützung für die Wahrscheinlichkeitsvorhersage hinzuzufügen.

Gut kalibrierte Klassifikatoren sind probabilistische Klassifikatoren, bei denen die Ausgabe der Methode predict_proba direkt als Vertrauensniveau interpretiert werden kann. Beispielsweise sollte ein gut kalibrierter (binärer) Klassifikator die Stichproben so klassifizieren, dass von den Stichproben, denen er einen predict_proba-Wert von beispielsweise 0,8 zuwies, etwa 80 % tatsächlich zur positiven Klasse gehören.

Bevor wir zeigen, wie ein Klassifikator neu kalibriert wird, benötigen wir zunächst eine Möglichkeit, die Güte der Kalibrierung eines Klassifikators zu erkennen.

Hinweis

Streng richtige Bewertungsregeln für probabilistische Vorhersagen wie sklearn.metrics.brier_score_loss und sklearn.metrics.log_loss bewerten gleichzeitig die Kalibrierung (Zuverlässigkeit) und die Diskriminierungskraft (Auflösung) eines Modells sowie die Zufälligkeit der Daten (Unsicherheit). Dies folgt aus der bekannten Brier-Score-Zerlegung von Murphy [1]. Da nicht klar ist, welcher Term dominiert, ist der Score für die alleinige Bewertung der Kalibrierung nur begrenzt nützlich (es sei denn, man berechnet jeden Term der Zerlegung). Ein niedrigerer Brier-Verlust bedeutet beispielsweise nicht unbedingt ein besser kalibriertes Modell, es könnte auch ein schlechter kalibriertes Modell mit wesentlich mehr Diskriminierungskraft bedeuten, z. B. bei Verwendung vieler zusätzlicher Merkmale.

1.16.1. Kalibrierungskurven#

Kalibrierungskurven, auch als *Zuverlässigkeitsdiagramme* bezeichnet (Wilks 1995 [2]), vergleichen, wie gut die probabilistischen Vorhersagen eines binären Klassifikators kalibriert sind. Sie plottet die Häufigkeit der positiven Bezeichnung (genauer gesagt, eine Schätzung der *bedingten Ereigniswahrscheinlichkeit* \(P(Y=1|\text{predict_proba})\)) auf der y-Achse gegen die vorhergesagte Wahrscheinlichkeit predict_proba eines Modells auf der x-Achse. Der knifflige Teil ist, Werte für die y-Achse zu erhalten. In scikit-learn wird dies durch Binning der Vorhersagen erreicht, sodass die x-Achse die durchschnittliche vorhergesagte Wahrscheinlichkeit in jedem Bin darstellt. Die y-Achse ist dann der *Anteil positiver Fälle*, gegeben die Vorhersagen dieses Bins, d. h. der Anteil der Stichproben, deren Klasse die positive Klasse ist (in jedem Bin).

Das obere Diagramm der Kalibrierungskurve wird mit CalibrationDisplay.from_estimator erstellt, das calibration_curve verwendet, um die durchschnittlichen vorhergesagten Wahrscheinlichkeiten und den Anteil positiver Fälle pro Bin zu berechnen. CalibrationDisplay.from_estimator nimmt als Eingabe einen trainierten Klassifikator, der zur Berechnung der vorhergesagten Wahrscheinlichkeiten verwendet wird. Der Klassifikator muss also über eine Methode predict_proba verfügen. Für die wenigen Klassifikatoren, die keine Methode predict_proba haben, ist es möglich, CalibratedClassifierCV zu verwenden, um die Klassifikator-Ausgaben auf Wahrscheinlichkeiten zu kalibrieren.

Das untere Histogramm gibt Einblicke in das Verhalten jedes Klassifikators, indem es die Anzahl der Stichproben in jedem vorhergesagten Wahrscheinlichkeitsbin anzeigt.

../_images/sphx_glr_plot_compare_calibration_001.png

LogisticRegression gibt mit höherer Wahrscheinlichkeit selbst gut kalibrierte Vorhersagen aus, da sie eine kanonische Link-Funktion für ihren Verlust besitzt, d. h. die Logit-Link-Funktion für den Log Loss. Im nicht bestraften Fall führt dies zur sogenannten Balance-Eigenschaft, siehe [8] und Logistische Regression. Im obigen Diagramm werden Daten gemäß einem linearen Mechanismus generiert, was mit dem Modell LogisticRegression konsistent ist (das Modell ist „gut spezifiziert“) und der Wert des Regularisierungsparameters C so abgestimmt ist, dass er angemessen ist (weder zu stark noch zu schwach). Infolgedessen liefert dieses Modell genaue Vorhersagen aus seiner predict_proba-Methode. Im Gegensatz dazu liefern die anderen gezeigten Modelle verzerrte Wahrscheinlichkeiten; mit unterschiedlichen Verzerrungen pro Modell.

GaussianNB (Naive Bayes) neigt dazu, Wahrscheinlichkeiten auf 0 oder 1 zu schieben (beachten Sie die Zählungen in den Histogrammen). Dies liegt hauptsächlich daran, dass angenommen wird, dass Merkmale bedingt unabhängig gegeben die Klasse sind, was in diesem Datensatz, der 2 redundante Merkmale enthält, nicht der Fall ist.

RandomForestClassifier zeigt das gegenteilige Verhalten: Die Histogramme zeigen Spitzen bei Wahrscheinlichkeiten von etwa 0,2 und 0,9, während Wahrscheinlichkeiten nahe 0 oder 1 sehr selten sind. Eine Erklärung hierfür geben Niculescu-Mizil und Caruana [3]: „Methoden wie Bagging und Random Forests, die Vorhersagen von einer Basismenge von Modellen mitteln, können Schwierigkeiten haben, Vorhersagen nahe 0 und 1 zu treffen, da die Varianz in den zugrunde liegenden Basismodellen Vorhersagen, die nahe Null oder Eins sein sollten, von diesen Werten weg verzerrt. Da Vorhersagen auf das Intervall [0,1] beschränkt sind, sind Fehler, die durch Varianz verursacht werden, nahe Null und Eins tendenziell einseitig. Wenn beispielsweise ein Modell für einen Fall \(p = 0\) vorhersagen sollte, kann Bagging dies nur erreichen, wenn alle gebagten Bäume Null vorhersagen. Wenn wir den Bäumen, die Bagging mittelt, Rauschen hinzufügen, wird dieses Rauschen dazu führen, dass einige Bäume für diesen Fall Werte größer als 0 vorhersagen, wodurch die durchschnittliche Vorhersage des gebagten Ensembles von 0 weg bewegt wird. Wir beobachten diesen Effekt am stärksten bei Random Forests, da die Bäume der Basisebene, die mit Random Forests trainiert werden, aufgrund der Merkmalsunterteilung eine relativ hohe Varianz aufweisen.“ Infolgedessen zeigt die Kalibrierungskurve eine charakteristische Sigmoid-Form, die darauf hindeutet, dass der Klassifikator seinem „Instinkt“ mehr vertrauen und typischerweise Wahrscheinlichkeiten näher an 0 oder 1 zurückgeben könnte.

LinearSVC (SVC) zeigt eine noch sigmoidalere Kurve als der Random Forest, was typisch für Maximum-Margin-Methoden ist (vergleiche Niculescu-Mizil und Caruana [3]), die sich auf schwer zu klassifizierende Stichproben konzentrieren, die nahe an der Entscheidungsgrenze liegen (die Support-Vektoren).

1.16.2. Kalibrierung eines Klassifikators#

Die Kalibrierung eines Klassifikators besteht darin, einen Regressor (einen sogenannten *Kalibrator*) anzupassen, der die Ausgabe des Klassifikators (wie von decision_function oder predict_proba angegeben) auf eine kalibrierte Wahrscheinlichkeit in [0, 1] abbildet. Bezeichnet man die Ausgabe des Klassifikators für eine gegebene Stichprobe als \(f_i\), so versucht der Kalibrator, die bedingte Ereigniswahrscheinlichkeit \(P(y_i = 1 | f_i)\) vorherzusagen.

Idealerweise wird der Kalibrator auf einem Datensatz trainiert, der unabhängig von den Trainingsdaten ist, die ursprünglich zum Trainieren des Klassifikators verwendet wurden. Dies liegt daran, dass die Leistung des Klassifikators auf seinen Trainingsdaten besser wäre als für neue Daten. Die Verwendung der Klassifikator-Ausgabe von Trainingsdaten zum Trainieren des Kalibrators würde somit zu einem verzerrten Kalibrator führen, der auf Wahrscheinlichkeiten näher an 0 und 1 abbildet, als er sollte.

1.16.3. Anwendung#

Die Klasse CalibratedClassifierCV wird zur Kalibrierung eines Klassifikators verwendet.

CalibratedClassifierCV verwendet einen Kreuzvalidierungsansatz, um sicherzustellen, dass immer unverzerrte Daten zum Trainieren des Kalibrators verwendet werden. Die Daten werden in \(k\) (train_set, test_set)-Paare aufgeteilt (wie durch cv bestimmt). Wenn ensemble=True (Standard) ist, wird das folgende Verfahren unabhängig für jede Kreuzvalidierungsaufteilung wiederholt:

  1. eine Kopie von base_estimator wird auf dem Trainings-Teil trainiert

  2. der trainierte base_estimator macht Vorhersagen auf dem Test-Teil

  3. die Vorhersagen werden verwendet, um einen Kalibrator zu trainieren (entweder einen Sigmoid- oder einen monotonen Regressor) (wenn die Daten Multiclass sind, wird für jede Klasse ein Kalibrator trainiert)

Dies führt zu einem Ensemble von \(k\) (classifier, calibrator)-Paaren, wobei jeder Kalibrator die Ausgabe seines entsprechenden Klassifikators in [0, 1] abbildet. Jedes Paar ist im Attribut calibrated_classifiers_ verfügbar, wobei jeder Eintrag ein kalibrierter Klassifikator mit einer Methode predict_proba ist, die kalibrierte Wahrscheinlichkeiten ausgibt. Die Ausgabe von predict_proba für die Hauptinstanz CalibratedClassifierCV entspricht dem Durchschnitt der vorhergesagten Wahrscheinlichkeiten der \(k\) Schätzer in der Liste calibrated_classifiers_. Die Ausgabe von predict ist die Klasse mit der höchsten Wahrscheinlichkeit.

Es ist wichtig, cv sorgfältig zu wählen, wenn ensemble=True verwendet wird. Alle Klassen sollten in beiden Trainings- und Test-Teilen für jede Aufteilung vorhanden sein. Wenn eine Klasse im Trainings-Teil fehlt, wird die vorhergesagte Wahrscheinlichkeit für diese Klasse standardmäßig auf 0 für das (classifier, calibrator)-Paar dieser Aufteilung gesetzt. Dies verzerrt predict_proba, da über alle Paare gemittelt wird. Wenn eine Klasse im Test-Teil fehlt, wird der Kalibrator für diese Klasse (innerhalb des (classifier, calibrator)-Paares dieser Aufteilung) auf Daten ohne positive Klasse trainiert. Dies führt zu einer ineffektiven Kalibrierung.

Wenn ensemble=False, wird Kreuzvalidierung verwendet, um „unverzerrte“ Vorhersagen für alle Daten über cross_val_predict zu erhalten. Diese unverzerrten Vorhersagen werden dann zum Trainieren des Kalibrators verwendet. Das Attribut calibrated_classifiers_ besteht aus nur einem (classifier, calibrator)-Paar, bei dem der Klassifikator der base_estimator ist, der auf allen Daten trainiert wurde. In diesem Fall ist die Ausgabe von predict_proba für CalibratedClassifierCV die vorhergesagten Wahrscheinlichkeiten, die aus dem einzelnen (classifier, calibrator)-Paar erhalten wurden.

Der Hauptvorteil von ensemble=True ist, dass man von den traditionellen Ensembling-Effekten profitiert (ähnlich wie bei Bagging-Meta-Schätzer). Das resultierende Ensemble sollte sowohl gut kalibriert als auch geringfügig genauer sein als mit ensemble=False. Der Hauptvorteil der Verwendung von ensemble=False ist rechnerischer Natur: Es reduziert die Gesamtfit-Zeit, indem nur ein einzelnes Basisklassifikator- und Kalibrator-Paar trainiert wird, verringert die endgültige Modellgröße und erhöht die Vorhersagegeschwindigkeit.

Alternativ kann ein bereits trainierter Klassifikator durch die Verwendung eines FrozenEstimator als CalibratedClassifierCV(estimator=FrozenEstimator(estimator)) kalibriert werden. Es liegt in der Verantwortung des Benutzers sicherzustellen, dass die zur Kalibrierung des Klassifikators verwendeten Daten von den zur Kalibrierung des Regressors verwendeten Daten getrennt sind.

CalibratedClassifierCV unterstützt die Verwendung zweier Regressionstechniken für die Kalibrierung über den Parameter method: "sigmoid" und "isotonic".

1.16.3.1. Sigmoid#

Der Sigmoid-Regressor, method="sigmoid", basiert auf Platts logistischem Modell [4]

\[p(y_i = 1 | f_i) = \frac{1}{1 + \exp(A f_i + B)} \,,\]

wobei \(y_i\) die wahre Bezeichnung der Stichprobe \(i\) und \(f_i\) die Ausgabe des unkalibrierten Klassifikators für die Stichprobe \(i\) ist. \(A\) und \(B\) sind reelle Zahlen, die durch Maximierung der Wahrscheinlichkeit beim Trainieren des Regressors bestimmt werden.

Die Sigmoid-Methode geht davon aus, dass die Kalibrierungskurve durch Anwendung einer Sigmoid-Funktion auf die Rohvorhersagen korrigiert werden kann. Diese Annahme wurde empirisch in Abschnitt 2.1 von Platt 1999 [4] für Support Vector Machines mit gängigen Kernel-Funktionen auf verschiedenen Benchmark-Datensätzen gerechtfertigt, gilt aber nicht unbedingt allgemein. Darüber hinaus funktioniert das logistische Modell am besten, wenn der Kalibrierungsfehler symmetrisch ist, was bedeutet, dass die Klassifikator-Ausgabe für jede binäre Klasse normalverteilt mit gleicher Varianz ist [7]. Dies kann ein Problem bei stark unausgeglichenen Klassifizierungsproblemen sein, bei denen die Ausgaben keine gleichen Varianzen aufweisen.

Im Allgemeinen ist diese Methode am effektivsten für kleine Stichprobengrößen oder wenn das unkalibrierte Modell unterkonfident ist und ähnliche Kalibrierungsfehler für hohe und niedrige Ausgaben aufweist.

1.16.3.2. Isotonisch#

Die Methode method="isotonic" passt einen nichtparametrischen isotonen Regressor an, der eine stufenweise nicht abnehmende Funktion ausgibt, siehe sklearn.isotonic. Sie minimiert

\[\sum_{i=1}^{n} (y_i - \hat{f}_i)^2\]

unter der Bedingung \(\hat{f}_i \geq \hat{f}_j\), wann immer \(f_i \geq f_j\). \(y_i\) ist die wahre Bezeichnung der Stichprobe \(i\) und \(\hat{f}_i\) ist die Ausgabe des kalibrierten Klassifikators für die Stichprobe \(i\) (d. h. die kalibrierte Wahrscheinlichkeit). Diese Methode ist allgemeiner im Vergleich zu 'sigmoid', da die einzige Einschränkung darin besteht, dass die Abbildungsfunktion monoton steigend ist. Sie ist daher leistungsfähiger, da sie jede monomere Verzerrung des unkalibrierten Modells korrigieren kann. Sie ist jedoch anfälliger für Überanpassung, insbesondere bei kleinen Datensätzen [6].

Insgesamt wird 'isotonic' so gut oder besser als 'sigmoid' abschneiden, wenn genügend Daten (mehr als ca. 1000 Stichproben) vorhanden sind, um Überanpassung zu vermeiden [3].

Hinweis

Auswirkungen auf Ranking-Metriken wie AUC

Es wird allgemein erwartet, dass die Kalibrierung Ranking-Metriken wie ROC-AUC nicht beeinflusst. Bei Verwendung von method="isotonic" können sich diese Metriken nach der Kalibrierung jedoch unterscheiden, da die isotonische Regression Bindungen in den vorhergesagten Wahrscheinlichkeiten einführt. Dies kann als Unsicherheit der Modellvorhersagen betrachtet werden. Falls Sie die Rangfolge und damit die AUC-Scores strikt beibehalten möchten, verwenden Sie method="sigmoid", was eine streng monotone Transformation ist und somit die Rangfolge beibehält.

1.16.3.3. Multiclass-Unterstützung#

Sowohl isotonische als auch Sigmoid-Regressoren unterstützen nur eindimensionale Daten (z. B. binäre Klassifikationsausgabe), werden aber für Multiclass-Klassifizierung erweitert, wenn der base_estimator Multiclass-Vorhersagen unterstützt. Für Multiclass-Vorhersagen kalibriert CalibratedClassifierCV für jede Klasse separat im OneVsRestClassifier-Stil [5]. Bei der Vorhersage von Wahrscheinlichkeiten werden die kalibrierten Wahrscheinlichkeiten für jede Klasse separat vorhergesagt. Da diese Wahrscheinlichkeiten nicht unbedingt zu eins summieren, wird eine Nachbearbeitung durchgeführt, um sie zu normalisieren.

Andererseits unterstützt die Temperaturskalierung natürlich Multiclass-Vorhersagen, indem sie mit Logits arbeitet und schließlich die Softmax-Funktion anwendet.

1.16.3.4. Temperaturskalierung#

Für ein Multiclass-Klassifizierungsproblem mit \(n\) Klassen erzeugt die Temperaturskalierung [9], method="temperature", Klassenwahrscheinlichkeiten, indem sie die Softmax-Funktion mit einem Temperaturparameter \(T\) modifiziert

\[\mathrm{softmax}\left(\frac{z}{T}\right) \,,\]

wobei für eine gegebene Stichprobe \(z\) der Vektor der Logits für jede Klasse ist, wie er vom zu kalibrierenden Schätzer vorhergesagt wird. Im Sinne der scikit-learn-API entspricht dies der Ausgabe von decision_function oder dem Logarithmus von predict_proba. Wahrscheinlichkeiten werden in Logits umgewandelt, indem zunächst eine winzige positive Konstante hinzugefügt wird, um numerische Probleme mit dem Logarithmus von Null zu vermeiden, und dann der natürliche Logarithmus angewendet wird.

Der Parameter \(T\) wird durch Minimierung von log_loss, d. h. Kreuzentropieverlust, auf einem zurückgehaltenen (Kalibrierungs-) Datensatz gelernt. Beachten Sie, dass \(T\) die Position des Maximums in der Softmax-Ausgabe nicht beeinflusst. Daher ändert die Temperaturskalierung die Genauigkeit des kalibrierenden Schätzers nicht.

Der Hauptvorteil der Temperaturskalierung gegenüber anderen Kalibrierungsmethoden besteht darin, dass sie eine natürliche Möglichkeit bietet, (bessere) kalibrierte Multiclass-Wahrscheinlichkeiten mit nur einem freien Parameter zu erhalten, im Gegensatz zur Verwendung eines „One-vs-Rest“-Schemas, das mehr Parameter für jede einzelne Klasse hinzufügt.

Beispiele

Referenzen