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