Évaluation de la régression multi-sortie dans scikit-learn
Apprenez à utiliser le paramètre multioutput dans scikit-learn pour obtenir des erreurs par cible ou appliquer des poids personnalisés aux prévisions de régression multi-sortie.
Dans ce guide
La réponse courte
Pour évaluer un modèle avec plusieurs séries de sortie dans scikit-learn, utilisez le paramètre multioutput au sein des métriques supportées comme mean_absolute_error ou r2_score. Le réglage multioutput='raw_values' renvoie un tableau contenant le score individuel pour chaque flux de sortie, permettant un diagnostic granulaire. Pour calculer un score pondéré unique où certaines sorties sont plus critiques, passez un objet de type tableau de poids (par exemple, [0.3, 0.7]) au paramètre multioutput. Cela remplace le comportement par défaut 'uniform_average', qui traite toutes les variables cibles comme étant d'importance égale.
Comprendre les métriques de régression multi-sortie
Dans la régression multi-cible, un modèle prédit simultanément plusieurs variables continues. Les métriques d'évaluation standard renvoient généralement un scalaire unique, ce qui peut masquer une mauvaise performance sur une sortie spécifique si les autres fonctionnent bien. Scikit-learn résout ce problème en fournissant des mécanismes pour soit décomposer l'erreur par sortie, soit les agréger en utilisant des stratégies de pondération spécifiques.
Le choix de la métrique doit s'aligner sur la fonction cible. Par exemple, si l'objectif est de prédire la moyenne d'une distribution, une fonction de perte quadratique est appropriée. Si l'objectif est la médiane, la perte absolue est préférée. Dans les scénarios multi-sorties, cette cohérence doit être maintenue à travers toutes les dimensions cibles.
Conseil pratique
Lorsque vous utilisez des poids personnalisés pour les métriques multi-sorties, assurez-vous que la somme des poids est égale à 1,0 afin de maintenir l'échelle originale de la métrique et son interprétabilité en tant que moyenne pondérée.
Utilisation de raw_values pour l'évaluation par sortie
L'option 'raw_values' est essentielle pour diagnostiquer quelle variable cible spécifique cause la sous-performance d'un modèle. Au lieu de moyenner les résultats, scikit-learn renvoie un tableau où chaque élément correspond à la métrique calculée pour une colonne de sortie.
Ceci est particulièrement utile lorsque les variables cibles ont des échelles différentes ou des niveaux de bruit différents, car cela empêche l'erreur d'une variable de forte magnitude de dominer le score global.
from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); scores = mean_absolute_error(y_true, y_pred, multioutput='raw_values'); print(scores) # Illustrative output: [0.5, 1. ]Mise en œuvre d'une pondération personnalisée pour les sorties multiples
Lorsque certaines séries de sortie sont plus critiques pour l'entreprise que d'autres, une moyenne uniforme est trompeuse. Scikit-learn permet de passer un tableau de poids au paramètre multioutput. Le score résultant est la somme pondérée des erreurs individuelles.
Par exemple, si la deuxième sortie est deux fois plus importante que la première, des poids comme [0.33, 0.67] peuvent être appliqués. Cela garantit que le scalaire final reflète l'importance prioritaire de variables cibles spécifiques.
from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); weighted_mae = mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]); print(weighted_mae) # Illustrative output: 0.85Comparaison entre la moyenne pondérée et la moyenne uniforme
La moyenne uniforme ('uniform_average') est le comportement par défaut, traitant chaque sortie comme ayant un poids égal. Cela est approprié lorsque toutes les cibles sont de même nature et importance.
En revanche, la moyenne pondérée permet à l'utilisateur de pénaliser plus lourdement les erreurs dans des dimensions spécifiques. Comparer 'raw_values' à une moyenne pondérée aide à déterminer si un score global est faussé par une seule sortie problématique ou si le modèle est systématiquement médiocre sur toutes les cibles.
Application de la logique multi-sortie à différentes métriques
Toutes les métriques de scikit-learn ne supportent pas le paramètre multioutput. Les métriques de régression courantes telles que l'erreur absolue moyenne (MAE), l'erreur quadratique moyenne racine (RMSE) et le score R2 le supportent.
Cependant, certaines métriques robustes, comme median_absolute_error, ne supportent pas les entrées multi-sorties. Dans ce cas, les utilisateurs doivent itérer manuellement sur les colonnes de sortie et calculer la métrique pour chacune.
Création de scoreurs personnalisés pour le multi-sortie pondéré
Pour utiliser une métrique multi-sortie pondérée dans GridSearchCV ou cross_val_score, vous devez encapsuler la métrique à l'aide de make_scorer. Puisque le paramètre multioutput est un argument mot-clé, il doit être passé lors de la création du scoreur.
Comme ces métriques sont généralement des pertes (où une valeur plus faible est préférable), le paramètre greater_is_better dans make_scorer doit être défini sur False pour garantir que l'algorithme de recherche maximise correctement la perte niée.
from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.model_selection import GridSearchCV; from sklearn.linear_model import LinearRegression; weighted_mae_scorer = make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False); grid = GridSearchCV(LinearRegression(), param_grid={}, scoring=weighted_mae_scorer)Évaluation de plusieurs métriques simultanément
Pour une vue complète, vous pouvez suivre plusieurs indicateurs de performance en utilisant cross_validate. En passant un dictionnaire au paramètre scoring, vous pouvez surveiller simultanément l'agrégat pondéré et d'autres métriques comme le R2.
Cela permet au développeur de voir si l'amélioration de la MAE pondérée se fait au détriment de la variance globale expliquée (R2) sur toutes les sorties.
from sklearn.model_selection import cross_validate; from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.linear_model import LinearRegression; import numpy as np; X = np.random.rand(10, 3); y = np.random.rand(10, 2); scoring_dict = {'weighted_mae': make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False), 'r2': 'r2'}; results = cross_validate(LinearRegression(), X, y, scoring=scoring_dict, cv=2); print(results['test_weighted_mae'])Sélection de fonctions de score cohérentes
La cohérence du score signifie que la métrique doit être alignée avec la fonction cible de la prédiction. Si le modèle est entraîné pour prédire la moyenne, le RMSE ou la MAE sont appropriés.
Lors de la gestion de tâches multi-sorties, assurez-vous que la stratégie de pondération ne modifie pas involontairement la signification statistique de la métrique. Par exemple, le RMSE doit être manipulé avec prudence lors de la moyenne, car la racine carrée doit être préservée dans la transition de MSE vers RMSE pour maintenir l'échelle d'erreur originale.
Points à vérifier
- Vérifier que y_true et y_pred ont des formes correspondantes (n_samples, n_outputs).
- Confirmer que la métrique choisie supporte le paramètre multioutput.
- S'assurer que greater_is_better=False est défini dans make_scorer pour les métriques basées sur l'erreur.
- Vérifier que la longueur du tableau de poids correspond au nombre de colonnes de sortie.
Champ d’application
Le paramètre multioutput n'est pas supporté par toutes les métriques, excluant spécifiquement median_absolute_error. Il nécessite que les tableaux de cibles et de prédictions aient des dimensions correspondantes.