Да чего там делать пост, берешь sklearn, делаешь импорт из metrics и погнал. Чем ближе к 1, тем лучше => выбираем. Но давайте разбираться более детальною.
❓ ROC-AUC — это вероятность того, что наши положительные классы получили больший скор, чем отрицательные.
🔽 Пример: предположим, у нас есть следующая таблица.
| object | score value | y |
|--------|-------------|---|
| A | 0.92 | 1 |
| B | 0.81 | 1 |
| C | 0.74 | 0 |
| D | 0.63 | 1 |
| E | 0.41 | 0 |
| F | 0.27 | 0 |
| G | 0.18 | 0 |
| H | 0.05 | 1 |
✏️ Для каждого порога (в таблице значения) в отсортированной по скору таблице вычислим по строкам значения:
Для 1 строки считаем какие объекты попадают в score >= 0.92 — это один положительный класс. Среди всех положительных (4) => TPR = 1/4. При этом мы рассмотрели только один объект положительного класса => FPR = 0.
Для 2 строки считаем уже два объекта A, B. Это оба положительных класса. Среди всех положительных (4) => TPR = 2/4 = 1/2. Пока что объектов с классом 0 не попалось.
Для 3 строки считаем уже три объекта A, B, C. Смотрим на объект со скором >= 0.74. TPR по-прежнему = 1/2, а вот FPR увеличился, так как залетел новый объект с меткой 0. Среди всех отрицательных классов (4) => FPR = 1/4.
Далее считаем TPR, FPR для каждой из строк (Сколько объектов мы отнесли к положительному классу из всех возможных объектов класса).
По сути, мы отвечаем на вопрос: В скольких случаях скор, полученный по модели для положительных классов выше, чем для отрицательных.
Графически это выглядит как ступеньки (по оси X — FPR, по оси Y — TPR). При движении по трешхолдам для отнесения к классам смотрим как меняются значения TPR и FPR, кстати еще есть значения трешхолдов в самой библиотеке sklearn.
🧠 Чтобы посчитать вручную само значение:
Нужно взять все сочетания положительных и негативных классов и сравнить в каких случаях выше. Для нашего случая это:
1. A > C, A > E, A > F, A > G (пол.)
2. B > C, B > E, B > F, B > G (пол.)
3. C > D, C > H (нег.)
4. D > E, D > F, D > G (пол.)
5. E > H (нег.)
6. F > H (нег.)
6. G > H (нег.).
Считаем количество всех сочетаний: 16
Считаем количество правильных среди положительных: 11
ROC-AUC = 11/16 = 0.6875
✋ Ограничения в ML
1. Не учитывает цену ошибок (FP = FN по важности)
2. Не даёт порог для принятия решения
3. Ломается при сильном дисбалансе
4. Игнорирует калибровку вероятностей
5. Одно число скрывает локальные ошибки
🐍 Как можно применять для аналитики
1. Если есть модель и мы хотим определить есть ли сигнал в данных (ROC-AUC > 0.5). То есть позволяют ли наши признаки сделать модель такую, чтобы она была лучше случайности.
2. Понять, какие фичи улучшают разделение между TP и FP. Например, при добавлении фичи ROC-AUC увеличился => появился новый сигнал.
3. Проверка эвристики против модели. Оправдано ли применение ML-модели в принципе или достаточно эвристику.
4. Сравнение сегментов / источников сигнала. Задача: понять, где модель работает.
5. Оценка классификации по неделям. Понимаем, что ROC-AUC по неделям деградирует => нужно добавить больше признаков для обобщения.
6. Сравнение разных таргетов. Один таргет лучше отделяется => он более предсказуем и устойчив
Если коротко: ROC-AUC отвечает на вопрос есть ли сигнал, а не как принимать решение
Понравился пост? Ставьте 🐳, пишите комментарии!
@zasql_python
