TATECHATLAS
◎ Deutsch
Mathematik und Modelle / Anleitung

Quantilsregression mit Pinball-Loss in scikit-learn

Erfahren Sie, wie Sie Quantilsregressionsmodelle unter Verwendung des Pinball-Loss und des D² Skill-Scores in scikit-learn implementieren, evaluieren und optimieren.

Auf dieser Seite

Um eine Quantilsregression in scikit-learn durchzuführen, müssen Sie das Ziel Ihres Modells mit Ihrer Evaluierungsmetrik abstimmen, indem Sie dasselbe Zielquantil (alpha) auswählen. Sie können Regressoren wie den HistGradientBoostingRegressor mit loss='quantile' verwenden und das Ziel über den Parameter 'quantile' spezifizieren. Zur Evaluierung verwenden Sie mean_pinball_loss mit dem entsprechenden 'alpha'-Parameter. Um diese Metriken in der Kreuzvalidierung oder beim Hyperparameter-Tuning zu verwenden, müssen Sie sie mit make_scorer umschließen und sicherstellen, dass Sie greater_is_better=False setzen, da der Pinball-Loss ein Wert ist, der minimiert werden muss. Zur Bewertung der Modellleistung im Vergleich zu einer Baseline verwenden Sie d2_pinball_score, welches das R²-Konzept auf Quantile erweitert. Wenn Sie mit mehreren Zielvariablen arbeiten, verwenden Sie den Parameter multioutput, um festzulegen, wie die Fehler über die Ausgaben hinweg aggregiert werden.

Definieren Sie das Zielquantil für Ihre Entscheidung

Vor dem Training müssen Sie das spezifische Quantil (alpha) identifizieren, das für Ihr geschäftliches oder wissenschaftliches Ziel erforderlich ist. Im Gegensatz zur Mittelwertregression, die auf den Erwartungswert abzielt, zielt die Quantilsregression auf einen bestimmten Punkt in der bedingten Verteilung ab. Ein Netzbetreiber möchte beispielsweise das 99. Perzentil der Verbindungsunterbrechungen vorhersagen, um die Dienstzuverlässigkeit zu garantieren. Sobald dieses alpha gewählt wurde, muss es während der Trainings- und Evaluierungsphasen konsistent bleiben, um sicherzustellen, dass das Modell für die korrekte Funktion optimiert wird.

Wenn Sie Hyperparameter-Tuning mit GridSearchCV durchführen, verwenden Sie immer den negierten Pinball-Loss (via make_scorer), um sicherzustellen, dass der Optimierer das beste Modell korrekt identifiziert, indem er den Score maximiert.

Wählen Sie ein Modell, das den Pinball-Loss minimiert

In scikit-learn wählen Sie einen Schätzer, der den Quantilsverlust unterstützt. Beispielsweise kann der HistGradientBoostingRegressor mit loss='quantile' und einem spezifischen 'quantile'-Parameter konfiguriert werden. Weitere Optionen sind QuantileRegressor. Das Modell wird versuchen, den Pinball-Loss zu minimieren, um den Wert zu finden, der das gewählte Quantil-Niveau erfüllt.

from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np

X = np.random.rand(100, 1)
y = 2 * X.ravel() + np.random.normal(0, 0.5, 100)

# Target the 95th percentile
model = HistGradientBoostingRegressor(loss='quantile', quantile=0.95)
model.fit(X, y)

Evaluierung mit mean_pinball_loss unter Verwendung desselben Alpha

Um zu messen, wie gut Ihr Modell abschneidet, verwenden Sie die Funktion mean_pinball_loss. Es ist entscheidend, dass der der Funktion übergebene Alpha-Parameter identisch mit dem während des Modelltrainings angestrebten Quantil ist. Wenn Sie für das 0,95-Quantil trainiert haben, aber mit 0,50 evaluieren, wird die resultierende Fehlermetrik für Ihre spezifische Aufgabe bedeutungslos sein.

from sklearn.metrics import mean_pinball_loss

y_pred = model.predict(X)
loss = mean_pinball_loss(y, y_pred, alpha=0.95)
print(f'Pinball Loss: {loss}')

Erstellen Sie einen benutzerdefinierten Scorer für Tuning und Validierung

Bei der Verwendung von Kreuzvalidierung oder GridSearchCV können Sie mean_pinball_loss nicht direkt übergeben, da es sich um einen Verlust handelt (der minimiert werden muss) und nicht um einen Score (der maximiert werden muss). Sie müssen ihn mit make_scorer umschließen. Da die Optimierungslogik von scikit-learn erwartet, dass höhere Werte besser sind, müssen Sie greater_is_better=False setzen. Dies weist den Scorer an, den Verlustwert intern zu negieren.

from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score

# Create a scorer for the 95th percentile
scorer = make_scorer(mean_pinball_loss, alpha=0.95, greater_is_better=False)

# Use in cross-validation
scores = cross_val_score(model, X, y, scoring=scorer, cv=5)
print(f'CV Scores: {scores}')

Interpretieren Sie den D² Pinball Score zur Leistungsbewertung

Der d2_pinball_score dient als Skill-Score, analog zum R²-Koeffizienten für die Mittelwertregression. Er misst den Anteil der Abweichung, der durch Ihr Modell im Vergleich zu einem Baseline-Modell erklärt wird, das immer das Alpha-Quantil der Trainingsdaten vorhersagt. Ein Score von 1,0 zeigt ein perfektes Modell an, 0,0 bedeutet, dass das Modell nicht besser als die Baseline ist, und negative Werte zeigen an, dass das Modell schlechter als die Baseline abschneidet.

from sklearn.metrics import d2_pinball_score

skill_score = d2_pinball_score(y, y_pred, alpha=0.95)
print(f'D2 Pinball Score: {skill_score}')

Visualisieren Sie Quantil-Vorhersagen korrekt

Die Standard-Regressionsvisualisierung beinhaltet die Prüfung, ob die Punkte auf der Diagonale liegen (y_true = y_pred). Bei der Quantilsregression liegen die Punkte jedoch nicht auf der Diagonale. Stattdessen erwartet man für ein Quantil alpha, dass ein bestimmter Bruchteil der Punkte oberhalb und unterhalb der Diagonale liegt. Wenn Sie beispielsweise das 0,95-Quantil vorhersagen, sollten bei einem gut kalibrierten Modell etwa 95 % der tatsächlichen Werte unter den vorhergesagten Werten liegen.

Umgang mit Multi-Output-Regression

Wenn Ihre Zielvariable ein Vektor ist (Multi-Output), bieten sowohl mean_pinball_loss als auch d2_pinball_score einen multioutput-Parameter an. Standardmäßig ist dieser auf 'uniform_average' eingestellt, was den Fehler für jede Ausgabe berechnet und dann den Durchschnitt bildet. Sie können auch 'raw_values' verwenden, um ein Array von Fehlern zu erhalten, eines für jede Zielvariable, oder ein benutzerdefiniertes Array von Gewichten angeben, um bestimmte Ausgaben zu priorisieren.

Abgleich der Parameterbezeichnungen über Training und Evaluierung

Eine häufige Fehlerquelle ist die Diskrepanz in der Benennung der Argumente innerhalb von scikit-learn. Schätzer verwenden typischerweise den Parameternamen 'quantile', um das Zielniveau zu definieren (z. B. HistGradientBoostingRegressor(quantile=0.95)). Die Metrikfunktionen mean_pinball_loss und d2_pinball_score verwenden jedoch den Parameternamen 'alpha' (z. B. mean_pinball_loss(y_true, y_pred, alpha=0.95)). Stellen Sie immer sicher, dass diese Werte synchronisiert sind, um die mathematische Konsistenz zu wahren.

Was Sie prüfen sollten

  • Überprüfen Sie, ob der Quantil-Parameter des Schätzers mit dem Alpha-Parameter der Metrik übereinstimmt.
  • Stellen Sie sicher, dass make_scorer mit greater_is_better=False für den Pinball-Loss verwendet wird.
  • Bestätigen Sie, dass d2_pinball_score zur Leistungsbewertung und nicht zur direkten Fehlermessung verwendet wird.
  • Prüfen Sie, ob die Multioutput-Einstellungen für Multi-Target-Datensätze korrekt konfiguriert sind.

Der Pinball-Loss ist nur für die Quantilvorhersage streng konsistent; er ist nicht geeignet, um den Mittelwert oder den Modus vorherzusagen. Die visuelle Interpretation von Vorhersagefehler-Diagrammen unterscheidet sich von Modellen, die auf den bedingten Mittelwert abzielen.

Quellen

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
Nach oben ↑