Partie 9 : F1-score, la synthèse entre precision et recall

Le F1-score évalue la capacité d’un modèle de classification à prédire efficacement les individus positifs, en faisant un compromis entre la precision et le recall.
F1-score - performance evaluation
Sommaire

Cet article est le neuviè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.

 

Pour la compréhension de cet article, il est nécessaire de connaître les notions de precision et de recall. Ces deux métriques sont détaillées dans le troisième article de cette série.

 

Le F1-score, qu’est-ce que c’est ?

Définition

Le F1-score est une métrique pour évaluer la performance des modèles de classification à 2 classes ou plus. Elle est particulièrement utilisée pour les problèmes utilisant des données déséquilibrées comme la détection de fraudes ou la prédiction d’incidents graves.

 

Le F1-score permet de résumer les valeurs de la precision et du recall en une seule métrique. Mathématiquement, le F1-score est défini comme étant la moyenne harmonique de la precision et du recall, ce qui se traduit par l’équation suivante :

\begin{equation*}
\text{F1-score} = \frac{2}{\frac{1}{\text{precision}} + \frac{1}{\text{recall}}}
\end{equation*}

Cette équation peut être simplifiée et s’exprimer directement à partir des composantes de la matrice de confusion :

\begin{equation*} \text{F1-score} = \frac{TP}{TP+\frac{1}{2}(FN+FP) } \end{equation*}

Cette dernière formule montre que le F1-score compare les prédictions positives correctes (TP) aux erreurs (FN+FP) faites par le modèle.

 

Un F1-score de 50% équivaut à TP = ½ (FN + FP) et s’interprète donc de la façon suivante : pour une prédiction positive correcte, le modèle fait deux erreurs (faux négatif ou faux positif).

 

La famille des F-beta scores

Le F1-score appartient à la famille plus large des F-beta scores. Dans le cas du F1-score, les erreurs (FN+FP) faites par le modèle sont pondérées par un facteur 1⁄2. Le F1-score accorde ainsi la même importance à la precision et au recall, et donc aux faux positifs et aux faux négatifs.

 

Le F-beta score permet de varier la pondération de ces termes :

\begin{equation*}
\text{F}_\beta\text{-score} = (1 + \beta^2) \cdot \frac{\mathrm{precision} \cdot \mathrm{recall}}{(\beta^2 \cdot \mathrm{precision}) + \mathrm{recall}}
\end{equation*}

Ce qui s’écrit également :

\begin{equation*}
\text{F}_\beta \text{-score} = \frac{TP}{TP+\frac{1}{1+\beta^2}(\beta^2 FN+FP)}
\end{equation*}

  • Pour $\beta \geq 1$, on accorde plus d’importance au recall (autrement dit aux faux négatifs).
  • Pour $\beta \leq 1$, on accorde plus d’importance à la precision (autrement dit aux faux positifs).
  • Pour $\beta = 1$, on retrouve le F1-score, qui accorde autant d’importance à la precision qu’au recall.

 

Le F1-score et le F\beta-score peuvent être calculés grâce aux fonctions de scikit-learn : sklearn.metrics.f1_score [1] et sklearn.metrics.fbeta_score [2].

 

 

F1-score sur un exemple simple

Comment calcule-t-on le F1-score à partir des probabilités prédites par un modèle ? Faisons le calcul à la main sur un petit nombre d’individus.

 

F1-score pour un seuil de classification

Supposons qu’à partir de réponses à un questionnaire ou d’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 prenant en compte un seuil de classification (classification threshold) à partir duquel il considère que la probabilité est significative. Pour plus de détails, consulter l’article sur la matrice de confusion.

 

En comparant les labels prédits à la réalité, on construit la matrice de confusion afin d’évaluer la qualité des prédictions issues du modèle, et on calcule le F1-score :

F1-score - calcul prediction reality

Figure 1. Calcul du F1-score pour le diagnostic de grossesse.

Pour un même modèle, on obtient plusieurs matrices de confusion en fonction du choix du seuil fait par le médecin. On obtient donc aussi différentes F1-scores.

 

Courbe du F1-score

L’animation suivante montre différentes valeurs de F1-score obtenues pour les mêmes probabilités issues du modèle mais avec différents seuils de classification :

A travers cet exemple basique, on obtient une courbe très bruitée. Mais on constate une décroissance du F1-score avec l’augmentation du seuil de classification au-delà de 20%. En effet le numérateur du F1-score – le nombre de vrais positifs (TP) – diminue plus rapidement que son dénominateur (la baisse de TP et FP étant en partie compensée par l’augmentation de FN).

 

Lorsqu’on s’intéresse uniquement au F1-score pour évaluer la performance d’un modèle, on retient généralement  le seuil qui le maximise.

 

 

F1-score sur des données réelles

Appliquons à présent le calcul de l’accuracy à de vraies données. Pour cela, nous utilisons le jeu de données Telco Customer Churn [3]. Ces données permettent de prédire les résiliations des clients d’une agence de télécommunication 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

Calculons le F1-score 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 le F1-score de notre modèle :

				
					from sklearn.metrics import f1_score
 
f1 = f1_score(y_true=y_test, y_pred=label_pred)
print(f1)
				
			

Sous R, on peut utiliser la fonction performance() de ROCR ou la fonction F1_score() de MLmetrics.

 

Attention, le F1-score dépend du seuil de classification! Il est facile de l’utiliser directement 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 le F1-score à partir des probabilités en sortie du modèle :

				
					# Définition des seuils de classification pour lesquels on va calculer
# les f1 scores
threshold_array = np.linspace(0, 1, 100)
f1_list = []
 
for threshold in threshold_array:
    # Labels prédits pour un seuil donné
    label_pred_threshold = (probas_pred > threshold).astype(int)
    # Calcul du f1 pour un seuil donné
    f1_threshold = f1_score(
        y_true=y_test, y_pred=label_pred_threshold
    )
 
    f1_list.append(f1_threshold)
 
plt.plot(threshold_array, f1_list)
plt.show()
				
			

En examinant cette courbe point par point, on observe qu’à chaque seuil de classification choisi, la matrice de confusion et le F1-score évoluent :

Figure 3. Courbe F1-score d’un modèle de Machine Learning
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. Graphe droite : courbe du F1-score en fonction du seuil. En pointillés les courbes de precision et de recall, qui encadrent bien leur moyenne harmonique, le F1-score.

Nous avons vu dans l’article dédié à la précision et au recall l’évolution de ces deux indicateurs avec le seuil de classification. Pour le F1-score, nous observons une courbe en cloche. Pour bien comprendre ce comportement, reprenons l’équation du F1-score :

\begin{equation*}
\text{F1-score} = \frac{2}{\frac{1}{\text{precision}} + \frac{1}{\text{recall}}}
\end{equation*}

 

Le F1-score étant une moyenne harmonique de la précision et du recall, il n’est élevé qu’à la condition que ces deux indicateurs soient élevés. Il traduit donc bien un compromis entre precision et recall. Lorsque le recall baisse par exemple, le terme $\frac{1}{\text{recall}}$ augmente fortement et le F1-score diminue.

 

Les deux cas limites sont les suivants : 

  • Avec un seuil à 0%, tous les individus sont prédits positifs : la precision est alors égale aux taux de positifs p, le recall à 100% et le F1-score vaut donc $\frac{2p}{(p+1)}$ (dans nos données p = 27%, ce qui donne un F1-score de 43%). Ceci vaut pour tous les modèles (y compris les modèles parfait et non-informatif ci-dessous).
  • Avec un seuil à 100%, le F1-score vaut 0%.

Le seuil qui maximise le F1-score dans notre exemple est égal à 10%. Le F1-score vaut alors 64%.

 

 

F1-score d’un modèle non-informatif et d’un modèle parfait

Etudions le F1-score dans le cas des modèles non-informatif et parfait.

 

Modèle parfait

Un modèle parfait (perfect model/classifier) est un modèle qui sépare parfaitement les individus positifs des individus négatifs.

 

Nous pouvons comprendre intuitivement le F1-score d’un modèle parfait. Selon le seuil de classification utilisé, 3 cas sont possibles :

  1. Seuil trop faible : on prédit comme il faut les positifs mais on se trompe sur les négatifs. A mesure que le seuil augmente, le F1-score s’améliore.
  2. Seuil optimal (séparation parfaite des deux classes) : on ne se trompe ni sur les positifs ni sur les négatifs : l’accuracy est maximale (100%) et constante.
  3. Seuil trop élevé : on prédit correctement les négatifs mais on se trompe sur les positifs. A mesure que le seuil croît, le F1-score diminue.

Empiriquement, on retrouve cette évolution en 3 phases :

 

Modèle non-informatif

Un modèle non-informatif est un modèle dans lequel les individus positifs ont la même distribution de probabilités que les individus négatifs.

 

Calcul théorique du F1-score :

Pour comprendre ce calcul, considérons un modèle non-informatif et un jeu de données contenant un taux de positifs noté p. Nous avons fixé un seuil de classification et obtenons un taux de prédictions positives noté q.

 

En repartant de la matrice de confusion du modèle non-informatif, calculons la formule du F1-score :

F1-score - Confusion matrix baseline theory

Figure 5. F1-score d’un modèle non-informatif.
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.

L’interprétation de cette équation où p est une constante (puisqu’il correspond au taux de positifs des données) et où q varie avec le seuil de classification est plus complexe que la droite obtenue dans le cas de l’accuracy :

  1. Nous avons vu dans l’article dédié à la courbe Precision-Recall que la precision d’un modèle aléatoire vaut p. Puisque la precision est fixée, maximiser le F1-score revient à maximiser le recall, et donc à minimiser le seuil. Le F1-score maximal d’un modèle non-informatif est donc atteint pour le seuil 0% et vaut alors $\frac{2p}{(p+1)}$ comme n’importe quel modèle.
  2. Lorsque le seuil de classification est élevé, q devient proche de 0%. Ce terme peut donc être négligé face à p et la courbe du F1-score se rapproche d’une droite : $F1-score \sim 2q$

 

Ainsi contrairement aux observations faites sur l’accuracy, le comportement du F1-score n’est pas symétrique selon que le seuil est faible ou élevé.

 

Calcul empirique du F1-score:

Traçons cette courbe à partir des données Telco et d’un modèle prédisant des probabilités aléatoirement selon une loi uniforme :

Figure 6. Courbe F1-score d’un modèle non-informatif.
Graphe Droite : en rouge l’évolution du F1-score sur les données, et en pointillés bleus la courbe théorique.

La valeur maximale du F1-score d’un modèle non-informatif étant égale à $\frac{2p}{p+1}$, cette valeur peut être considérée comme une baseline du F1-score.

 

 

Conclusion

Le F1-score est une métrique de classification qui mesure la capacité d’un modèle à bien prédire les individus positifs, tant en termes de precision (taux de prédictions positives correctes) qu’en termes de recall (taux de positifs correctement prédits). Il correspond en effet à la moyenne harmonique de ces indicateurs, qui doivent tous deux être élevés pour que le F1-score le soit aussi.

 

Le F1-score s’inscrit dans la famille des Fbeta-scores, qui introduisent une pondération de la precision par rapport au recall, et permettent de s’adapter à des situations spécifiques où l’un des deux indicateurs est privilégié.

 

Pour un modèle parfait, le F1-score maximal est de 100% lorsque le seuil est optimal. Pour un modèle non-informatif il vaut 2p/(p+1), où p est le taux de positifs dans les données.

 

Enfin, le F1-score a en commun avec l’accuracy de résumer la performance d’un modèle en un seul indicateur pour chaque seuil de classification. Il est plus complexe mais a l’avantage d’être robuste en présence de données déséquilibrées.

 

Pour explorer d’autres métriques de classification, consultez les articles de cette série.

Références :

  1. « sklearn.metrics.f1_score », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.f1_score.html
  2. « sklearn.metrics.fbeta_score », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.fbeta_score.html
  3. « Telco Customer Churn ». https://kaggle.com/blastchar/telco-customer-churn

Crédit image : Amanda ☻rtiz – Dribbble

Sommaire

Voir aussi

Voir aussi

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.