Régression quantile avec la perte pinball dans scikit-learn
Apprenez à implémenter, évaluer et optimiser des modèles de régression quantile en utilisant la perte pinball et le score de compétence D² avec scikit-learn.
Dans ce guide
La réponse courte
Pour effectuer une régression quantile dans scikit-learn, vous devez aligner l'objectif de votre modèle avec votre métrique d'évaluation en sélectionnant le même quantile cible (alpha). Vous pouvez utiliser des régresseurs tels que HistGradientBoostingRegressor avec loss='quantile' et spécifier la cible via le paramètre 'quantile'. Pour l'évaluation, utilisez mean_pinball_loss avec le paramètre 'alpha' correspondant. Pour utiliser ces métriques dans la validation croisée ou la recherche d'hyperparamètres, enveloppez-les avec make_scorer, en veillant à définir greater_is_better=False car la perte pinball est une valeur à minimiser. Pour évaluer la compétence d'un modèle par rapport à une référence, utilisez d2_pinball_score, qui généralise le concept de R² aux quantiles. Lorsque vous travaillez avec plusieurs cibles, utilisez le paramètre multioutput pour définir la manière dont les erreurs sont agrégées entre les sorties.
Définir le quantile cible pour votre décision
Avant l'entraînement, vous devez identifier le quantile spécifique (alpha) requis pour votre objectif commercial ou scientifique. Contrairement à la régression de la moyenne, qui cible la valeur attendue, la régression quantile cible un point spécifique de la distribution conditionnelle. Par exemple, un fournisseur de réseau pourrait vouloir prédire le 99e percentile des interruptions de connexion pour garantir la fiabilité du service. Une fois cet alpha choisi, il doit rester cohérent tout au long des phases d'entraînement et d'évaluation pour garantir que le modèle est optimisé pour la fonction correcte.
Conseil pratique
Lors de l'optimisation des hyperparamètres avec GridSearchCV, utilisez toujours la perte pinball négative (via make_scorer) pour garantir que l'optimiseur identifie correctement le meilleur modèle en maximisant le score.
Sélectionner un modèle qui minimise la perte pinball
Dans scikit-learn, vous sélectionnez un estimateur qui prend en charge la perte quantile. Par exemple, HistGradientBoostingRegressor peut être configuré avec loss='quantile' et un paramètre 'quantile' spécifique. D'autres options incluent QuantileRegressor. Le modèle tentera de minimiser la perte pinball pour trouver la valeur qui satisfait le niveau de quantile choisi.
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)Évaluer avec mean_pinball_loss en utilisant le même alpha
Pour mesurer la performance de votre modèle, utilisez la fonction mean_pinball_loss. Il est crucial que le paramètre alpha passé à cette fonction soit identique au quantile ciblé lors de l'entraînement du modèle. Si vous avez entraîné pour le quantile 0,95 mais que vous évaluez avec 0,50, la métrique d'erreur résultante sera sans aucun sens pour votre tâche spécifique.
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}')Créer un scoreur personnalisé pour l'ajustement et la validation
Lors de l'utilisation de la validation croisée ou de GridSearchCV, vous ne pouvez pas passer mean_pinball_loss directement car il s'agit d'une perte (à minimiser) plutôt que d'un score (à maximiser). Vous devez l'envelopper à l'aide de make_scorer. Comme la logique d'optimisation de scikit-learn attend des valeurs plus élevées pour être meilleures, vous devez définir greater_is_better=False. Cela indique au scoreur de négativer la valeur de la perte en interne.
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}')Interpréter le score D² pinball pour l'évaluation de la compétence
Le d2_pinball_score sert de score de compétence, analogue au coefficient R² pour la régression de la moyenne. Il mesure la fraction de déviance expliquée par votre modèle par rapport à un modèle de référence qui prédit toujours le quantile alpha des données d'entraînement. Un score de 1,0 indique un modèle parfait, 0,0 indique que le modèle n'est pas meilleur que la référence, et des valeurs négatives indiquent que le modèle est moins performant que la référence.
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}')Visualiser correctement les prédictions quantiles
La visualisation standard de la régression consiste à vérifier si les points se situent sur la diagonale (y_true = y_pred). Cependant, pour la régression quantile, les points ne seront pas regroupés sur la diagonale. Au lieu de cela, pour un quantile alpha, vous vous attendez à ce qu'une fraction spécifique de points tombe au-dessus et au-dessous de la diagonale. Par exemple, si vous prédisez le quantile 0,95, environ 95 % des valeurs réelles devraient se situer en dessous des valeurs prédites, en supposant que le modèle est bien calibré.
Gérer la régression multi-sortie
Si votre variable cible est un vecteur (multi-sortie), mean_pinball_loss et d2_pinball_score fournissent tous deux un paramètre multioutput. Par défaut, celui-ci est réglé sur 'uniform_average', qui calcule l'erreur pour chaque sortie puis en fait la moyenne. Vous pouvez également utiliser 'raw_values' pour obtenir un tableau d'erreurs, une pour chaque variable cible, ou fournir un tableau de poids personnalisé pour prioriser certaines sorties.
Aligner les noms de paramètres entre l'entraînement et l'évaluation
Une source courante d'erreur est la divergence dans le nommage des arguments au sein de scikit-learn. Les estimateurs utilisent généralement le nom de paramètre 'quantile' pour définir le niveau cible (par exemple, HistGradientBoostingRegressor(quantile=0.95)). Cependant, les fonctions de métriques mean_pinball_loss et d2_pinball_score utilisent le nom de paramètre 'alpha' (par exemple, mean_pinball_loss(y_true, y_pred, alpha=0.95)). Assurez-vous toujours que ces valeurs sont synchronisées pour maintenir la cohérence mathématique.
Points à vérifier
- Vérifiez que le paramètre quantile de l'estimateur correspond au paramètre alpha de la métrique.
- Assurez-vous que make_scorer est utilisé avec greater_is_better=False pour la perte pinball.
- Confirmez que d2_pinball_score est utilisé pour l'évaluation de la compétence plutôt que pour la mesure directe de l'erreur.
- Vérifiez que les paramètres multioutput sont correctement configurés pour les ensembles de données multi-cibles.
Champ d’application
La perte pinball n'est strictement cohérente que pour la prédiction de quantiles ; elle n'est pas adaptée à la prédiction de la moyenne ou du mode. L'interprétation visuelle des graphiques d'erreur de prédiction diffère des modèles ciblant la moyenne conditionnelle.