← Retourner à la liste des articles
Image blog
Auteur

Par Maxime Jumelle

CTO & Co-Founder

Publié le 18 déc. 2020

Catégorie Machine Learning

Validation et classification : mode d'emploi

Dans les sujets de classifications binaire, où la réponse en sortie d'un algorithme de Machine Learning est à deux valeurs possibles (0 ou 1), on parle souvent de précision et de rappel (ou precision et recall en anglais).

Ces deux mesures, souvent mal comprises, ne mesurent pas la même chose et ne s'interprétent pas de la même manière. Pourtant, elles forment un score connu, le F1 Score, mais qui manque très souvent de contexte. Nous allons essayer de démystifier ces métriques ici.

Détection du cancer de sein

Pour bien comprendre comment nous mesurons les performances des modèles de classification, prenons le jeu de données suivant qui indique si, suite à un examen médical, des patientes sont atteintes d'un cancer du sein.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set()

df = pd.read_csv("https://blent-learning-user-ressources.s3.eu-west-3.amazonaws.com/single_notebooks/data/breast_cancer_wisconsin.csv")
X = df.drop("diagnosis", axis=1)
y = df['diagnosis']

print(X.shape)

Nous avons 569 examens médicaux, où chaque examen récupère 30 variables explicatives.

Le modèle que nous allons utiliser est une régression logistique, qui va simplement séparer linéairement les deux sous-ensembles (cancer ou non) par une droite.

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(max_iter=10000)
model.fit(X, y)

Validation du modèle


À lire aussi : découvrez notre formation MLOps


Une des premières choses à bien comprendre en classification est qu'il existe deux types d'erreurs.

  • Les faux positifs, lorsque le modèle prédit à tort une classe positive pour une observation qui est de classe négative.
  • Les faux négatifs, lorsque le modèle prédit à tort une classe négative pour une observation qui est de classe positive.

❓ Pourquoi est-il important de faire une distinction ?

Parce que très souvent, selon le contexte, les deux erreurs n'ont pas le même impact. Prenons deux exemples.

Supposons que l'on laisse un algorithme décider du diagnostic médical pour une recherche de cellules cancéreuses. Un faux positif indiquerai que la personne a le cancer alors qu'en réalité, elle n'en a pas. À l'inverse, le faux négatif irait diagnostiquer un patient comme étant sain alors qu'il a un cancer.

Ces deux types d'erreurs n'ont pas la même gravité : la première (faux positif) serait en effet douloureux psychologiquement pour la patient au début, mais les futurs tests (car il y en aura d'autres) montreront l'échec de diagnostic du premier examen : il n'y a donc pas de gravité d'un point de vue médical.

Pour la seconde erreur (faux négatif), la patient ne subira pas d'autres examens : il va donc repartir chez lui sans que lui-même ou les médecins savent qu'il est porteut d'un cancer. D'un point de vue médical, ce cas est bien évidemment beaucoup plus grave.

Et c'est d'ailleurs souvent le cas en médecine : les faux positifs ont une gravité beaucoup plus importantes que les faux négatifs.

On peut alors se poser la question : mon modèle produit-il plus souvent des faux positifs ou des faux négatifs ? Et un bon moyen de le savoir, c'est tout d'abord de regarder la matrice de confusion.

Matrice de confusion

La matrice de confusion est un outil qui consiste à comparer la proportion d'observations correctement prédites dans la classe \(k\) par rapport à celles initialement de classe \(k\).

import matplotlib.ticker as mtick
from sklearn.metrics import confusion_matrix

y_pred = model.predict(X)
conf_mat = confusion_matrix(y, y_pred, normalize="true")

fig = plt.figure(figsize=(11, 8))

ax = sns.heatmap(
    conf_mat,  # Matrice des scores
    annot=True,  # Afficher les scores
    fmt='.02%',  # Affichage en pourcentage avec 1 chiffre après la virgule
    yticklabels=[0, 1],  # Nom de l'axe vertical
    xticklabels=[0, 1],  # Nom de l'axe horizontal
    cmap="Blues",  # Palette de couleur
    cbar_kws={'format': mtick.PercentFormatter(xmax=1)}  # Pour afficher la barre verticale en pourcentage
)
plt.xlabel("Classes prédites")
plt.ylabel("Classes actuelles")
plt.show()

Par exemple, la première ligne concerne les observations qui étaient de classe 0. Parmi elles, 97,48% des observations ont été correctement prédites à 0, alors que 2.52% des observations de classe 0 ont été prédites à 1. Il y a donc un taux de 2,52% de faux positifs (noté FP pour false positives).

À l'inverse, sur la deuxième lignes, il y a seulement 92,92% des observations de classe 1 correctement prédites : il y a donc un taux de 7,08% de faux négatifs (noté FP pour false negatives).

Dans ce contexte, le faux négatif pose plus problème, car cela signifie que le cancer de sein n'est pas détécté, à tort.

Précision et rappel

En règle général, on utilise un score global qui permet de résumér ces informations : c'est le F1 Score. Ce score se calcule à partir de deux quantités, la précision et le rappel.

La précision mesure la probabilité d'avoir réellement un cancer du sein parmi les patientes dont un cancer du sein a été détécté.

$$\frac{TP}{TP+FP}$$
from sklearn.metrics import precision_score

precision_score(y, y_pred)

Intuitivement, plus la précision est élevée, plus les prédictions du modèle sont fiables lorsqu'il prédit un cancer de sein chez une patiente. Sur notre jeu de données, la précision est de 95,6%.

À l'inverse, le rappel mesure la probabilité de prédire un cancer du sein parmi les patientes ayant réellement un cancer du sein.

$$\frac{TP}{TP+FN}$$
from sklearn.metrics import recall_score

recall_score(y, y_pred)

La précision, quand à elle, montre que chez les patientes atteintes d'un cancer du sein, seules 92,9% ont eu un diagnostic positif. C'est donc le rappel ici qui est plus important, car un rappel bas consisterai à passer à côté de beaucoup de cas réellement positifs.


À lire aussi : découvrez notre formation MLOps


Le F1 Score est donc un mixte de ces deux scores, calculé par la formule suivante :

$$\text{Score}_{\text{F1}}=2 \frac{\text{Precision} \times \text{Rappel}}{\text{Precision} + \text{Rappel}}$$
from sklearn.metrics import f1_score

f1_score(y, y_pred)

Bien que le F1 Score soit de 94,3%, s'agit-il d'un modèle efficace ? En effet, d'après les calculs, il y a tout de même un rappel d'environ 7%, donc autant de patientes qui seront renvoyées chez elle sans avoir été capable de diagnostiquer un cancer du sein.

Ce qui est important, c'est d'étudier et d'interpréter les résultats du modèle. Dans ce cas de figure, il serait dangereux de faire confiance aveuglément à un algorithme, surtout lorsqu'on sait qu'il produira des faux négatifs.

En conclusion, il est très important de toujours valider et interpréter un modèle avec un contexte, et le Data Scientist n'échappe pas à cette règle : les connaissances métiers seront toujours d'une aide précieuse.

Vous souhaitez vous former au MLOps ?

Articles similaires

Blog

20 sept. 2022

Machine Learning

Hugging Face est une startup française qui s'est fait connaître grâce à l'infrastructure NLP qu'ils ont développée. Aujourd'hui, elle est sur le point de révolutionner le domaine du Machine Learning et traitement automatique du langage naturel. Dans cet article, nous allons présenter Hugging Face et détailler les taches de base que cette librairie permet de réaliser. Nous allons également énumérer ses avantages et ses alternatifs.

Nada Belaidi

Équipe Blent

Data Scientist

Lire l'article

Blog

12 juil. 2022

Machine Learning

spaCy est une bibliothèque open-source pour le traitement avancé du langage naturel. Elle est conçue spécifiquement pour une utilisation en production et permet de construire des applications qui traitent et comprennent de grands volumes de texte.

Nada Belaidi

Équipe Blent

Data Scientist

Lire l'article

Blog

4 juil. 2022

Machine Learning

Un auto-encodeur est une structure de réseaux neuronaux profonds qui s'entraîne pour réduire la quantité de données nécessaires pour représenter une donnée d'entrée. Ils sont couramment utilisés en apprentissage automatique pour effectuer des tâches de compression de données, d'apprentissage de représentations et de détection de motifs.

Nada Belaidi

Équipe Blent

Data Scientist

Lire l'article