Область под ROC-кривой с использованием Sklearn?

#python #scikit-learn #roc #auc

#python #scikit-учиться #ОКР #auc

Вопрос:

Я не могу понять, почему 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? Что я здесь не так понимаю?

Ответ №1:

auc кривой 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
  

Ответ №2:

Если вы посмотрите на сам 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.

Комментарии:

1. Большое спасибо за подробное объяснение. !