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.
1import pandas as pd 2import matplotlib.pyplot as plt 3import seaborn as sns 4 5sns.set() 6 7df = pd.read_csv("https://blent-learning-user-ressources.s3.eu-west-3.amazonaws.com/single_notebooks/data/breast_cancer_wisconsin.csv") 8X = df.drop("diagnosis", axis=1) 9y = df['diagnosis'] 10 11print(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.
1from sklearn.linear_model import LogisticRegression 2 3model = LogisticRegression(max_iter=10000) 4model.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 par rapport à celles initialement de classe .
1import matplotlib.ticker as mtick 2from sklearn.metrics import confusion_matrix 3 4y_pred = model.predict(X) 5conf_mat = confusion_matrix(y, y_pred, normalize="true") 6 7fig = plt.figure(figsize=(11, 8)) 8 9ax = sns.heatmap( 10 conf_mat, # Matrice des scores 11 annot=True, # Afficher les scores 12 fmt='.02%', # Affichage en pourcentage avec 1 chiffre après la virgule 13 yticklabels=[0, 1], # Nom de l'axe vertical 14 xticklabels=[0, 1], # Nom de l'axe horizontal 15 cmap="Blues", # Palette de couleur 16 cbar_kws={'format': mtick.PercentFormatter(xmax=1)} # Pour afficher la barre verticale en pourcentage 17) 18plt.xlabel("Classes prédites") 19plt.ylabel("Classes actuelles") 20plt.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é.
1from sklearn.metrics import precision_score 2 3precision_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.
1from sklearn.metrics import recall_score 2 3recall_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 :
1from sklearn.metrics import f1_score 2 3f1_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
Machine Learning
Nada Belaidi
Data Scientist
Lire l'article
12 juil. 2022
Machine Learning
Nada Belaidi
Data Scientist
Lire l'article
4 juil. 2022
Machine Learning
Nada Belaidi
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
À propos
Gestion des cookies
© 2023 Blent.ai | Tous droits réservés