#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. Большое спасибо за подробное объяснение. !