Par Maxime Jumelle
CTO & Co-Founder
Publié le 18 déc. 2020
Catégorie Machine Learning
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.
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)
À lire aussi : découvrez notre formation MLOps
Une des premières choses à bien comprendre en classification est qu'il existe deux types d'erreurs.
❓ 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.
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.
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
20 sept. 2022
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.
Équipe Blent
Data Scientist
Lire l'article
12 juil. 2022
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.
Équipe Blent
Data Scientist
Lire l'article
4 juil. 2022
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.
Équipe Blent
Data Scientist
Lire l'article
60 rue François 1er
75008 Paris
Blent est une plateforme 100% en ligne pour se former aux métiers Tech & Data.
Organisme de formation n°11755985075.
Data Engineering
IA Générative
MLOps
Cloud & DevOps
À propos
Gestion des cookies
© 2024 Blent.ai | Tous droits réservés