En machine learning, il s'agit du processus visant à isoler, observer et diagnostiquer les erreurs de vos modèles.
Cette analyse est une étape indispensable pour améliorer un modèle de machine learning, que ce soit sa performances et capacité de généralisation, ou son interprétablité, afin de guider vos futures itératations.
Elle s'applique à différent moment du cycle de vie d'un modèle :
Même si l'analyse de l'erreur dépend de votre, problème, on peut dégager quelques principes génériques ci-dessous.
Avant de s'ateler à l'analyse de l'erreur, il est souvent nécessaire d'avoir traité des étapes préalables :
Itérer, en améliorant les points suivants :
Il s'agit d'un modèle qui vous sert de point de comparaison aux moins aux premières itérations d'un modèle
Il peut s'agir d'un résultat provenant de l'état de l'art du domaine étudié, par exemple:
Ou sinon d'un modèle stupide donnant une réponse stéréotypée, par exemple:
Par la suite, les itérations plus avancées d'amélioration de votre modèles peuvent être utilisées comme nouvelle référence
Comme nous l'avons vu dans la leçon dédiée, il convient de choisir ces métriques en fonction des caractétistiques du problème à résoudre (comme dans les tâches de classification, régression, ou clustering)
Même pour un problème donné, il peut être intéressant de changer de métrique d'évaluation, par exemple dans le cas d'un data set ayant des classes déséquilibrées, la simple accuracy sera une métrique trop confiante.
Il vaut mieux dans ce cas choisir des métriques prenant en compte ce déséquilibre, comme la balanced accuracy ou y étant moins affecté, comme l'aire sous la courbe ROC
Pour aller plus loin, il est conseillé d'évaluer son modèle en production avec un ensemble de plusieurs métriques, comme le conseille cet article
Elle permettent de diagnostiquer l'état du compromis de sous apprentissage/sur apprentissage de votre modèle.
Comparaison de courbes d'apprentissage pour deux modèles linéaires
from sklearn.tree import DecisionTreeRegressor
tree = DecisionTreeRegressor()
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 6), sharey=True)
common_params = {
"X": X_train,
"y": y_train,
"train_sizes": np.linspace(0.1, 1.0, 5),
"cv": ShuffleSplit(n_splits=50, test_size=0.2, random_state=0),
"score_type": "both",
"n_jobs": 4,
"line_kw": {"marker": "o"},
"std_display_style": "fill_between",
"score_name": "Accuracy",
}
for ax_idx, estimator in enumerate([linreg, tree]):
LearningCurveDisplay.from_estimator(estimator, **common_params, ax=ax[ax_idx])
handles, label = ax[ax_idx].get_legend_handles_labels()
ax[ax_idx].legend(handles[:2], ["Training Score", "Test Score"])
ax[ax_idx].set_title(f"Learning Curve for {estimator.__class__.__name__}")
Voir cet article vulgarisé pour plus de détails concernant leur interprétation
bagging
Certains modèles (comme la régression linéaire estimée avec les moindres carrés) sont très sensibles aux données abérantes, ce qui peut conduire à un sur apprentissage.
Il convient dans ce cas d'améliorer son exploration des données en faisant des grahiques pour détecter les outliers et/ou utiliser des méthodes algorithmiques pour leur détection
En fonction de la distribution de vos données, il peut être utile d'affiner la méthode de validation croisée utilisée plutôt que d'utiliser une classique k-fold:
La régularisation introduit, au moment de l'apprentissage, une contrainte visant à limiter l'amplitude des paramètres qui vont être appris, de manière à privilégier un modèle ayant une variance plus faible de sorte à obtenir un modèle plus "lisse":
Cela se manifeste par un terme additionnel dans la fonction de perte :
$Loss(\theta) + \alpha{||\theta||}^2$ avec $\alpha$ le paramètre controlant la force de la régularisation
Il est courant d'utiliser la norme $L_2 = \sum_{i} \theta{_i}^2$ ou la norme $L_1 = \sum_{i} |\theta{_i}|$ dans ce calcul, celle-ci ayant des effets un peu différents (voir par ex cet article pour plus de détails)
Certains modèles intégrent un paramètre ou hyper-paramètres de régularisation:
penalty
C
controlant la force de la régularisation à appliquer (voir cet exemple avec SVC pous plus de détails)learning rate
(learning rate <1)Ces méthodes visent à rendre votre modèles plus parcimonieux, en ne gardant que les variables les plus informatives pour votre modèle tout en conservant de bonnes performances
Ces méta modèles consistent à entraîner en parallèle un grand nombre de modèles individuels. Le méta modèle ainsi crée tend à produire un modèle ayant une variance moindre par rapport aux modèle individuel (modèle moins felxible) et donc contribue à diminuer le sur apprentissage
Les mauvaises performances obtenues avec un modèles peuvent être dues à une mauvaise optmisation, qu'il est possible d'affiner en:
GridSearch
: il est souvent intéressant de combiner deux itérations, une première grossière, en testant des ordres de grandeurs différents, puis une seconde plus précise autour des valeurs pré-identifiéesUn modèle qui sous apprend est probablement trop peu complexe pour le problème à modéliser, c.a.d qu'il ne contient pas assez de paramètres, ou encore il est trop simpliste et ne parviens pas à capturer des propriétés suffisament complexe dans les données. Voici quelques possibilités :
boosting
ou de stacking
Le sous apprentissage peut tout simplement être du à une qualité des données insuffisantes : volume insufisant, données peu représentatives, ... Dans ce cas, une solution est d'enrichir les données de plusieurs manières
Enfin, analyser de manière exhaustive les erreurs produite par votre modèle est indispensable pour l'améliorer dans les itérations suivantes
Il est souvent conseillé d'identifier et concentrer ses efforts sur les groupes d'erreurs impactant le plus le modèle !
Dans cette phase de l'analyse de données, il s'agit d'étendre l'analyse exploratoire de donnée pour comprendre et mesurer le niveau d'erreur global des prédictions.
Voici certaines analyses qu'il peut être intéressant de produire :
La plupart des modèles en machine learning sont des modèles statistiques dont certains reposent sur des hypothèses préalables afin d'être valables (au risque de ne pas pouvoir estimer le modèle ou donne des estimations biaisées)
C'est le cas de la plupart des modèles de régression, comme la régression linéaire qui suppose au préalable:
Dans l'exemple de la régression linéaire, on vérifiera ces hypothèses des tests dédiés (test d'hétéroscédasctitité, test d'indépendance) ou en faisant une analyse complète des résidus
Penchez vous sur les mathématiques propres à chaque modèle pour effectuer les analyses d'erreurs préalables adaptées !
Une première itération conseillée est de repérer des groupes caractéristiques pouvant être sources d'erreurs particulières, par exemple un groupe produisant sur estimation ou sous estimation systématique, et/ou un groupe responsable d'une grande part de l'erreur totale.
Voici quelques exemples de groupes à examiner :
En général, ces observations auront tendeance à causer plus d'erreurs, car elles auront été "vues" moins souvent par votre modèle lors de l'apprentissage, surtout lorsque le déséquilibre des classes est important
Solutions potentielles
Si le déséquilibre des classes n'est pas trop impactant sur l'erreur, il est possible de minimiser l'erreur produite par le modèle en favorisant une méthode de validation croisée stratifiée
Si ces oservations conduisent à des erreurs systématiques, il est conseillé de les ré-équilibrer, souvent par des méthodes de sous échantillonnage de la classe majoritaire ou de sur echantillonnage de la classe minoritaire. Il existe des packages spécifiques pour gérer ce problème comme imbalanced-learn
Afin de mieux comprendre l'influence de certaines variables continues sur la performance, il est parfois plus facile de les découper en quantiles pour examiner leur impact quantile par quantile.
De même pour des tâches supervisées, un clustering préalable des données peut permettre d'identifier des groupes de variables et d'observations qui ont un comportement particulier.
Une solution peut consister à supprimer de la modélisation certains clusters ou à utiliser une modèle différents sur ces clusters, comme par exemple pour des applications de santé ou il est courant d'entrainer différents modèles sur différents groupes de patients
Pour les tâches non supervisées, examiner quelques caractéristiques (tendeance centrale, variabilité) des points des clusters formés peut vous aider à comprendre les données ayant été groupées de manière erronnée ou les clusters qui pourraient être sur-numéraires (pour de nombreux modèles, le nombr de clusters est un hyperparamètre)
Dans certains cas, les erreurs peuvent provenir d'une mauvaise annotation des certaines parties données (c'est assez courant avec les images), causant des erreurs impossibles à corriger si non détectées
Dans ce cas, une solution peut constituer à examiner visuellement des échantillons pris au hasard des données afin de se faire une idée
Il s'agit d'erreurs dues à des observations ou variables individuelles. Affiner l'analyse exploratoire préalable est souvent la meilleure chose à faire pour les détecter !
Les données abérantes sont un exemple particulièrement important de données individuelles que vous souhaitez gérér en priorité :
L'analyse des erreurs demande une compréhension fine du problème et des données et leur traitement nécessite souvent une approche adaptive (il n'y a pas de méthode absolue) et itérative (il faut souvent plusieurs étapes)
Voici néanmoins un cadre de travail générique à appliquer itérativement :
identifier les erreurs et les discriminer en fonction de leur impacts
se concentrer en priorité sur les erreurs impactant le plus le modèle (outliers, groupes caractéristiques, ...)
construire une hypothèse de la cause de ces erreurs
tester l'impact de cette hypothèse sur les performances et/ou l'interprétabilité
répéter
Evaluer son modèle avec un aggrégat de plusieurs métriques
Observer la couverture des erreurs (en comparant les labels et leur prédictions)
Analyser les relations entre les variables, par exemple avec les partial depence plot (PDP) et individual conditional plot (ICE)
Vérifier l'importance des features pour le modèles (en utilisant par exemple les modules LIME ou SHAP)
Observer les propriétés des données erronnées pour identifier des causes potentielles d'erreurs
examen visuel (image, texte)
Plots de couverture des erreurs (carte de chaleur, nuage de point, ..)
QQ plots
Analyse des residus (dans le cas de modèles statistiques)
Intervalle de confiance des prédictions
Examiner les clusters formés en regardant leur statistiques descriptives (dans le cas du clusering ou pré-clustering)
Vérifier l'équilibrage des classes et les ré-équilibrer (pour la classification)