Polydesk-logotype
Polydesk.ai — Header

Matrice de Confusion (Confusion Matrix)

La matrice de confusion est un tableau qui résume les résultats d’un modèle de classification en croisant les prédictions du modèle avec les classes réelles, catégorisant chaque prédiction en vrai positif, vrai négatif, faux positif ou faux négatif.

C’est l’outil de diagnostic le plus fondamental en machine learning supervisé. Là où l’accuracy vous donne un seul chiffre, la matrice de confusion décompose les erreurs par type. Elle révèle non seulement combien d’erreurs le modèle commet, mais aussi lesquelles : confond-il les positifs avec les négatifs, ou l’inverse ? Cette distinction est cruciale car, dans la plupart des applications réelles, toutes les erreurs ne se valent pas.

Fiche rapide : Matrice de confusion
Aussi appelée
Error matrix, table de contingence des prédictions
Type
Outil d’évaluation pour la classification supervisée
Taille (binaire)
2 × 2 (4 cellules : TP, TN, FP, FN)
Taille (multiclasse)
N × N (N = nombre de classes)
Métriques dérivées
Accuracy, précision, rappel, F1-Score, MCC, AUC-ROC
Calcul Python
sklearn.metrics.confusion_matrix()
Visualisation Python
ConfusionMatrixDisplay.from_estimator()

Structure de la matrice de confusion binaire

Pour un problème à deux classes (positif / négatif), la matrice de confusion est un tableau 2 × 2 contenant quatre compteurs. Chaque prédiction du modèle tombe dans exactement l’une de ces quatre catégories.

Prédit Positif Prédit Négatif
Réel Positif TP (Vrai Positif) FN (Faux Négatif)
Réel Négatif FP (Faux Positif) TN (Vrai Négatif)

Les quatre catégories expliquées

Vrai Positif (TP, True Positive) : le modèle a prédit « positif » et la réalité est « positif ». C’est une prédiction correcte. Exemple : le modèle détecte un email spam, et c’est effectivement un spam.

Vrai Négatif (TN, True Negative) : le modèle a prédit « négatif » et la réalité est « négatif ». C’est une prédiction correcte. Exemple : le modèle classe un email légitime comme légitime.

Faux Positif (FP, False Positive) : le modèle a prédit « positif » mais la réalité est « négatif ». C’est une fausse alerte, aussi appelée erreur de Type I en statistiques. Exemple : le modèle envoie un email légitime dans le dossier spam.

Faux Négatif (FN, False Negative) : le modèle a prédit « négatif » mais la réalité est « positif ». C’est un cas manqué, aussi appelé erreur de Type II. Exemple : le modèle laisse passer un spam dans la boîte de réception.

Convention d’affichage Attention : scikit-learn place les classes dans l’ordre alphabétique/numérique. Pour une classification binaire (0/1), la classe 0 (négatif) apparaît en premier. La matrice affiche donc TN en haut à gauche et TP en bas à droite, ce qui est l’inverse de la convention médicale classique. Vérifiez toujours l’ordre des labels avant d’interpréter.

Exemple concret : détection de fraude

Prenons un modèle de détection de fraude évalué sur 10 000 transactions, dont 200 frauduleuses et 9 800 légitimes.

Prédit Fraude Prédit Légitime Total réel
Réellement Fraude TP = 160 FN = 40 200
Réellement Légitime FP = 120 TN = 9 680 9 800
Total prédit 280 9 720 10 000

Cette matrice raconte une histoire bien plus riche que l’accuracy seule (98,4 %). On voit immédiatement que :

Le modèle détecte 160 fraudes sur 200 (rappel = 80 %). Il rate 40 fraudes (FN), ce qui représente une perte financière potentielle.

Parmi les 280 alertes « fraude », seules 160 sont réelles (précision = 57 %). Chaque alerte fausse (120 FP) coûte du temps à l’équipe d’investigation.

L’accuracy de 98,4 % semble excellente, mais elle est gonflée par l’énorme majorité de vrais négatifs. Un modèle qui prédirait « légitime » pour tout obtiendrait 98 % d’accuracy tout en manquant 100 % des fraudes.

Les métriques dérivées de la matrice de confusion

La matrice de confusion est la source de presque toutes les métriques de classification. Voici les plus importantes et comment les calculer.

Métrique Formule Mesure quoi Plage
Accuracy (TP + TN) / (TP + TN + FP + FN) Proportion globale de prédictions correctes 0 à 1
Précision (PPV) TP / (TP + FP) Fiabilité des prédictions positives 0 à 1
Rappel (TPR, Sensibilité) TP / (TP + FN) Capacité à trouver les positifs 0 à 1
Spécificité (TNR) TN / (TN + FP) Capacité à identifier les négatifs 0 à 1
F1-Score 2 × (Précision × Rappel) / (Précision + Rappel) Moyenne harmonique précision/rappel 0 à 1
FPR (Taux de faux positifs) FP / (FP + TN) Proportion de négatifs mal classés 0 à 1
MCC (Matthews) (TP×TN – FP×FN) / √((TP+FP)(TP+FN)(TN+FP)(TN+FN)) Corrélation entre prédictions et réalité -1 à +1

Le compromis précision / rappel

C’est le compromis central en classification. Augmenter la précision (réduire les faux positifs) tend à diminuer le rappel (plus de faux négatifs), et inversement. Ce compromis est directement visible dans la matrice de confusion : réduire les FP augmente souvent les FN.

Le choix dépend du coût relatif des erreurs. En diagnostic médical (cancer, maladies graves), le rappel prime : manquer un cas positif (FN) est potentiellement fatal. En filtrage de spam, la précision prime : envoyer un email important dans le spam (FP) est très problématique pour l’utilisateur.

Le MCC : la métrique la plus complète

Le coefficient de corrélation de Matthews (MCC), inventé par Brian Matthews en 1975, est considéré par des recherches récentes (Chicco & Jurman, 2020, 2023) comme la métrique la plus informative pour résumer une matrice de confusion. Contrairement à l’accuracy ou au F1-Score, le MCC ne produit un score élevé que si les quatre catégories (TP, TN, FP, FN) présentent de bons résultats. Il est particulièrement robuste sur les datasets déséquilibrés.

Le MCC varie de -1 (prédiction parfaitement inversée) à +1 (prédiction parfaite), avec 0 correspondant à une prédiction aléatoire. En Python : sklearn.metrics.matthews_corrcoef(y_true, y_pred).

Quand utiliser le MCC ? Si vous ne pouvez rapporter qu’une seule métrique pour résumer votre matrice de confusion, le MCC est le meilleur choix. Il synthétise les quatre taux de base (sensibilité, spécificité, précision, VPN) et ne peut pas être artificiellement gonflé par un déséquilibre de classes, contrairement à l’accuracy.

Créer et visualiser une matrice de confusion en Python

Calcul de base avec scikit-learn

import numpy as np
from sklearn.metrics import confusion_matrix

# Labels réels et prédits
y_true = [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0, 1, 0]

# Matrice de confusion
cm = confusion_matrix(y_true, y_pred)
print(cm)
# [[4, 1],   ← [TN, FP]
#  [1, 4]]   ← [FN, TP]

# Extraire les quatre composantes
tn, fp, fn, tp = cm.ravel()
print(f"TP={tp}, TN={tn}, FP={fp}, FN={fn}")
Attention à l’ordre des labels Scikit-learn place la classe 0 en première ligne/colonne. La matrice affiche donc [[TN, FP], [FN, TP]] et non [[TP, FN], [FP, TN]]. C’est une source fréquente de confusion (un comble pour une matrice de confusion). Utilisez cm.ravel() pour extraire les composantes dans l’ordre tn, fp, fn, tp.

Visualisation en heatmap

Scikit-learn (version 1.8) fournit ConfusionMatrixDisplay pour une visualisation propre :

import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay

# Méthode 1 : à partir d'un estimateur
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)
model = LogisticRegression(max_iter=10000).fit(X_train, y_train)

ConfusionMatrixDisplay.from_estimator(
    model, X_test, y_test,
    display_labels=['Malin', 'Bénin'],
    cmap='Purples'
)
plt.title('Matrice de confusion - Cancer du sein')
plt.tight_layout()
plt.show()
# Méthode 2 : à partir de prédictions existantes
ConfusionMatrixDisplay.from_predictions(
    y_test, model.predict(X_test),
    display_labels=['Malin', 'Bénin'],
    cmap='Purples',
    normalize='true'  # normaliser par ligne (rappel)
)
plt.title('Matrice normalisée (rappel par classe)')
plt.tight_layout()
plt.show()

Les trois modes de normalisation

La normalisation est essentielle pour interpréter correctement une matrice de confusion sur des données déséquilibrées :

normalize='true' : normalise par ligne (par classe réelle). Chaque cellule montre la proportion de la classe réelle. La diagonale affiche le rappel par classe. C’est la normalisation la plus courante.

normalize='pred' : normalise par colonne (par classe prédite). La diagonale affiche la précision par classe.

normalize='all' : normalise par le total global. Chaque cellule montre la proportion du dataset total.

normalize=None (défaut) : affiche les comptes bruts. Utile pour voir les volumes absolus.

Le rapport de classification complet

En pratique, on combine la matrice de confusion avec classification_report() pour obtenir toutes les métriques dérivées d’un coup :

from sklearn.metrics import classification_report

print(classification_report(y_test, model.predict(X_test),
                           target_names=['Malin', 'Bénin']))

#               precision    recall  f1-score   support
#        Malin       0.95      0.93      0.94        63
#        Bénin       0.96      0.97      0.97       108
#     accuracy                           0.96       171
#    macro avg       0.96      0.95      0.95       171
# weighted avg       0.96      0.96      0.96       171

Ce rapport donne la précision, le rappel et le F1-Score pour chaque classe, plus les moyennes macro (non pondérée) et pondérée (par le nombre d’exemples par classe).

Matrice de confusion multiclasse

Pour un problème à N classes, la matrice de confusion est un tableau N × N. La diagonale contient les prédictions correctes, les cellules hors diagonale montrent les confusions entre classes.

Comment lire une matrice multiclasse

Prenons un classifieur d’images qui distingue chats, chiens et oiseaux, évalué sur 90 images :

Prédit Chat Prédit Chien Prédit Oiseau
Réel Chat 25 3 2
Réel Chien 4 22 4
Réel Oiseau 1 2 27

Lecture ligne par ligne (chaque ligne = une classe réelle) :

Sur 30 chats réels : 25 correctement identifiés, 3 confondus avec des chiens, 2 avec des oiseaux. Rappel chat = 25/30 = 83 %.

Sur 30 chiens réels : 22 corrects, 4 confondus avec des chats, 4 avec des oiseaux. Rappel chien = 73 %.

Sur 30 oiseaux réels : 27 corrects, 1 confondu avec un chat, 2 avec des chiens. Rappel oiseau = 90 %.

Lecture colonne par colonne (chaque colonne = une classe prédite) :

Sur 30 prédictions « chat » : 25 sont vraiment des chats. Précision chat = 25/30 = 83 %.

Les cellules hors diagonale révèlent les confusions spécifiques : le modèle confond davantage les chiens avec les chats (4 cas) qu’avec les oiseaux (2 cas). Ce type d’insight est invisible avec une métrique scalaire.

Métriques par classe en one-vs-rest

Pour calculer la précision, le rappel et le F1-Score d’une classe donnée en multiclasse, on adopte une vision « cette classe vs toutes les autres » :

Pour la classe « chat » : TP = 25, FP = 5 (chiens et oiseaux prédits chat), FN = 5 (chats prédits chien ou oiseau), TN = 55 (tout le reste correctement classé comme non-chat).

Matrice de confusion et déséquilibre de classes

Le déséquilibre de classes est le piège le plus courant dans l’interprétation de la matrice de confusion. Reprenons l’exemple de la détection de fraude : 200 fraudes sur 10 000 transactions (2 % de positifs).

Le piège de l’accuracy

Un modèle trivial qui prédit « légitime » pour toute transaction obtient cette matrice :

Prédit Fraude Prédit Légitime
Réellement Fraude 0 200
Réellement Légitime 0 9 800

Accuracy = 98 %. Pourtant, ce modèle est totalement inutile : il ne détecte aucune fraude (rappel = 0 %, précision = indéfinie). La matrice de confusion révèle immédiatement cette réalité, alors que l’accuracy la masque. C’est pourquoi il faut toujours examiner la matrice complète, pas seulement l’accuracy.

Stratégies face au déséquilibre

Face à un dataset déséquilibré, plusieurs approches aident à mieux interpréter la matrice :

Normaliser par ligne (normalize='true') pour voir le rappel de chaque classe indépendamment de sa taille.

Utiliser le MCC au lieu de l’accuracy comme métrique résumée, car il prend en compte les quatre cellules proportionnellement.

Reporter la précision et le rappel séparément pour la classe minoritaire, qui est généralement celle qui vous intéresse.

Compléter par la courbe ROC ou la courbe Precision-Recall pour une vue indépendante du seuil.

Applications concrètes par domaine

Diagnostic médical

En médecine, les quatre cellules ont des significations cliniques directes. Un FN en dépistage du cancer signifie un diagnostic manqué avec des conséquences potentiellement graves. Un FP signifie des examens complémentaires inutiles (biopsie, stress pour le patient). Le seuil de classification est ajusté pour minimiser les FN, en acceptant plus de FP.

NLP et classification de texte

En analyse de sentiment ou classification de texte, la matrice multiclasse montre quelles catégories le modèle confond. Par exemple, un classifieur de sentiments confond souvent « neutre » avec « positif » ou « négatif », mais rarement « positif » avec « négatif ». Cette information guide l’amélioration du modèle.

Vision par ordinateur

En classification d’images et détection d’objets, la matrice multiclasse identifie les classes visuellement similaires que le modèle confond (par exemple, loups et huskies, ou chats et petits félins). Ces confusions orientent le choix des données d’entraînement supplémentaires.

Cybersécurité

En détection d’intrusion, les FP (fausses alertes) épuisent les analystes de sécurité. Les FN (intrusions manquées) peuvent avoir des conséquences catastrophiques. La matrice de confusion quantifie ce compromis et permet d’ajuster la sensibilité du système selon la capacité d’investigation de l’équipe.

Erreurs courantes d’interprétation

Erreur n°1 : confondre les conventions d’affichage

Il n’existe pas de convention universelle pour l’orientation de la matrice. Scikit-learn met les classes réelles en lignes et les prédictions en colonnes, avec la classe 0 en premier. D’autres outils (comme R ou certaines publications médicales) inversent lignes et colonnes, ou mettent la classe positive en premier. Vérifiez toujours les labels avant d’interpréter.

Erreur n°2 : ignorer les volumes absolus

Une matrice normalisée qui montre 95 % de rappel pour chaque classe semble excellente. Mais si la classe positive contient 10 exemples et la négative 10 000, les 5 % d’erreurs sur la classe positive ne représentent que 0,5 cas manqué, tandis que 5 % d’erreurs sur la négative représentent 500 faux positifs. Regardez toujours les comptes bruts en complément des pourcentages.

Erreur n°3 : oublier que la matrice dépend du seuil

Pour les modèles probabilistes (régression logistique, Random Forest, XGBoost), la matrice de confusion dépend du seuil de classification choisi. Changer le seuil de 0,5 à 0,3 produira une matrice complètement différente. Une matrice seule ne montre qu’un point de fonctionnement. La courbe ROC ou la courbe Precision-Recall montrent tous les points possibles.

Erreur n°4 : évaluer sur les données d’entraînement

La matrice de confusion sur le jeu d’entraînement est quasi toujours trop optimiste. Un modèle complexe peut obtenir une diagonale parfaite sur l’entraînement tout en étant médiocre sur des données nouvelles. Calculez toujours la matrice sur un jeu de test séparé ou en validation croisée.

Outils avancés autour de la matrice de confusion

Matrice de confusion multi-label

En classification multi-label (chaque observation peut appartenir à plusieurs classes), scikit-learn fournit multilabel_confusion_matrix() qui retourne une matrice 2 × 2 par label :

from sklearn.metrics import multilabel_confusion_matrix

y_true = [[1, 0, 1], [0, 1, 0], [1, 1, 1]]
y_pred = [[1, 0, 0], [0, 1, 0], [1, 0, 1]]

mcm = multilabel_confusion_matrix(y_true, y_pred)
# mcm[0] = matrice pour le label 0
# mcm[1] = matrice pour le label 1
# mcm[2] = matrice pour le label 2

Visualisation personnalisée avec seaborn

Pour plus de contrôle visuel, seaborn offre des heatmaps configurables :

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Purples',
            xticklabels=['Négatif', 'Positif'],
            yticklabels=['Négatif', 'Positif'])
plt.xlabel('Prédiction')
plt.ylabel('Réalité')
plt.title('Matrice de confusion')
plt.tight_layout()
plt.show()

Verdict

La matrice de confusion est l’outil d’évaluation le plus fondamental en classification. Elle ne ment pas : elle montre exactement où le modèle se trompe et de quelle manière. Son principal avantage sur les métriques scalaires (accuracy, F1-Score) est de préserver l’information sur les types d’erreurs, ce qui est critique pour toute décision opérationnelle.

En pratique, commencez toujours par la matrice de confusion avant de regarder les métriques dérivées. Utilisez la normalisation pour les datasets déséquilibrés, le MCC comme métrique résumée la plus fiable, et n’oubliez pas que la matrice ne montre qu’un seul point de fonctionnement (un seuil). Pour une vue complète, combinez-la avec la courbe ROC ou Precision-Recall.


Questions fréquentes sur la matrice de confusion

Quelle est la différence entre une matrice de confusion et un rapport de classification ?

La matrice de confusion affiche les comptes bruts (TP, TN, FP, FN) dans un tableau. Le rapport de classification (classification_report() en scikit-learn) calcule les métriques dérivées de la matrice : précision, rappel, F1-Score par classe, plus les moyennes macro et pondérée. Les deux sont complémentaires : la matrice donne les volumes absolus, le rapport donne les ratios. En pratique, regardez les deux.

Comment interpréter une matrice de confusion quand les classes sont très déséquilibrées ?

Sur des données déséquilibrées (par exemple 99 % de négatifs), les comptes bruts de la matrice sont trompeurs car les grands nombres de la classe majoritaire masquent les erreurs sur la classe minoritaire. Utilisez la normalisation par ligne (normalize='true') pour voir le rappel de chaque classe indépendamment de sa taille. Complétez avec le MCC plutôt que l’accuracy, et focalisez-vous sur la précision et le rappel de la classe minoritaire, qui est généralement celle qui compte.

La matrice de confusion fonctionne-t-elle pour la régression ?

Non, la matrice de confusion est exclusivement conçue pour les problèmes de classification (classes discrètes). Pour la régression (valeurs continues), les métriques pertinentes sont le MSE, le RMSE, le MAE ou le R². Si vous souhaitez évaluer une régression via une matrice de confusion, vous pouvez discrétiser les prédictions en classes (par exemple « faible », « moyen », « élevé »), mais vous perdrez de l’information.

Pourquoi scikit-learn affiche TN en premier et pas TP ?

Scikit-learn ordonne les labels par ordre croissant (0 avant 1, « A » avant « B »). Pour une classification binaire 0/1, la classe 0 (négatif) est donc en première ligne et première colonne, ce qui place TN en [0,0] et TP en [1,1]. C’est une convention de codage, pas une convention universelle. La littérature médicale place souvent TP en haut à gauche. Utilisez le paramètre labels de confusion_matrix() pour réordonner si nécessaire : confusion_matrix(y_true, y_pred, labels=[1, 0]).

Quelle est la meilleure métrique à extraire de la matrice de confusion ?

Cela dépend de votre problème. Si les deux types d’erreurs ont un coût similaire et le dataset est équilibré, l’accuracy suffit. Sur un dataset déséquilibré, le MCC est la métrique unique la plus fiable. Si les faux positifs coûtent cher, focalisez sur la précision. Si les faux négatifs coûtent cher, focalisez sur le rappel. Le F1-Score offre un compromis entre précision et rappel. Dans tous les cas, ne vous limitez jamais à une seule métrique : la matrice complète vous donne une vision beaucoup plus riche.

Polydesk.ai — Footer