Площадь под кривой ROC с использованием Sklearn? - PullRequest
2 голосов
/ 09 марта 2019

Я не могу понять, почему функция Sklearn roc_auc_score возвращает 1 в следующем случае:

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)

Три результата 0.7381414771080017, 0.8922111988067627, 0.8253260850906372 в конце не соответствуютэтикетки 0, 0, 0.Итак, как AUC может быть 1?Что я тут не так делаю?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Если вы посмотрите на сам ROC, легче понять, почему:

> 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]))

Первое значение в возвращаемом кортеже - это FPR, второе - это TPR, а третье - это пороговые значения.где значение меняется.

Для порога 0,99672818 FPR действительно равен 0,5, а не 0, что заставит вас думать, что AUC ROC не равно 0. Однако точки FPR / TPR - это просто линии 0, 0 -> 0, 1 -> 1, 1, и область под ним действительно равна 1.

2 голосов
/ 09 марта 2019

Кривая auc of ROC просто измеряет способность вашей модели ранжировать порядок точек данных относительно вашего положительного класса.

В вашем примере оценка положительного класса всегда больше, чем точки данных отрицательного класса. Следовательно, auc_roc_score 1 является правильным.

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
...