Каждый раз, когда кто-то говорит «наша модель показывает 95% accuracy», опытный ML-инженер настораживается. Потому что accuracy — это обманчивая метрика. Она не учитывает дисбаланс классов, стоимость ошибок и то, что модель, которая всегда говорит «нет» — уже «95% точная» при 5% положительных примеров.
Я работаю Data Scientist-ом, и ROC AUC — это первое, на что смотрю при оценке любой новой модели. Неважно, кредитный скоринг это или детектор аномалий на транзакциях: открываю отчёт, вижу AUC — и уже понимаю, стоит ли читать дальше.
Есть одна метрика, которая решает почти все эти проблемы. Которую используют в банковском скоринге, медицинской диагностике, fraud detection, рекомендательных системах и на каждом втором Kaggle-соревновании.
Шкала качества AUC ROC
Эта шкала — практическое соглашение, описанное в руководстве University of Nebraska Medical Center по ROC-анализу. В разных областях пороги могут отличаться: в медицинской диагностике AUC > 0.90 часто считается минимальным приемлемым, тогда как в рекомендательных системах 0.75 уже хорошо.
Зачем вообще ROC AUC?
Допустим, мы решаем задачу бинарной классификации: есть два класса — 0 и 1. Модель не выдаёт жёсткий ответ «да/нет». Она выдаёт оценку (score) — число от 0 до 1. Чем выше оценка, тем увереннее модель, что объект принадлежит классу 1.
Проблема: какой порог выбрать? Если порог 0.5 — одни ошибки. Если 0.3 — другие. Если 0.7 — третьи.
ROC AUC решает эту проблему радикально: она оценивает качество модели при всех возможных порогах одновременно. Не нужно выбирать порог — AUC показывает, насколько хорошо модель упорядочивает объекты двух классов. Именно поэтому Google ML Crash Course называет AUC одной из наиболее полезных метрик в бинарной классификации.
Как строится ROC-кривая
Разберём на конкретном примере. Пусть модель выдала оценки для 7 объектов:
| Оценка модели | Истинный класс | |
|---|---|---|
| A | 0.95 | 1 |
| B | 0.87 | 1 |
| C | 0.68 | 0 |
| D | 0.55 | 1 |
| E | 0.43 | 0 |
| F | 0.38 | 0 |
| G | 0.12 | 0 |
Объекты уже отсортированы по убыванию оценки. В идеале столбец «класс» тоже будет упорядочен: сначала все 1, потом все 0. Именно этот алгоритм реализует функция sklearn.metrics.roc_curve.
Алгоритм построения
Для нашего примера путь: up up right up right right right — это и есть ROC-кривая.
Построение ROC-кривой по шагам
Смысл и формулы
Главная интерпретация AUC ROC, которую важно запомнить — она напрямую связана со статистикой Уилкоксона–Манна–Уитни:
AUC ROC = вероятность того, что случайный объект класса 1 получит оценку выше, чем случайный объект класса 0.
Эта интерпретация описана в работе Hanley & McNeil (1982) — одной из первых, формализовавших применение ROC-анализа в медицине. Формально:
где суммирование идёт по всем парам ( из класса 1, из класса 0), — число объектов класса 1, — число объектов класса 0, — оценка модели, — индикаторная функция. Именно так реализован roc_auc_score в scikit-learn.
Визуализация всех пар
Каждая ячейка — пара (объект класса 1, объект класса 0). Зелёная = правильный порядок. Красная = ошибка.
Порог и бинаризация
ROC-кривая строится в пространстве FPR (ось X) vs TPR (ось Y). Каждая точка кривой — это результат при конкретном пороге бинаризации. Подробнее об этих метриках — в документации scikit-learn по ROC-метрикам.
Вернёмся к нашему примеру. Выберем порог 0.5 — объекты с оценкой > 0.5 относим к классу 1.
| Score | Истинный | Предсказанный | Результат | |
|---|---|---|---|---|
| A | 0.95 | 1 | 1 | TP |
| B | 0.87 | 1 | 1 | TP |
| C | 0.68 | 0 | 1 | FP |
| D | 0.55 | 1 | 1 | TP |
| E | 0.43 | 0 | 0 | TN |
| F | 0.38 | 0 | 0 | TN |
| G | 0.12 | 0 | 0 | TN |
Как меняется точка на ROC-кривой при разных порогах
| Порог | TP | FP | TN | FN | TPR | FPR | Точка (FPR, TPR) |
|---|---|---|---|---|---|---|---|
| 1.0 | 0 | 0 | 4 | 3 | 0.00 | 0.00 | (0, 0) |
| 0.90 | 1 | 0 | 4 | 2 | 0.33 | 0.00 | (0, 0.33) |
| 0.80 | 2 | 0 | 4 | 1 | 0.67 | 0.00 | (0, 0.67) |
| 0.60 | 2 | 1 | 3 | 1 | 0.67 | 0.25 | (0.25, 0.67) |
| 0.50 | 3 | 1 | 3 | 0 | 1.00 | 0.25 | (0.25, 1.0) |
| 0.40 | 3 | 2 | 2 | 0 | 1.00 | 0.50 | (0.5, 1.0) |
| 0.10 | 3 | 4 | 0 | 0 | 1.00 | 1.00 | (1, 1) |
Гини, свойства и ограничения
Связь AUC и коэффициента Gini доказана теоретически и описана в Engelmann et al. (2003) — Measures of a Rating's Discriminative Power. Именно поэтому банковские риск-менеджеры свободно используют оба термина как синонимы.
| Gini | Интерпретация | |
|---|---|---|
| 1.0 | 1.0 | Идеальная модель |
| 0.833 | 0.666 | Наша модельная задача |
| 0.79 | 0.58 | Наш дискретный пример |
| 0.5 | 0.0 | Случайное угадывание |
| 0.0 | -1.0 | Инвертированная модель |
В банковском скоринге Gini используют чаще, чем AUC. Но это та же самая метрика, просто масштабированная.
Когда AUC не подходит
| Ситуация | Проблема | Что использовать вместо |
|---|---|---|
| Задача поиска / информационный поиск | AUC учитывает ВСЮ кривую, а в поиске важна только верхняя часть ранжирования (первые 10-100 результатов) | Precision@K, MAP, NDCG, AUC@K |
| Разная стоимость ошибок | FP и FN имеют одинаковый вес в AUC. В медицине пропустить рак (FN) дороже ложной тревоги (FP) | Weighted loss, Cost-sensitive metrics, PR AUC |
| Калибровка вероятностей | AUC не проверяет, что score = 0.7 действительно означает 70% вероятность | Brier score, Log loss, Calibration curve |
| Мультикласс (>2 класса) | ROC AUC определена для бинарной классификации. Для мультикласса нужны обобщения | Macro/Micro AUC, OvR AUC, OvO AUC |
| Выборка из одного класса | ROC-кривая не определена. Большинство реализаций выдадут ошибку | Нет — нужны объекты обоих классов |
AUC на практике
В банковском скоринге AUC ROC (и её производная — Gini) является стандартом отрасли согласно руководствам EBA по кредитному риску. Но есть нюансы.
Когда я строю скоринговые модели, первое, что смотрю после обучения — AUC на отложенной выборке. Если AUC < 0.70, модель не идёт в production вне зависимости от других метрик. Это личное правило, выработанное после нескольких болезненных запусков.
Банк может выдать ограниченное число кредитов. Значит, главное требование — чтобы среди объектов с самыми низкими оценками риска были только «хорошие» заёмщики (класс 0 = вернёт кредит).
AUC показывает общее качество ранжирования. Но банку важна не вся кривая, а её нижняя левая часть — поведение модели на объектах с самыми низкими score. Поэтому в скоринге часто дополнительно смотрят на:
| Зачем | |
|---|---|
| Gini | Та же AUC, но в привычном банковском масштабе |
| KS-статистика | Максимальное расстояние между CDF классов |
| Lift@10% | Насколько топ-10% по score лучше случайного |
| AR (Accuracy Ratio) | = Gini (другое название) |
AUC vs другие метрики
Детальное сравнение метрик с примерами кода — Precision-Recall vs ROC в scikit-learn. Правила выбора описаны в руководстве Machine Learning Mastery.
| Метрика | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| AUC ROC | Общая оценка ранжирования | Инвариантна к балансу и порогу | Не учитывает стоимость ошибок |
| AUC PR | Сильный дисбаланс, важен recall | Чувствительна к FP при малом числе положительных | Зависит от баланса классов |
| Log Loss | Нужна калибровка вероятностей | Дифференцируемая, оптимизируемая | Чувствительна к выбросам |
| F1-score | Нужен конкретный порог | Баланс precision и recall | Зависит от порога |
| Accuracy | Баланс классов, равная стоимость ошибок | Простая и понятная | Бесполезна при дисбалансе |
Итого
Главный вывод: AUC ROC — это не просто «ещё одна метрика». Это фундаментальный способ оценить, насколько хорошо модель понимает разницу между классами. Если ваша модель не может ранжировать — она ничего не может. Я убеждался в этом снова и снова на production-моделях.
Источники и дополнительные материалы
- scikit-learn — roc_auc_score: документация и параметры
- scikit-learn — roc_curve: построение кривой
- Google ML Crash Course — ROC and AUC
- Hanley & McNeil (1982) — The meaning and use of the area under a ROC curve (Radiology)
- Hand & Till (2001) — A Simple Generalisation of AUC to Multi-class (JMLR)
- Saito & Rehmsmeier (2015) — The Precision-Recall Plot Is More Informative than the ROC Plot (PLOS ONE)
- Kaggle — AUC-ROC Curves (практический ноутбук)