Je n'arrive pas à comprendre pourquoi la fonction Sklearn roc_auc_score renvoie 1 dans le cas suivant:

y_true = [0, 0, 1, 0, 0, 0, 0, 1]

y_scores = [0.18101096153259277, 0.15506085753440857, 
            0.9940806031227112, 0.05024950951337814, 
            0.7381414771080017, 0.8922111988067627, 
            0.8253260850906372, 0.9967281818389893]

roc_auc_score(y_true,y_scores)

Les trois scores 0.7381414771080017, 0.8922111988067627, 0.8253260850906372 à la fin ne correspondent pas aux libellés 0, 0, 0. Alors, comment l'ASC peut-elle être 1? Qu'est-ce que je me trompe ici?

2
Dr. John 9 mars 2019 à 18:11

2 réponses

Meilleure réponse

La courbe auc de ROC mesure simplement la capacité de votre modèle à classer les points de données par rapport à votre classe positive.

Dans votre exemple, le score de la classe positive est toujours supérieur aux points de données de classe négatifs. Par conséquent, le auc_roc_score de 1 est correct.

pd.DataFrame({'y_true':y_true,'y_scores':y_scores}).sort_values('y_scores',ascending=False)

    y_scores    y_true
7   0.996728    1
2   0.994081    1
5   0.892211    0
6   0.825326    0
4   0.738141    0
0   0.181011    0
1   0.155061    0
3   0.050250    0
2
Venkatachalam 9 mars 2019 à 17:28

Si vous regardez le ROC lui-même, il est plus facile de comprendre pourquoi:

> roc_curve(y_true, y_scores)

(array([0., 0., 0., 1.]),
 array([0. , 0.5, 1. , 1. ]),
 array([1.99672818, 0.99672818, 0.9940806 , 0.05024951]))

La première valeur dans le tuple renvoyé est le FPR, la seconde est le TPR et la troisième est le seuil où la valeur change.

Pour un seuil de 0,99672818, le FPR est en effet 0,5, et non 0, ce qui vous ferait penser que l'ASC du ROC n'est pas 0. Cependant, les points FPR / TPR ne sont que les lignes 0, 0 -> 0, 1 -> 1, 1, et la zone en dessous est bien 1.

2
Ami Tavory 9 mars 2019 à 18:13