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. Il est particulièrement utilisé 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*}
L’é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*}
Résumons :
- 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.
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 :
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érents F1-scores.
Courbe du F1-score
L’animation suivante montre les valeurs de F1-score obtenues pour les mêmes probabilités issues du modèle mais avec différents seuils de classification :
Figure 2. Courbe F1-score
A travers cet exemple simple, on obtient une courbe très bruitée. On observe quand même 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 du F1-score à de vraies données. Pour cela, nous utilisons le jeu de données Telco Customer Churn [1]. 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). Le F1-score et le F\beta-score peuvent être calculés grâce aux fonctions de scikit-learn : sklearn.metrics.f1_score [2] et sklearn.metrics.fbeta_score [3].
En utilisant les labels obtenus par la méthode predict du modèle, on calcule son F1-score :
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 sur l’ensemble des seuils de classification possibles :
# 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. Dans le cas du F1-score, nous observons une courbe en cloche. Pour 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’à 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.
Examinons les deux seuils limites :
- 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.
On peut appréhender intuitivement le F1-score d’un modèle parfait. Selon le seuil de classification utilisé, 3 cas sont possibles :
- 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.
- Seuil optimal (séparation parfaite des deux classes) : on ne se trompe ni sur les positifs ni sur les négatifs : le F1-score est maximal (100%) et constant.
- 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.
Traçons cette courbe à partir des données Telco et d’un modèle parfait :
Figure 4. Courbe F1-score d’un modèle parfait.
On observe bien les trois phases que nous venons de décrire théoriquement.
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 :
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 :
- 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)}$.
- 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 à l’accuracy, le 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.
- 2 jours
- 950€
- 2 jours
- 1 200€
Références :
- « Telco Customer Churn ». https://kaggle.com/blastchar/telco-customer-churn
- « sklearn.metrics.f1_score », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.f1_score.html
- « sklearn.metrics.fbeta_score », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.fbeta_score.html
Crédit image : Amanda ☻rtiz – Dribbble