Sensitivity, Specificity et ROC curve

La sensitivity et la specificity sont deux métriques essentielles en classification, du fait de leur complémentarité et car elles forment le socle de la courbe ROC. Comment les calcule-t-on et que veulent-elles dire exactement? Faisons le point.
Sensitivity Specificity - Strength sensitivity
Sommaire

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

Sensitivity et Specificity, qu’est-ce que c’est ?

La sensibilité (sensitivity en anglais) et la spécificité (specificity) sont deux métriques pour évaluer la performance des modèles de classification à 2 classes ou plus. Ces métriques sont basées sur la matrice de confusion, détaillée dans le deuxième article de cette série. Pour rappel, la matrice de confusion est composée de 4 valeurs :

Sensitivity Specificity - Matrice de confusion

Figure 1. Matrice de confusion

La sensitivity et la specificity sont deux métriques complémentaires qui résument la performance du modèle en prenant en compte l’ensemble des composantes de la matrice de confusion :

  • La sensitivity est le taux d’individus positifs correctement prédits par le modèle : \begin{equation*} \frac{TP}{TP+FN} \end{equation*}

    Elle mesure la capacité du modèle à détecter l’ensemble des individus positifs. On la trouve aussi sous le nom de rappel (recall), taux de vrais positifs (True Positive Rate, TPR) ou encore taux de détection (hit rate). Le terme “taux de détection” est celui qui traduit le mieux la signification de cette métrique.

  • La specificity est le taux d’individus négatifs correctement prédits par le modèle : \begin{equation*} \frac{TN}{TN+FP} \end{equation*}

    Elle mesure la capacité du modèle à détecter l’ensemble des individus négatifs. On la trouve aussi sous le nom de sélectivité (selectivity) ou taux de vrais négatifs (True Negative Rate, TNR).

La figure ci-dessous permet de bien visualiser ces indicateurs :

Sensitivity Specificity - Sensitivity specificity explanation

Figure 2. Sensitivity et specificity ([1], source modifiée).
La sensitivity répond à la question : combien d’individus positifs sont prédits correctement ? La specificity répond à la question : combien d’individus négatifs sont prédits correctement ?

Prenons le cas d’un diagnostic de grossesse pour mieux comprendre à quoi correspondent ces valeurs :

Sensitivity Specificity - Sensitivity specificity pregnancy example

Figure 3. Sensitivity et Specificity appliquées au diagnostic de grossesse. Adapté de 2 photos de National Cancer Institute sur Unsplash.

Pour chaque patient, 4 cas affectent la sensitivity et la specificity de façon indépendante :

  • Vrai positif : la sensitivity augmente.

    Le médecin prédit que la patiente est enceinte, ce qui est vrai. La sensitivity augmente car il a détecté une femme enceinte de plus.

  • Faux négatif : la sensitivity diminue.

    Le médecin prédit que la patiente n’est pas enceinte alors qu’elle l’est. La sensitivity diminue car il n’a pas fait de prédiction positive alors qu’il en fallait une.

  • Vrai négatif : la specificity augmente.

    Le médecin prédit que la patiente n’est pas enceinte, ce qui est vrai. La specificity augmente car il a détecté une femme non enceinte de plus.

  • Faux positif : la specificity diminue.

    Le médecin prédit que la patiente est enceinte alors qu’elle ne l’est pas. La specificity diminue car il a fait une prédiction positive alors qu’il ne fallait pas.

Qu’est-ce que cela signifie en pratique?

  • Si le médecin a une sensitivity élevée, alors on peut avoir confiance dans le fait qu’il annoncera une patiente enceinte si elle l’est.
  • Si le médecin a une specificity élevée, alors on peut avoir confiance dans le fait qu’il annoncera une patiente non-enceinte si elle n’est pas enceinte.

Et par contraposée :

  • Si le médecin a une sensitivity élevée, alors on peut le croire lorsqu’il annonce que la patiente n’est pas enceinte (puisqu’il la déclarerait enceinte si elle l’était).
  • Si le médecin a une specificity élevée, alors on peut le croire lorsqu’il annonce que la patiente est enceinte (puisqu’il la déclarerait non-enceinte si elle ne l’était pas).

Attention à ne pas confondre specificity et precision. Si une specificity égale à 1 est équivalente à une précision égale à 1 (specificity = 1 $\Leftrightarrow$ FP = 0 $\Leftrightarrow$ precision = 1), hors de ce cas particulier les deux indicateurs ont un comportement et une signification différente. En outre, la précision intègre le déséquilibre de classes, et pas la specificity.

Les sensitivity et specificity d’un modèle pour différents seuils de classification peuvent être calculées grâce à la fonction de scikit-learn : sklearn.metrics.roc_curve [2].

Sensitivity, Specificity et courbe ROC, un exemple simple

Comment calcule-t-on la precision et le recall à partir des prédictions d’un modèle ? Faisons le calcul à la main sur un petit nombre d’individus.

Sensitivity et Specificity 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 à la réalité, on construit la matrice de confusion afin d’évaluer la qualité des prédictions issues du modèle. La matrice de confusion est ensuite utilisée pour calculer la sensitivity et la specificity.

Sensitivity Specificity - Calcul prediction reality

Figure 4. Calcul de la Sensitivity et de la Specificity pour le diagnostic de grossesse. Ici avec un seuil de classification à 30%.

Pour un même modèle, on obtient plusieurs matrices de confusion en fonction du choix du seuil de classification. On obtient donc aussi différents scores de sensitivity et de specificity. 

Courbe ROC / ROC curve

La “courbe ROC” vient de l’anglais ROC pour Receiver Operating Characteristic, ou fonction d’efficacité du récepteur en français. Elle trace l’ensemble des valeurs du couple (1-Specificity, Sensitivity) selon le seuil de classification.

Le terme 1-Specificity est aussi appelé False Positive Rate (FPR) :

\begin{equation*} 1 – \text{Specificity} = 1 – \frac{TN}{TN+FP} = \frac{FP}{TN+FP} = \text{False Positive Rate} \end{equation*}

Le False Positive Rate indique le taux d’individus négatifs mal prédits.

Rappelons que la Sensitivity est également appelée True Positive Rate. La courbe ROC peut donc avoir des axes (x, y) nommés (1-Specificity, Sensitivity) ou (False Positive Rate, True Positive Rate) selon les cas, ce qui signifie exactement la même chose. Mais le terme de False Positive Rate est peu clair et il nous semble préférable de retenir la formule 1 – Specificity.

L’animation suivante montre les valeurs de sensitivity et de specificity obtenues en augmentant progressivement le seuil de classification. On trace ainsi la courbe ROC :

Figure 5. Sensitivity, Specificity & ROC curve
La courbe ROC peut aussi être présentée avec les légendes False Positive Rate (FPR) et True Positive Rate (TPR).

Lorsque le seuil augmente, la sensitivity diminue et la specificity augmente. La courbe ROC résume ce trade-off entre sensitivity et specificity.

Attardons-nous sur les deux cas limites de la specificity et de la sensitivity dans la vidéo ci-dessus :

  • Si l’on veut maximiser la sensitivity, on peut fixer le seuil de classification à 20 %. La sensitivity est alors de 100% : toutes les femmes réellement enceintes ont été détectées par le modèle. Mais qu’en est-il de la specificity ? Parmi les 4 patientes qui ne sont pas enceintes, seulement 2 sont prédites comme n’étant pas enceintes : la specificity vaut seulement 50%.
  • Si l’on veut maximiser la specificity, on peut fixer le seuil de classification à 90%. La specificity est alors de 100% : les 4 femmes qui ne sont pas enceintes ont été correctement prédites par le modèle. Mais qu’en est-il de la sensitivity ? Parmi les 3 femmes réellement enceintes, le modèle n’en a détecté qu’une seule : la sensitivity vaut seulement 33%.

Un compromis doit donc être fait entre l’optimisation de la sensitivity et l’optimisation de la specificity. C’est pour cette raison que ces deux métriques sont étudiées conjointement dans l’évaluation d’un modèle. Pour en faire la synthèse, d’autres métriques sont fréquemment utilisées, comme l’AUC ROC et l’Accuracy.

Courbe ROC sur données réelles

Appliquons à présent le calcul de la sensitivity et de la specificity à de vraies données. Pour cela, nous allons utiliser 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 fictive 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

Sous Python, traçons la courbe ROC sur nos données, à partir du modèle xgboost entraîné (code disponible dans le premier article) :

				
					import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
 
fpr_array, tpr_array, threshold_array = roc_curve(
    y_true=y_test, y_score=probas_pred
)
plt.plot(fpr_array, tpr_array)
plt.show()
				
			

Sous R il existe de nombreux packages permettant de calculer la courbe ROC. On peut utiliser par exemple la fonction performance() de ROCR, la fonction roc() de pROC, ou encore roc.curve() de PRROC.

En examinant cette courbe point par point, on observe qu’à chaque seuil de classification choisi, la matrice de confusion et les valeurs de la sensitivity et de la specificity évoluent :

Figure 6. Courbe ROC 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 ROC et courbe d’évolution de la sensitivity et de la specificity en fonction du seuil de classification utilisé.

On confirme à la lecture de la vidéo l’intuition obtenue dans un exemple précédent : si l’on augmente la sensitivity alors globalement la specificity diminue. Plus on accroît le seuil, plus les positifs prédits sont certains et donc le modèle devient de plus en plus spécifique dans la reconnaissance des positifs (la specificity augmente). Mais comme on prédit moins de positifs, on diminue la sensitivity. A l’inverse, si l’on diminue le seuil de classification alors il y aura plus de prédictions positives le modèle devient de plus en plus sensible dans la reconnaissance des positifs (la sensitivity augmente). Mais les prédictions positives contiennent plus d’individus négatifs et donc la specificity diminue.

Quel couple Sensitivity-Specificity privilégier ? Choix du classification threshold

Le trade-off Sensitivity-Specificity est observable sur tous les modèles de classification à partir du moment où ils n’arrivent pas à parfaitement séparer les observations positives des négatives.

Dans notre cas d’un modèle de prédiction des résiliations, imaginons que les clients qui sont prédits positifs se voient proposer une réduction de tarif. On peut alors schématiquement envisager deux stratégies opposées :

  • Stratégie “ne pas perdre de clients” : on veut détecter la majorité des clients en partance. On choisit donc une sensitivity élevée, quitte à être peu précis et proposer des réductions de tarif à des clients qui n’allaient pas partir.
  • Stratégie “ne pas perdre de marges” : on veut éviter de proposer des réductions de tarif à des clients qui n’avaient pas l’intention de résilier, ce qui génère une perte de marge. On cherche donc à avoir un nombre de faux positifs faibles, ce qui coïncide avec une Specificity élevée. Mais notons que la precision est un meilleur indicateur pour mener cette stratégie, car on cherche à être précis sur les prédictions de résiliations, là où la specificity traduit le taux de non-résiliations correctement prédites.

ROC curves d’un modèle parfait et d’un modèle non-informatif

ROC curve d’un 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. Traçons sa courbe ROC :

Dans ce modèle, on voit que l’on peut maximiser à la fois la sensitivity et la specificity lorsque le seuil est choisi entre les négatifs et les positifs. Notre modèle prédit alors parfaitement chaque point. Pour un seuil plus faible, on perd en specificity car on génère des faux positifs, et pour un seuil plus élevé on perd en sensitivity car on génère des faux négatifs. 

Le modèle parfait a donc une sensitivity maximale pour n’importe quelle valeur de specificity et une specificity maximale pour n’importe quelle valeur de sensitivity.

ROC curve d’un 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. Calculons sa courbe ROC en théorie et en pratique.

Calcul théorique de la courbe ROC :

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 les formules de la sensitivity et de la specificity :

Sensitivity Specificity - Confusion matrix calcul ROC baseline

Figure 8. Sensitivity et Specificity 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.

Les formules obtenues sont valables pour tout modèle non-informatif.  Notons que sensitivity et specificity ne dépendent pas du taux de positifs dans les données, mais uniquement du taux de prédictions positives.

Calcul empirique de la courbe ROC :

Validons notre raisonnement théorique sur des données empiriques. Nous reprenons les données Telco et attribuons à chaque client une probabilité aléatoire (loi uniforme) entre 0 et 1. Voici le résultat :

Nous obtenons une droite y=x, ce qui est conforme aux formules théoriques obtenues puisque $Sensitivity = q = 1 – (1-q) = 1 – Specificity$.

Conclusion

Sensitivity et Specificity sont deux métriques importantes en classification car elles résument le trade-off entre deux objectifs rivaux : être exhaustif dans son ciblage des positifs ou être exhaustif dans son ciblage des négatifs.

Selon le seuil de classification retenu, on peut optimiser la sensitivity ou la specificity, mais pas les deux à la fois. Seul un modèle parfait y parvient.

Pour évaluer globalement la performance d’un modèle à partir de ces indicateurs, on calcule l’aire sous la courbe ROC, nommée AUC ROC. Le prochain article de cette série y est consacré.

Références :

  1. FeanDoe, English:  Sensitivity and specificity. 2018. [En ligne]. Disponible sur: https://commons.wikimedia.org/wiki/File:Sensitivity_and_specificity_1.01.svg
  2. « sklearn.metrics.roc_curve », scikit-learn. https://scikit-learn/stable/modules/generated/sklearn.metrics.roc_curve.html
  3. « Telco Customer Churn ». https://kaggle.com/blastchar/telco-customer-churn

Crédit image : Magdalena Koscianska – Dribbble

Sommaire

Voir aussi

Voir aussi

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *