Cet article est le deuxième de notre série consacrée aux métriques de classification, dans le cadre de notre formation : Evaluer la performance des modèles de Machine Learning et de Deep Learning.
La matrice de confusion (confusion matrix en anglais) est le socle incontournable sur lequel s’appuient toutes les métriques de classification : accuracy, F1-score, ROC curve, Précision-Recall… La maîtriser est donc un pré-requis indispensable pour bien comprendre comment évaluer la performance d’un modèle de classification.
Pour autant, elle reste nébuleuse pour bien des data scientists juniors, et pour les non-data scientists qui tentent de comprendre la performance des algorithmes. Elle dépend à la fois des valeurs réelles de la variable cible, des probabilités d’un modèle prédictif, et d’un seuil de classification pour traduire ces probabilités en labels. Un grand nombre de seuils – et donc un grand nombre de matrices de confusion – sont possibles pour un même modèle, ce qui rend la matrice de confusion “mouvante”. Faisons le point.
La matrice de confusion, qu’est-ce que c’est ?
La matrice de confusion est un outil de mesure de la performance des modèles de classification à 2 classes ou plus. Dans le cas binaire (i.e. à deux classes, le cas le plus simple), la matrice de confusion est un tableau à 4 valeurs représentant les différentes combinaisons de valeurs réelles et valeurs prédites comme dans la figure ci-dessous.
Figure 1. Matrice de confusion
Cette matrice est indispensable pour définir les différentes métriques de classification telles que l’Accuracy, le F1-score ou encore l’AUC PR et l’AUC ROC.
Passons par un exemple de diagnostic de grossesse pour comprendre ce que signifie chaque élément de cette matrice :
Figure 2. Matrice de confusion appliquée au diagnostic de grossesse. Adapté de 2 photos de National Cancer Institute sur Unsplash.
Les 4 cas possibles lors d’une prédiction binaire telle qu’une grossesse sont :
- Vrai négatif (True Negative) :
- La prédiction est négative et c’est la réalité.
- Le médecin prédit que la patiente n’est pas enceinte, ce qui est vrai.
- Vrai positif (True Positive) :
- La prédiction est positive et c’est la réalité.
- Le médecin prédit que la patiente est enceinte, ce qui est vrai.
- Faux positif (False positive), erreur de 1ère espèce :
- La prédiction est positive mais ce n’est pas la réalité.
- Le médecin prédit que la patiente est enceinte alors qu’elle ne l’est pas.
- Faux négatif (False negative), erreur de 2ème espèce :
- La prédiction est négative mais ce n’est pas la réalité.
- Le médecin prédit que la patiente n’est pas enceinte alors qu’elle l’est.
Confusion matrix sur un exemple simple
Conversion de probabilités en labels
Comment calcule-t-on la matrice de confusion à partir des prédictions d’un modèle ? Pour bien comprendre le calcul, faisons-le à la main sur un petit nombre d’individus. Supposons qu’à partir des réponses à un questionnaire ou à des analyses médicales, un modèle de machine learning donne une probabilité d’être enceinte à chaque patiente. Le médecin convertit ces probabilités en labels enceinte / pas enceinte en fixant un seuil à partir duquel il considère que la probabilité est significative. Ce seuil est appelé un seuil de classification (classification threshold).
Figure 3. Conversion des probabilités en labels. A gauche les probabilités prédites par le modèle pour chaque patiente. A droite les labels obtenus en appliquant un seuil de 30%.
En comparant les prédictions à la réalité, on construit la matrice de confusion afin d’évaluer la qualité des prédictions issues du modèle. La matrice de confusion sera ensuite utilisée pour calculer les différentes métriques de classification.
Figure 4. Calcul de la matrice de confusion. Les prédictions correctes sont en vert et les prédictions erronées en rouge. En comparant les prédictions à la réalité, on obtient la matrice de confusion pour le seuil de classification de 30%.
Effets du classification threshold
Pour un même modèle, on obtient plusieurs matrices de confusion en fonction du seuil choisi par le médecin. L’animation suivante montre différentes matrices de confusion obtenues pour les mêmes probabilités issues du modèle mais avec différents seuils de classification.
Figure 5. Evolution de la matrice de confusion. Selon le seuil de classification utilisé, la matrice de confusion contient des valeurs différentes. Pour un seuil faible, il y aura plus de prédictions positives que pour un seuil élevé.
Dans cette animation, on peut observer deux propriétés de la matrice de confusion lors de l’évolution du seuil de classification :
- Les individus négatifs se transfèrent progressivement de Faux Positifs vers Vrais Négatifs. En effet, le nombre de patientes qui ne sont pas enceintes est une constante qui ne change pas avec la variation du seuil de classification. La somme $TN + FP$ reste donc constante : \begin{equation*} TN + FP = \text{nombre de negatifs reels} \end{equation*}
- De la même façon, les individus positifs se transfèrent progressivement de Vrais Positifs vers Faux Négatifs et la somme $TP + FN$ reste constante indépendamment de la valeur du seuil de classification :
\begin{equation*} TP + FN = \text{nombre de positifs reels} \end{equation*}
Application à des données réelles
Appliquons à présent le calcul de la matrice de confusion à de vraies données. Pour cela, nous allons utiliser le jeu de données Telco Customer Churn [2]. Ces données permettent de prédire les résiliations des clients d’une agence de télécommunication fictive en fonction de leurs offres, de leurs tarifs et des autres informations associées aux contrats.
Modèle de prédiction de la résiliation (churn) des clients
Sous Python, calculons la matrice de confusion du modèle sur nos données, à partir du modèle xgboost entraîné (code dans le premier article).
En utilisant les labels prédits par la méthode predict du modèle, on peut calculer la matrice de confusion de notre modèle :
from sklearn.metrics import confusion_matrix
matrix = confusion_matrix(y_true=y_test, y_pred=label_pred)
print(matrix)
Attention, la matrice de confusion dépend du seuil de classification! Il est facile de l’utiliser avec les labels prédits et d’oublier qu’il y a eu un choix du seuil de classification implicite (à 50%). Pour ne pas dissimuler le choix du seuil derrière l’utilisation de la méthode predict, le code suivant permet de calculer la matrice de confusion pour un seuil donné :
# Définition d'un seuil de classification (par exemple 60%)
threshold = 0.6
# Labels prédits pour un seuil donné
label_pred_threshold = (probas_pred > threshold).astype(int)
# Calcul de la matrice de confusion pour un seuil donné
matrix_threshold = confusion_matrix(
y_true=y_test, y_pred=label_pred_threshold
)
print(matrix_threshold)
La matrice de confusion peut se trouver sous différents formats. Dans le cas de scikit-learn, le format est : classes prédites en colonnes et classes réelles en lignes. Pour obtenir le format présenté dans cet article, il suffit de transposer la matrice obtenue via sklearn.
Sous R, on peut utiliser la fonction confusionMatrix du package caret. Pour la visualisation on peut utiliser fourfoldplot, ou la fonction autoplot de ggplot2.
A chaque seuil de classification choisi, la matrice de confusion et ses composantes évoluent. Visualisons cette évolution avec la figure suivante :
Figure 6. Evolution des composantes de la matrice de confusion. Coin supérieur gauche : distribution des probabilités de résiliation prédites. 1 point = 1 client, coloré en orange s’il a effectivement résilié (churn), en bleu s’il n’a pas résilié (no churn). Coin inférieur gauche : matrice de confusion pour chaque seuil de classification. Côté droit : évolution de chacun des indicateurs de la matrice de confusion.
On comprend à la lecture des graphiques qu’il n’y a pas de seuil parfait. Plus on accroît le seuil, plus le nombre de faux positifs baisse et le nombre de vrais négatifs augmente, ce qui est une bonne chose. Mais les vrais positifs baissent et les faux négatifs augmentent.
Quel seuil de classification privilégier ?
Le trade-off entre les composantes de la matrice de confusion en fonction du classification threshold est observable sur tous les modèles de classification à partir du moment où ils n’arrivent pas à parfaitement séparer les observations positives des négatives.
Selon les besoins, le choix du seuil diffère. On peut privilégier la détection de tous les clients prévoyant de résilier (augmenter le nombre de vrais positifs) en abaissant le seuil, quitte à augmenter aussi le nombre de faux positifs, ce qui conduit à proposer des réductions de tarif à des clients qui n’allaient pas partir – et donc à perdre des marges.
A l’inverse, on peut privilégier la certitude que les résiliations prédites sont de vraies résiliations (réduire le nombre de faux positifs) en augmentant le seuil, quitte à détecter moins de résiliations. Le bon compromis entre ces deux voies dépend des données économiques et de la stratégie d’entreprise.
Modèle parfait et modèle non-informatif
Confusion matrix d’un modèle parfait
Pour le modèle parfait, l’évolution de la matrice de confusion est assez simple :
- D’abord les faux positifs deviennent progressivement des vrais négatifs, sans affecter les vrais positifs.
- Puis les vrais positifs deviennent progressivement des faux négatifs, sans affecter les vrais négatifs.
Cette évolution est illustrée dans l’animation suivante :
Figure 7. Evolution de la matrice de confusion d’un modèle parfait. Graphe supérieur gauche : distribution des probabilités de résiliation prédites. 1 point = 1 client, coloré en orange s’il a effectivement résilié (churn), en bleu s’il n’a pas résilié (no churn). Graphe inférieur gauche : matrice de confusion pour chaque seuil de classification. Milieu et droite : évolution de chacun des indicateurs de la matrice de confusion.
Confusion matrix d’un modèle non-informatif
Pour le modèle non-informatif, l’évolution de la matrice de confusion est également assez simple, puisque ce sont aléatoirement des faux positifs qui deviennent des vrais négatifs ou des vrais positifs qui deviennent des faux négatifs à mesure que le seuil augmente.
Cette évolution est illustrée dans l’animation suivante :
Figure 8. Evolution de la matrice de confusion d’un modèle aléatoire. Graphe supérieur gauche : distribution des probabilités de résiliation prédites. 1 point = 1 client, coloré en orange s’il a effectivement résilié (churn), en bleu s’il n’a pas résilié (no churn). Graphe inférieur gauche : matrice de confusion pour chaque seuil de classification. Milieu et droite : évolution de chacun des indicateurs de la matrice de confusion.
Ces résultats peuvent s’expliquer par un calcul théorique assez simple. Notons :
- p le taux de positifs dans nos données. p est donc une constante.
- q le taux de prédictions positives. Il s’agit tout simplement du pourcentage d’individus qui sont labelisés positifs. q évolue avec le seuil de classification.
Que valent les composantes de la matrice de confusion ?
- Nous prédisons q% des individus comme positifs. Or p% de ces individus sont positifs. Le pourcentage de vrais positifs est donc TP = pq%. Et (1-p)% de ces individus sont négatifs. Le pourcentage de faux positifs est donc FP = (1-p)q%.
- Nous prédisons (1-q)% des individus comme négatifs. Or p% de ces individus sont positifs. Le pourcentage de faux négatifs est donc FN = p(1-q)%. Et (1-p)% de ces individus sont négatifs. Le pourcentage de vrais négatifs est donc TN = (1-p)(1-q)%.
Figure 9. Matrice de confusion théorique d’un modèle aléatoire.
Composantes de la matrice exprimées en %. p est le taux de positifs dans le jeu de données et q est le taux de prédictions positives.
Notons qu’avec un modèle non-informatif pour lequel la probabilité donnée à un individu est uniforme sur [0,1], le taux de prédictions positives peut s’écrire en fonction du seuil de classification : \begin{equation*} q = 100\% \, – \, \text{seuil} \end{equation*}
Conclusion
La matrice de confusion est le socle des différentes métriques de classification et il est essentiel de bien la comprendre pour appréhender les métriques qui en découlent.
Nous avons vu dans cet article des notions-clés : la conversion de probabilités en labels à partir d’un seuil de classification, le calcul des composantes de la matrice de confusion, le trade-off entre ces composantes pour un modèle de Machine Learning mais aussi leur comportement pour un modèle parfait ou pour un modèle non-informatif.
La matrice de confusion n’a donc plus de secret pour vous ! Pour aller plus loin et maîtriser des métriques comme l’Accuracy, la Precision et le Recall, vous pouvez consulter les autres articles de cette série sur les métriques de classification.
- 2 jours
- 950€
- 2 jours
- 1 200€
Références :
- « sklearn.metrics.confusion_matrix », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.confusion_matrix.html
- « Telco Customer Churn ». https://kaggle.com/blastchar/telco-customer-churn
Crédit Image : Darin Lammers – Dribbble