Первое, что нужно понять, это то, что анализ ROC не заботится о точных значениях ваших данных. Вместо этого он смотрит на ранжирование по точкам данных и на то, как ранги разделяются.
Во-вторых, как уже упоминалось в комментарии выше, голоса за классы 0 и 1 суммируются до 1 в каждом наблюдении. Это означает, что с точки зрения ранжирования они эквивалентны (по модулю направления сортировки).
Последняя часть головоломки состоит в том, что pROC не предполагает, что вы предоставляете предиктор как вероятность принадлежать к положительному классу. Вместо этого вы можете передать любой вид оценки, и направление сравнения определяется автоматически. Это делается по умолчанию в автоматическом режиме, но вы можете увидеть, что происходит, установив флаг quiet
на FALSE
:
> pROC::roc(obese, votes_1, quiet = FALSE)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> pROC::roc(obese, votes_2, quiet = FALSE)
Setting levels: control = 0, case = 1
Setting direction: controls > cases
Обратите внимание, как в случае votes_2
он обнаружил, что отрицательный класс имел более высокие значения (на основе медианы), и соответственно установил направление сравнения.
Если это не то, что вам нужно, вы всегда можете установить уровни класса и параметры направления явно:
> pROC::roc(obese, votes_2, levels = c(0, 1), direction = "<")
Это приведет к «обратной» кривой, показывающей, как votes_2
работает хуже, чем случайный, при обнаружении положительного класса с более высокими значениями.