Article

ROC AUC всему голова: главная метрика ранжирования

Площадь под ROC-кривой — один из самых популярных функционалов качества в бинарной классификации. Полный разбор: от интуиции до формул, от построения кривой до ловушек на практике.

MLМетрикиData ScienceАналитика10 мин
Мадияр Хамзанов
Мадияр Хамзанов
21 марта 2026

Каждый раз, когда кто-то говорит «наша модель показывает 95% accuracy», опытный ML-инженер настораживается. Потому что accuracy — это обманчивая метрика. Она не учитывает дисбаланс классов, стоимость ошибок и то, что модель, которая всегда говорит «нет» — уже «95% точная» при 5% положительных примеров.

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

Есть одна метрика, которая решает почти все эти проблемы. Которую используют в банковском скоринге, медицинской диагностике, fraud detection, рекомендательных системах и на каждом втором Kaggle-соревновании.

AUC ROC (Area Under the Receiver Operating Characteristic curve) — площадь под кривой ошибок. Значение от 0 до 1. Чем ближе к 1 — тем лучше модель отделяет классы друг от друга. 0.5 — случайное угадывание. Ниже 0.5 — модель работает «наоборот».

Шкала качества AUC ROC

0.0 - 0.50.5 - 0.60.6 - 0.80.8 - 0.90.9 - 1.0
БесполезнаяСлабаяНормальнаяХорошаяОтличная
0.5
Случайная модель
бесполезная
0.7-0.8
Нормальная модель
рабочий уровень
0.8-0.9
Хорошая модель
production-ready
0.95+
Отличная модель
state-of-the-art

Эта шкала — практическое соглашение, описанное в руководстве 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 — третьи.

Проблема порога бинаризации
Модель
Выдаёт score [0, 1]
Порог?
0.3? 0.5? 0.7?
Класс 0 / 1
Жёсткое решение
Ошибки
FP и FN зависят от порога

ROC AUC решает эту проблему радикально: она оценивает качество модели при всех возможных порогах одновременно. Не нужно выбирать порог — AUC показывает, насколько хорошо модель упорядочивает объекты двух классов. Именно поэтому Google ML Crash Course называет AUC одной из наиболее полезных метрик в бинарной классификации.

Как строится ROC-кривая

Разберём на конкретном примере. Пусть модель выдала оценки для 7 объектов:

Оценка моделиИстинный класс
A0.951
B0.871
C0.680
D0.551
E0.430
F0.380
G0.120

Объекты уже отсортированы по убыванию оценки. В идеале столбец «класс» тоже будет упорядочен: сначала все 1, потом все 0. Именно этот алгоритм реализует функция sklearn.metrics.roc_curve.

Ключевая идея: Берём единичный квадрат. Разбиваем по горизонтали на n частей (число нулей = 4), по вертикали на m частей (число единиц = 3). Идём сверху вниз по таблице: видим 1 — шаг вверх, видим 0 — шаг вправо. Получаем ROC-кривую.

Алгоритм построения

Шаг 1
Отсортировать
Упорядочить объекты по убыванию score модели. Лучшие — сверху.
Шаг 2
Нарисовать сетку
m x n блоков. m = количество единиц (3), n = количество нулей (4). Старт из (0,0).
Шаг 3
Пройти сверху вниз
Класс = 1 -> шаг вверх. Класс = 0 -> шаг вправо. Финиш в (1,1).
Шаг 4
Посчитать площадь
Площадь под получившейся кривой = AUC ROC. В нашем примере: 9.5/12 = 0.79
Шаг 5
Интерпретировать
0.79 — модель правильно упорядочивает 79% пар (объект класса 1, объект класса 0)
Шаг 6
Сравнить с baseline
Диагональ = 0.5 (случайный). Верхний угол = 1.0 (идеальный). Наш 0.79 — хорошо!

Для нашего примера путь: up up right up right right right — это и есть ROC-кривая.

9.5/12
Площадь под кривой
= AUC ROC
0.79
AUC ROC
хорошая модель

Построение ROC-кривой по шагам

A(1)
B(1)
C(0)
D(1)
E(0)
F(0)
G(0)
1=step UP|0=step RIGHT|Path: UP UP RIGHT UP RIGHT RIGHT RIGHT

Смысл и формулы

Главная интерпретация AUC ROC, которую важно запомнить — она напрямую связана со статистикой Уилкоксона–Манна–Уитни:

AUC ROC = вероятность того, что случайный объект класса 1 получит оценку выше, чем случайный объект класса 0.
Wilcoxon-Mann-Whitney statistic, Статистическая интерпретация

Эта интерпретация описана в работе Hanley & McNeil (1982) — одной из первых, формализовавших применение ROC-анализа в медицине. Формально:

Формула AUC (Wilcoxon-Mann-Whitney)
AUC=1mni=1mj=1n[I(s(x1(i))>s(x0(j)))+12I(s(x1(i))=s(x0(j)))]AUC = \frac{1}{m \cdot n} \sum_{i=1}^{m} \sum_{j=1}^{n} \left[ \mathbb{I}\big(s(x_1^{(i)}) > s(x_0^{(j)})\big) + \frac{1}{2} \cdot \mathbb{I}\big(s(x_1^{(i)}) = s(x_0^{(j)})\big) \right]

где суммирование идёт по всем парам (x1x_1 из класса 1, x0x_0 из класса 0), mm — число объектов класса 1, nn — число объектов класса 0, s()s(\cdot) — оценка модели, I()\mathbb{I}(\cdot) — индикаторная функция. Именно так реализован roc_auc_score в scikit-learn.

Частая ошибка: В формуле нередко упускают случай равенства ответов модели. Если два объекта получили одинаковый score — это пол-ошибки, а не целая. Отсюда коэффициент 0.5 в формуле.

Визуализация всех пар

Каждая ячейка — пара (объект класса 1, объект класса 0). Зелёная = правильный порядок. Красная = ошибка.

+
+
+
+
+
+
+
+
-
+
+
+
Строки: A, B, D (класс 1)|Столбцы: C, E, F, G (класс 0)|11 из 12 пар верно|AUC=11+0.50120.79AUC = \frac{11 + 0.5 \cdot 0}{12} \approx 0.79

Порог и бинаризация

ROC-кривая строится в пространстве FPR (ось X) vs TPR (ось Y). Каждая точка кривой — это результат при конкретном пороге бинаризации. Подробнее об этих метриках — в документации scikit-learn по ROC-метрикам.

True Positive Rate (Sensitivity)
TPR=TPTP+FNTPR = \frac{TP}{TP + FN}
False Positive Rate (1 - Specificity)
FPR=FPFP+TNFPR = \frac{FP}{FP + TN}

Вернёмся к нашему примеру. Выберем порог 0.5 — объекты с оценкой > 0.5 относим к классу 1.

ScoreИстинныйПредсказанныйРезультат
A0.9511TP
B0.8711TP
C0.6801FP
D0.5511TP
E0.4300TN
F0.3800TN
G0.1200TN
3
True Positive
из 3 возможных
1
False Positive
из 4 нулей
3
True Negative
из 4 нулей
0
False Negative
все единицы найдены
TPR=TPTP+FN=33=1.0TPR = \frac{TP}{TP + FN} = \frac{3}{3} = 1.0FPR=FPFP+TN=14=0.25FPR = \frac{FP}{FP + TN} = \frac{1}{4} = 0.25Точка на ROC-кривой: (0.25, 1.0)

Как меняется точка на ROC-кривой при разных порогах

ПорогTPFPTNFNTPRFPRТочка (FPR, TPR)
1.000430.000.00(0, 0)
0.9010420.330.00(0, 0.33)
0.8020410.670.00(0, 0.67)
0.6021310.670.25(0.25, 0.67)
0.5031301.000.25(0.25, 1.0)
0.4032201.000.50(0.5, 1.0)
0.1034001.001.00(1, 1)

Гини, свойства и ограничения

Связь AUC и Gini
AUC ROC
Площадь под кривой [0, 1]
x2 - 1
Линейное преобразование
Gini
Коэффициент Джини [-1, +1]
Связь Gini и AUC
Gini=2AUCROC1Gini = 2 \cdot AUC_{ROC} - 1

Связь AUC и коэффициента Gini доказана теоретически и описана в Engelmann et al. (2003) — Measures of a Rating's Discriminative Power. Именно поэтому банковские риск-менеджеры свободно используют оба термина как синонимы.

GiniИнтерпретация
1.01.0Идеальная модель
0.8330.666Наша модельная задача
0.790.58Наш дискретный пример
0.50.0Случайное угадывание
0.0-1.0Инвертированная модель
В банковском скоринге Gini используют чаще, чем AUC. Но это та же самая метрика, просто масштабированная.
Банковская практика, Credit Risk
Ключевые свойства AUC: инвариантна к монотонным преобразованиям score (важен только порядок), не зависит от баланса классов, не требует выбора порога. Это метрика ранжирования, а не классификации. Подробнее о свойствах — scikit-learn: ROC-метрики.

Когда 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 = вернёт кредит).

Скоринг в банке
Заявка
Клиент просит кредит
Модель
Score риска невозврата
Ранжирование
Сортировка по score
Отсечка
Топ-N получают кредит
Profit?
Только если AUC высокий

AUC показывает общее качество ранжирования. Но банку важна не вся кривая, а её нижняя левая часть — поведение модели на объектах с самыми низкими score. Поэтому в скоринге часто дополнительно смотрят на:

Зачем
GiniТа же AUC, но в привычном банковском масштабе
KS-статистикаМаксимальное расстояние между CDF классов
Lift@10%Насколько топ-10% по score лучше случайного
AR (Accuracy Ratio)= Gini (другое название)
Размер выборки важен: на 50 объектах AUC может гулять на +/-0.15. Минимум для production — 1000+ объектов (разброс +/-0.03). Для надёжной оценки нужно 5000+. Это подтверждает статистическая теория ROC-анализа.

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 — золотой стандарт
Используется в банках, медицине, fraud detection, рекомендательных системах и на Kaggle. Если не знаете, какую метрику выбрать — берите AUC.
Смысл: качество ранжирования
AUC — это вероятность правильного упорядочивания случайной пары. Не классификация, а ранжирование. Это фундаментально другая задача.
Не панацея
AUC не подходит для задач поиска (используйте Precision@K), для калибровки (используйте Log Loss) и когда стоимость FP != стоимость FN.
Нужна большая выборка
На 100 объектах AUC будет гулять как пьяный матрос. Минимум 1000+, лучше 5000+ объектов для стабильной оценки.
Главный вывод: AUC ROC — это не просто «ещё одна метрика». Это фундаментальный способ оценить, насколько хорошо модель понимает разницу между классами. Если ваша модель не может ранжировать — она ничего не может. Я убеждался в этом снова и снова на production-моделях.
Автор, Data Scientist
Мадияр Хамзанов
Мадияр Хамзанов
mkhamzanov.com

Все статьи

Блог
AI — алый океан: продай меня, если сможешь23 мар. 2025 г.
SaaS — это новая Tilda: почему строить стартап в 2026 бессмысленно23 мар. 2026 г.
Парадокс автоматизации: почему ИИ заставляет нас работать больше23 мар. 2026 г.
Как llms.txt увеличил трафик с AI-чатов на 23%23 мар. 2026 г.
География определяет профессию: почему в Казахстане все дороги ведут в банк23 мар. 2026 г.
AI Adoption в разработке: США vs Казахстан и Россия23 мар. 2026 г.
AI для продаж: пузырь Whisper-обёрток или реальный бизнес?23 мар. 2026 г.
Пока ты спишь — агенты должны работать23 мар. 2026 г.
Где железо, Зина? Суперкомпьютер Казахстана и 512 GPU, которые никто не видел22 мар. 2026 г.
Не говори кто ты. Покажи свой usage в Claude Code.21 мар. 2026 г.
Дай мне свой GitHub — и я скажу, кто ты21 мар. 2026 г.
AI в казахстанских банках: инновации или театр для президента?21 мар. 2026 г.
Почему Казахстан никогда не создаст свою LLM21 мар. 2026 г.
Казахстанские стартапы 2020-х: почему модель «фаундер-звезда + кодер-лох» сдохла21 мар. 2026 г.
Рынок чат-ботов: пузырь домохозяек или реальный бизнес?21 мар. 2026 г.
Код стоит $200 в месяц. Разработчик — нет.21 мар. 2026 г.
Солопренёрство × AI: красивая иллюзия или новый дотком-пузырь?21 мар. 2026 г.
Claude Code + Telegram: как управлять AI-агентом с телефона21 мар. 2026 г.
Феномен вайбкодинга: почему Маргулан Сейсембаев создаёт продукты без программистов21 мар. 2026 г.
Казахстанский венчур: $2.6 млрд мечтаний и одна реальность21 мар. 2026 г.
Kaspi Жұма 2026: Когда, как подготовиться и стоит ли участвовать?14 февр. 2026 г.
Юнит-экономика для Kaspi-селлера: окупится ли твой товар?14 февр. 2026 г.
Как Machine Learning превращает отзывы в рыночные данные13 февр. 2026 г.
Ценовая сегментация: зачем делить ниши на 5 сегментов13 февр. 2026 г.
Индекс Джини и Парето: Почему один забирает всё?13 февр. 2026 г.