Путаница в методе roc_auc_score sklearn

Я никогда не заходил так далеко, чтобы получить оценки ROC-AUC. Я просто использую это как должное. Но недавно я взялся за пересмотр метрик и нашел, что эта метрика сбивает с толку.

Предполагая случай бинарной классификации и цитируя документацию:

y_score : подобная массиву форма (n_samples) или (n_samples, n_classes)

Целевые баллы. В бинарном и мультиметочном случаях это может быть либо оценки вероятности или непороговые значения решения (как возвращаются по decision_function на некоторых классификаторах).

Я обнаружил, что у этой метрики может быть два «определения»… Здесь фиктивный пример говорит, что наш положительный класс равен 1, отрицательный — 0.

y_true: Наземные метки правды 6 входов.

y_preds: Вероятность предсказания (сигмоид/softmax) входных данных положительна (класс 1).

y_preds_labels: Предполагая, что порог $T=0,5$, мы можем применить прогнозы np.argmax сигмоид/softmax в y_preds, чтобы получить его.

Я был потрясен, обнаружив, что roc_1 дает 0,3888888888888889, а roc_2 дает 0,5. Можно было бы подумать, что 0,5 — это правильный ответ, не так ли, поскольку модель имеет максимальное количество истинных срабатываний и ложных срабатываний... Теперь, какой из них мне следует использовать...?

y_true = [0,0,1,1,0,1]
y_preds = [0.3, 0.3, 0.1, 0.3, 0.1, 0.2]
y_pred_labels = [0,0,0,0,0,0]
roc_1 = roc_auc_score(y_true, y_preds)
roc_2 = roc_auc_score(y_true, y_pred_labels)

Обновлено: с объяснением я понимаю, что roc_2 неверно. Однако, когда я попробовал следующее, оценка дает другое значение, хотя технически «прогнозы» одинаковы. Итак, теперь я понимаю, что ROC — это показатель ранжирования, но я понял, что в Интернете мало производных/симуляций для этого (большинство статей объясняют идею точности/отзыва/чувствительности и связывают ее с TPR, FPR. Я хотел бы иметь более подробное объяснение того, почему y_preds_3 дает мне совершенно другую оценку ROC-AUC, чем y_preds.

y_true = [0,0,1,1,0,1]
y_preds_3 = [0.3,0.4,0.2,0.4,0.1,0.3]
roc_3 = roc_auc_score(y_true, y_preds_3)

Этот пост здесь дает мне некоторую интуицию, но я надеюсь, что кто-то может связать/объяснить мне более детальный пример.

добавив здесь комментарий относительно вашего редактирования: я считаю, что причина, по которой некоторые пользователи проголосовали за ваш вопрос, заключается в заголовке вашего вопроса и паре предложений в вашем описании. Это довольно сильное заявление, чтобы написать, что вы сделали «шокирующее открытие» о такой признанной библиотеке ML, как scikitlearn. Однако я считаю, что ваш вопрос, лишенный этого «эмоционального» компонента, имеет отношение к пониманию roc auc. Короче говоря, отрицательные голоса, вероятно, касаются стиля вашего вопроса, а не содержания самого поста. Лучший

MaximeKan 13.12.2020 14:01

@MaximeKan Спасибо, с тех пор я отредактировал свой заголовок. Я думаю, что это действительно заблуждение. Я также включил еще одну путаницу после вашего ответа. Дайте мне знать, если вы можете помочь с этим, или направьте меня к отличному источнику, чтобы я мог лучше понять эту метрику. Спасибо

ilovewt 13.12.2020 15:04

Обратите внимание, что расширение и обновление вопросов после предоставления ответа - это не то, как работает SO; предпочитаю вместо этого открыть новый вопрос (ссылка здесь, если необходимо). Кроме того, это не вопрос программирования, поэтому здесь он, возможно, не по теме — обратите внимание на вступление и ПРИМЕЧАНИЕ в информации тега machine-learning .

desertnaut 14.12.2020 02:12

@desertnaut Отмечено, будет ли этот вопрос более подходящим для перекрестной проверки или статистики?

ilovewt 14.12.2020 02:17

Это тот же SE ;) Официально называется Cross Validated, неофициально (и в URL) называется Stats SE (я вижу, у вас уже есть недавний соответствующий вопрос). ИМХО самое подходящее место.

desertnaut 14.12.2020 02:21

Я голосую за то, чтобы закрыть этот вопрос, потому что речь идет не о программировании, как это определено в справочном центре , а о теории и/или методологии машинного обучения — см. вступление и ПРИМЕЧАНИЕ в информации тега machine-learning.

desertnaut 14.12.2020 02:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
661
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы рассчитать показатель ROC AUC, вам нужны оценки вероятности (как указано в документации, которую вы цитируете). Вас может смутить термин «непороговые значения решения», но он не описывает прогнозируемые метки (скорее функции принятия решений, подобные тем, которые вы можете найти в классификации опорных векторов (SVC, где прогнозируемые вероятности недоступны).

Итак, в вашем примере roc_1 правильно, а roc_2 нет.

Другие вопросы по теме