Abordons maintenant l’approche de classification supervisée. Nous allons procéder de la même manière :
Comprendre plus finement les métriques “classiques” ;
Mettre en évidence ce qu’ils “cachent” et comment analyser la performance de votre modèle plus finement.
Comme d’habitude, nous allons illustrer certaines explications en utilisant notre projet fil rouge. Profitons-en pour rappeler ce que signifient les deux classes dans la donnée :
Une transaction appartenant à la classe 1 signifie qu’elle est suffisamment en dessous de la moyenne des transactions du même département et lors d’un mois donné. Plus précisément, il faut que la valeur de la transaction soit 15% en dessous de la moyenne.
Une transaction appartenant à la classe 0 a une valeur au-dessus du seuil mentionné précédemment.
Comprenez les limites des métriques classiques
On ne peut pas parler d’évaluation d’algorithmes de classification sans parler de ces trois concepts qui vont main dans la main : le rappel, la précision et la matrice de confusion.
La section Évaluez la performance d'un modèle de classification du cours d’initiation explique très bien :
le sens de ces 3 métriques ;
le côté trompeur de la métrique “accuracy” en cas de déséquilibre de classe (ce qui est notre cas dans le projet filé). Nous n’allons pas parler de cette métrique dans le reste du cours ;
le fait qu’une matrice de confusion peut être calculée à plusieurs seuils de classification.
Il sera absolument nécessaire d’être à l’aise avec le contenu du chapitre cité ci-dessus afin de comprendre ce qui suit. Mais pour résumer très brièvement :
Un algorithme de classification ne renvoie pas nativement une prédiction binaire (classe 0 ou classe 1). L’algorithme renvoie une probabilité d’appartenance à chaque classe (la somme des probabilités étant nécessairement égale à 100%) ;
Nous appliquons souvent un seuil à ces probabilités pour trancher sur l’appartenance d’une observation à la classe 1 ou la classe 0 (par défaut, ce seuil est à 50% quand on utilise Scikit-learn) ;
Par conséquent, on peut calculer une infinité de rappels, précisions et matrices de confusion en fonction du seuil que l’on choisit ;
Optimiser le rappel consiste à chercher un algorithme avec le moins de faux négatifs possibles ;
Optimiser la précision consiste à chercher un algorithme avec le moins de faux positifs possibles.
Suis-je alors obligé de choisir entre la précision et le rappel quand j’élabore mon approche de classification ?
Oui et non ! Il est théoriquement possible d’augmenter simultanément le rappel et la précision. Vous pouvez d’ailleurs utiliser une métrique conçue pour équilibrer les deux, il s’agit du F1 score :
F1 = Precision * Rappel / Precision + Rappel
Augmenter le F1 score d’un algorithme de classification revient à augmenter simultanément le Rappel et la Précision, sans accorder une importance supplémentaire à l’un ou l'autre. Toutefois, vous allez souvent être amenés à prioriser un algorithme avec un meilleur rappel qu’une précision ou vice-versa. Nous allons en discuter plus en détail plus tard dans ce chapitre. ;)
Découvrez la courbe précision-rappel
Il reste une question importante : étant donné que le rappel, la précision ou le F1 score peuvent être calculés pour n’importe quel seuil de probabilité, comment choisir le bon seuil ?
Pour ce faire, il est coutume de passer par une étape intermédiaire : le calcul d’un autre type de métriques connues en classification. Il s’agit de métriques de type “Area Under the Curve” ou AUC pour faire court. La section Le paradoxe de l’exactitude du cours d’initiation explique bien l’une de ces métriques : l’AUC de la courbe ROC. Nous vous invitons à revoir cette section pour être à l’aise avec le fonctionnement de cette courbe et comprendre plus facilement ce qui suit.
La courbe ROC possède en revanche une limitation structurelle : elle se base sur le False Positive Rate (FPR), une quantité trompeuse quand nous faisons face à un déséquilibre des classes. Pour éclairer ce point, prenons 2 scénarios :
Un jeu de données de 2000 observations avec 2 classes à proportions égales (c’est-à-dire 1000 observations par classe) ;
Un jeu de données de 11000 observations avec 2 classes. La classe majoritaire ayant 10000 observations (91% du jeu de données) et la classe minoritaire ayant 1000 observations (les 9% restants).
Imaginons que nous ayons un modèle de classification avec un FPR de 0.1 pour les deux jeux de données. Nous pourrions penser que le modèle est fiable avec les deux données, alors que l’analyse de la formule du FPR (Nombre de faux positifs / Nombre de vrais négatifs) montre que :
Nous avons 100 faux positifs pour le 1er jeu de données, car nous avons 1000 observations de la classe 0 ;
Nous avons 1000 faux positifs pour le 2eme jeu de données parce que nous avons 10000 observations de la classe 0 (majoritaire).
Nous avons donc significativement plus de faux positifs à TPR égal ! Par conséquent, tracer une courbe ROC pour le 2eme jeu de données revient à afficher plusieurs valeurs de TPR qui ne sont simplement pas conçues pour détecter une augmentation considérable de faux positifs. Augmentation qui ferait chuter significativement la métrique de précision, si on devait l’utiliser pour évaluer un modèle.
Toutefois, nous avons une alternative de courbe tout aussi intéressante et surtout robuste à ce phénomène de déséquilibre des classes. Il s’agit de la courbe Précision-Rappel ou courbe PR. En plus, cela tombe bien, vous savez déjà comment fonctionnent le Rappel et la Précision ! Le principe va être très simple à comprendre :
La courbe PR présente sur l’axe des X des valeurs de précision et sur l’axe des Y des valeurs de rappel ;
Pour chaque seuil de probabilité possible, nous allons calculer la précision et le rappel de l’algorithme en question, sur le jeu de données en question (train ou test).
Voici un exemple de la courbe PR, issue de la donnée de notre projet filé, calculée sur le jeu de test :
L’interprétation de ce graphique nous montre qu’il est plus facile d’aller chercher un rappel élevé qu’une précision élevée, au niveau du jeu de test. Effectivement :
Pour un rappel de 70% on atteint un niveau de précision de 50% ;
Pour une précision de 70% nous sommes seulement à 30% de rappel.
Clairement, notre modèle peut encore être amélioré.
Voici le code pour reproduire la courbe :
y_scores_test = classifier.predict_proba(X_test[feature_names])[:, 1]
precision_test, recall_test, thresholds_test = precision_recall_curve(
y_test, y_scores_test
)
plt.plot(recall_test, precision_test, label="Precision-Recall Curve")
plt.xlabel("Recall")
plt.ylabel("Precision")
plt.title("Precision-Recall Curve Test Set")
plt.legend()
plt.show()
auc_test = auc(recall_test, precision_test)
Que ce soit pour la courbe ROC ou la courbe PR, le calcul de l’AUC est important pour deux raisons :
Un modèle A avec un meilleur AUC qu’un modèle B signifie que si nous mesurons la performance des deux modèles avec plusieurs seuils de probabilités, le modèle A sera en moyenne meilleur ;
Comme chaque point qui forme la courbe correspond à un seuil de probabilité, nous pouvons déterminer visuellement le seuil qui nous assure le meilleur compromis entre les deux métriques des axes des X et des Y(c’est-à-dire le rappel et la précision quand il s’agit de la courbe PR).
Nous pouvons enfin répondre à la question posée au début de cette section : on peut choisir le meilleur seuil de probabilité en se basant sur une courbe ROC ou PR. Par exemple, on peut choisir le seuil avec le meilleur F1 Score dans le cas où on utilise la courbe PR. ;)
Analysez la distribution des probabilités de votre algorithme
Même si nous avons trouvé le meilleur seuil de probabilité pour calculer la matrice de confusion et même si cette-ci semble montrer d'excellentes performances en jeu de test, nous ne devons pas oublier que les métriques seules ne suffisent pas et peuvent cacher des problèmes subtils de fiabilité.
Les modèles de classification ne font pas exception. Découvrons dans ce screencast les limites de la matrice de confusion et comment aller plus loin en analysant la distribution des probabilités de votre algorithme :
Quels points communs avec l'évaluation d’une régression ?
Dans le chapitre précédent, nous avons insisté sur le fait qu’un “bon” modèle ne maximise pas nécessairement une métrique ou une autre et qu’il faut avoir un raisonnement plus sophistiqué pour évaluer un algorithme.
Nous devons procéder exactement de la même manière ici : Qu’est-ce qu’un mauvais modèle de classification dans notre contexte ?
Reprenons notre exemple du projet fil rouge :
Un algorithme manifestant un bon rappel et une précision insuffisante passera rarement à côté de bien dessous de la moyenne du département, mais va fréquemment catégoriser à tort les transactions comme tel. Il faudra alors faire du tri supplémentaire parmi les “bonnes opportunités” signalées par le modèle ;
Un algorithme manifestant une bonne précision et un rappel insuffisant va rarement vous signaler de fausses “bonnes opportunités” d’achat, mais va probablement passer à côté de plusieurs bonnes opportunités.
Qu’est-ce qui est prioritaire ici ? Tout dépend du contexte métier ! Prenons deux exemples :
Si l’utilisateur final de l’algorithme est un particulier pressé à acheter un bien, alors il ne sera pas très content d’apprendre que la prédiction du modèle était un faux positif ! De plus, le particulier s’en fiche de la quantité de bonnes opportunités que le modèle peut trouver, il veut juste avoir confiance en ce que le modèle dit ! Ici, un bon rappel est prioritaire !
Si l’utilisateur final de l’algorithme est une agence immobilière, qui a un objectif de chiffre d'affaires, alors on ne peut pas se contenter d’un algorithme qui fournit trop peu de prédictions correctes. En effet, il faut qu’il y ait du volume pour que l’agence soit rentable, quitte à inclure des faux positifs. Des agents immobiliers pourront toujours repasser sur les prédictions pour s’assurer qu’elles sont assez fiables. Ici, une bonne précision est prioritaire !
Mais si j’ai l’une des deux métriques qui est vraiment nulle, le modèle reste inutilisable. Est-ce que j’ai un moyen de mettre l’accent sur l’une des deux métriques sans complètement ignorer l’autre ?
Excellent point et oui, nous avons plusieurs outils pour cela ! Nous allons en citer 3, que vous pouvez utiliser séparément ou combiner !
La première, vous la connaissez déjà, il s’agit du sample weighting dont nous avons parlé dans le chapitre précédent ! En effet, on peut utiliser cette technique pour assigner un poids plus élevé à la classe minoritaire du jeu de données, afin d’inciter le modèle de classification à se concentrer dessus. Souvent, cela permet de sécuriser un meilleur rappel, éventuellement une meilleure précision.
Deuxièmement, nous avons le Fbeta score. C’est une généralisation du F1 score dont nous avons parlé en début de chapitre ! Analysons ensemble la formule mathématique :
Fbeta = ((1 + beta^2) * Precision * Rappel) / (beta^2 * Precision + Rappel)
Le coefficient bêta permet justement de mettre plus de poids sur la précision ou le rappel :
Une valeur de Beta = 0.5 mets plus de poids sur la précision, sans négliger le rappel ;
Une valeur de Beta = 1 nous donne le F1 score qui accorde autant d’importance à la précision qu’au rappel , c’est ce que nous connaissons déjà ;
Une valeur de Beta = 2 mets l’accent sur le rappel, sans négliger la précision.
Cette métrique d’évaluation est disponible dans Scikit-learn et utilisable de la même manière que toutes les autres métriques de la librairie. :)
from sklearn;metrics import fbeta_score
La dernière méthode s’appelle le Class Balancing. Il s’agit en réalité d’un ensemble de techniques qui vont venir artificiellement modifier les proportions des classes pour contourner le déséquilibre des classes et faciliter l’apprentissage du modèle. Au choix, nous pouvons :
Réduire artificiellement et intelligemment la taille de la classe majoritaire, ce sont les méthodes d’Undersampling ;
Gonfler artificiellement et intelligemment la taille de la classe minoritaire, ce sont les méthodes d’Oversampling ;
Combiner les deux approches précédentes.
Rentrer dans le détail de ces méthodes, ainsi que de leurs avantages et inconvénients, serait beaucoup trop chronophage. Nous préférons vous renvoyer vers la documentation de cette librairie spécialisée en la matière comme lecture d’approfondissement si vous êtes curieux !
À vous de jouer !
De la même manière que l’on a exploré le lien entre les features et l’algorithme de régression dans le chapitre dernier. Reproduisez la démarche avec cette fois-ci un algorithme de classification sur la donnée du projet fil rouge.
Complétez ce template de code pré-rempli.
Une fois que vous avez fini, vous avez ce corrigé à disposition.
En résumé
La classification binaire repose sur des métriques clés : précision, rappel et F1 score. La précision minimise les faux positifs, tandis que le rappel réduit les faux négatifs. Le F1 score combine les deux, équilibrant précision et rappel.
Les métriques comme l'accuracy peuvent être trompeuses en cas de déséquilibre de classes. Dans ce contexte, il est préférable d'utiliser des courbes comme la courbe précision-rappel plutôt que la courbe ROC, car elle est plus robuste face à un grand nombre de faux positifs.
La courbe PR permet de visualiser l’évolution du compromis entre précision et rappel en fonction des seuils de probabilité et peut aider à choisir le seuil optimal pour un meilleur équilibre.
Pour ajuster les performances du modèle, des techniques comme le sample weighting ou le Fbeta score (avec un poids ajusté entre précision et rappel) permettent de prioriser l'une des deux métriques selon les besoins métier.
Enfin, le class balancing via des techniques d'undersampling ou d'oversampling aide à corriger les déséquilibres de classes pour améliorer l’apprentissage et les prédictions du modèle.
Après avoir maîtrisé la classification, il est temps de booster vos modèles grâce à l'optimisation des hyperparamètres !