🔴 Сложный ⏱️ 45 минут

ROC-кривая и AUC

📋 Содержание урока

ROC-кривая и AUC

В прошлом уроке ты научился считать accuracy, precision, recall и F1-score — и наверняка уже столкнулся с неприятным вопросом: а откуда вообще берётся разбиение предсказаний на классы 0 и 1? Модель классификации почти никогда не выдаёт прямо метку класса — она выдаёт вероятность, число от 0 до 1, которое показывает, насколько модель уверена, что перед ней положительный пример. Превращение этой вероятности в жёсткий вердикт «да» или «нет» требует порога: если вероятность выше порога — объект помечается как положительный, если ниже — как отрицательный. По умолчанию почти все библиотеки, включая sklearn, используют порог 0.5, и большинство новичков никогда не задумываются, что этот порог — не физическая константа, а произвольное решение, которое можно и нужно менять.

Проблема в том, что precision и recall, которые ты считал в прошлом уроке, зависят от выбранного порога — причём зависят сильно. Подними порог до 0.9, и модель станет придирчивой: она будет помечать объект как положительный только при почти полной уверенности, precision вырастет, а recall упадёт, потому что часть реальных положительных случаев модель упустит из-за излишней осторожности. Опусти порог до 0.1, и произойдёт обратное: модель станет разбрасываться положительными предсказаниями направо и налево, recall взлетит почти до максимума, а precision обрушится, потому что среди всех предсказанных «да» будет полно ложных срабатываний. Получается, что одна и та же модель, с одним и тем же набором вероятностей на выходе, может выглядеть то отличной, то посредственной — просто в зависимости от того, какой порог ты выбрал для перевода вероятностей в классы. Если ты сравниваешь precision и recall двух разных моделей при пороге 0.5, ты сравниваешь не качество моделей как таковых, а качество моделей именно при этом одном произвольном пороге — и одна модель вполне может обходить другую при пороге 0.3, проигрывая при пороге 0.7.

Именно эту проблему решает ROC-кривая. Вместо того чтобы зафиксировать один порог и посчитать метрики только для него, ROC-кривая перебирает вообще все возможные пороги от 0 до 1 и для каждого считает пару чисел — долю верно найденных положительных примеров и долю ошибочно принятых за положительные отрицательных примеров. Результат — это не одно число и даже не таблица, а кривая на графике, которая показывает, как ведёт себя модель на любом мыслимом пороге сразу, единым взглядом. А у этой кривой есть числовая характеристика — площадь под ней, AUC (Area Under Curve), — которая суммирует качество модели по всем порогам в одно-единственное число, удобное для сравнения моделей друг с другом.

В этом уроке ты разберёшь, что такое TPR и FPR и как из перебора порогов рождается ROC-кривая, как выглядят кривые идеальной и случайной моделей и почему это задаёт систему координат для оценки любой реальной модели, что такое AUC и почему у него есть красивая вероятностная интерпретация, а также — что особенно важно для практики — в какой ситуации ROC-AUC начинает вводить в заблуждение и какая метрика приходит на смену в этом случае. Ты увидишь, как sklearn.metrics.roc_auc_score и roc_curve становятся твоим повседневным инструментом при сравнении нескольких моделей друг с другом и при подборе оптимального порога под конкретную бизнес-задачу — будь то максимизация прибыли или минимизация риска пропустить что-то важное.

История

Аббревиатура ROC расшифровывается как Receiver Operating Characteristic — «рабочая характеристика приёмника», и это название выдаёт происхождение метода с головой: он родился не в статистике и не в машинном обучении, а в радиолокации времён Второй мировой войны. К началу 1940-х годов радар стал критически важной технологией обороны — станции слежения на побережье должны были как можно раньше обнаруживать приближающиеся вражеские самолёты. Но радарный сигнал — вещь зашумлённая: отражённый импульс от настоящего самолёта по амплитуде и форме мог быть очень похож на случайный шум, помехи от облаков, стаи птиц или просто электронные наводки в самом приёмнике. Оператору радара приходилось решать: вот этот всплеск на экране — это самолёт противника или просто шум? И решение это принималось не по абсолютной уверенности, а по превышению некоторого порога интенсивности сигнала.

Именно здесь и возникла ключевая инженерная дилемма, знакомая тебе уже по вступлению этого урока. Если поставить порог обнаружения слишком низким, радар будет реагировать почти на любой всплеск — он поймает действительно все настоящие самолёты (высокий TPR, тогда ещё не названный этим словом), но будет постоянно поднимать ложную тревогу по птицам и помехам (высокий FPR). Если поставить порог слишком высоким, ложных тревог станет мало, но радар рискует пропустить настоящую атаку, среагировав только на самые сильные, однозначные сигналы. Инженеры и физики, работавшие над теорией обнаружения сигналов на фоне шума — среди них стоит отметить исследования, объединявшиеся под общим названием «теория обнаружения сигналов» (signal detection theory), разрабатывавшуюся, в частности, группами при Лаборатории Белла и в рамках военных радиолокационных исследований — предложили не выбирать один порог раз и навсегда, а построить график: по одной оси отложить долю верно распознанных целей при данном пороге, по другой — долю ложных тревог. Этот график и назвали «рабочей характеристикой приёмника» — характеристикой того, как конкретное радарное оборудование (приёмник) ведёт себя в диапазоне всех возможных порогов чувствительности.

После войны эта идея не осела архивным курьёзом, а перекочевала в другие области, где стоит та же самая задача: отличить сигнал от шума при неопределённом пороге. В 1950–60-х годах ROC-анализ стал стандартным инструментом психофизики — науки о восприятии, где исследователи изучали, как люди распознают слабые сигналы (звук, свет, прикосновение) на фоне шума, и объясняли индивидуальные различия испытуемых именно разным выбором внутреннего порога чувствительности, а не разной остротой восприятия как таковой. Позже ROC-кривые прочно закрепились в медицинской диагностике — там, где нужно понять, насколько хорошо диагностический тест отличает больных пациентов от здоровых при любом возможном пороговом значении показателя анализа, — и именно из медицинской статистики метод перешёл в статистическое машинное обучение второй половины XX века, а оттуда — в стандартный арсенал специалиста по data science, где сегодня roc_curve и roc_auc_score вызываются едва ли не в каждом втором проекте бинарной классификации.

TPR и FPR: строим ROC-кривую при переборе порогов

Интуиция

Возьми confusion matrix из прошлого урока и посмотри на неё под новым углом. Тебя больше не интересует одно число вроде accuracy — тебя интересуют два конкретных отношения, каждое из которых считается внутри одного истинного класса, а не по всей выборке сразу. Первое — какую долю всех реально положительных примеров модель нашла; это в точности recall из прошлого урока, только здесь для него принято другое имя — True Positive Rate (TPR). Второе — какую долю всех реально отрицательных примеров модель по ошибке приняла за положительные; это новая для тебя метрика — False Positive Rate (FPR), и у неё нет аналога среди метрик прошлого урока. TPR отвечает на вопрос «как много целей мы поймали?», а FPR — на вопрос «как много ложных тревог мы подняли?» — это буквально те же два вопроса, которые задавал себе оператор радара из раздела «История».

Теперь ключевая идея: TPR и FPR — это не пара чисел, привязанных к одному-единственному порогу. Для одной и той же модели с одним и тем же набором предсказанных вероятностей ты можешь вычислить свою пару (TPR, FPR) для порога 0.1, свою пару — для порога 0.5, свою — для порога 0.9, и так для любого порога между 0 и 1. Если отметить каждую такую пару точкой на графике, где по горизонтальной оси отложен FPR, а по вертикальной — TPR, и соединить все точки по мере убывания порога от 1 до 0, получится ломаная линия — и это и есть ROC-кривая. Она не оценивает модель при одном конкретном пороге — она показывает, как ведёт себя модель вообще на любом пороге, который ты можешь захотеть выбрать.

Формальное определение

True Positive Rate (TPR) и False Positive Rate (FPR) при заданном пороге $\tau$ определяются через confusion matrix, построенную при этом пороге:

$$\text{TPR}(\tau) = \frac{TP(\tau)}{TP(\tau) + FN(\tau)} = \frac{TP(\tau)}{P}$$

$$\text{FPR}(\tau) = \frac{FP(\tau)}{FP(\tau) + TN(\tau)} = \frac{FP(\tau)}{N}$$

где $P$ — общее число реально положительных примеров в выборке, $N$ — общее число реально отрицательных примеров. Обрати внимание: TPR — это в точности recall (полнота) из прошлого урока, только считается по всем реально положительным объектам, а не по предсказанным. FPR же делит число ложных срабатываний не на число предсказанных положительными объектов (как это делает $1-\text{precision}$), а на общее число реально отрицательных объектов $N$ — это принципиально другое основание дроби.

ROC-кривая — это график зависимости $\text{TPR}(\tau)$ от $\text{FPR}(\tau)$, построенный при переборе порога $\tau$ по всем значениям от $1$ (самый строгий порог, при котором почти ничего не предсказывается положительным) до $0$ (самый мягкий порог, при котором всё предсказывается положительным).

Практически, чтобы построить ROC-кривую вручную, не нужно перебирать порог непрерывно — достаточно перебрать все различные значения предсказанных вероятностей в выборке, потому что confusion matrix и, соответственно, TPR и FPR меняются только в тот момент, когда порог пересекает одно из этих значений.

Примеры

Пример 1: сквозной набор данных, который ты будешь использовать весь урок. Возьми модель диагностики некоторого заболевания, протестированную на 10 пациентах — 5 реально больных и 5 реально здоровых. Модель выдала следующие вероятности:

Пациент Реальный класс Вероятность модели
P1 1 (болен) 0.95
P2 1 (болен) 0.85
P3 1 (болен) 0.78
P4 0 (здоров) 0.70
P5 1 (болен) 0.66
P6 0 (здоров) 0.55
P7 1 (болен) 0.50
P8 0 (здоров) 0.45
P9 0 (здоров) 0.40
P10 0 (здоров) 0.20

Отсортируем пациентов по убыванию вероятности и будем последовательно «опускать» порог, каждый раз пересчитывая TPR и FPR по формулам выше ($P=5$, $N=5$):

Порог Кто предсказан положительным TP FP TPR FPR
выше 0.95 никто 0 0 0.0 0.0
0.95 P1 1 0 0.2 0.0
0.85 P1, P2 2 0 0.4 0.0
0.78 P1, P2, P3 3 0 0.6 0.0
0.70 + P4 3 1 0.6 0.2
0.66 + P5 4 1 0.8 0.2
0.55 + P6 4 2 0.8 0.4
0.50 + P7 5 2 1.0 0.4
0.45 + P8 5 3 1.0 0.6
0.40 + P9 5 4 1.0 0.8
0.20 и ниже все 5 5 1.0 1.0

Одиннадцать точек $(\text{FPR}, \text{TPR})$ — от $(0, 0)$ до $(1, 1)$ — и есть ROC-кривая этой модели. Обрати внимание, что при очень строгих порогах (0.95–0.78) модель безошибочно находит первых трёх больных, ни разу не ошибаясь на здоровых, — кривая круто идёт вверх вдоль левого края графика. А вот на пороге 0.70 в игру внезапно вступает здоровый пациент P4 с довольно высокой вероятностью 0.70 — это первая ложная тревога модели, и кривая делает шаг вправо.

Пример 2: один и тот же порог 0.5, две совершенно разные точки TPR/FPR. Если бы ты, как в прошлом уроке, ограничился одним стандартным порогом 0.5, ты бы получил для этой модели ровно одну точку — TPR = 1.0, FPR = 0.4 (посмотри строку таблицы для порога 0.50). Ты бы сделал вывод: модель находит всех больных, но каждый второй здоровый пациент из тех, кого поставили в категорию «здоровых с высоким риском», на самом деле ошибочно принят за больного при чуть более мягком пороге. Но эта одна точка ничего не говорит тебе о том, что происходит, скажем, при пороге 0.75, где FPR падает до нуля ценой того, что TPR опускается до 0.6. ROC-кривая показывает тебе весь этот спектр компромиссов сразу, а не одну случайно выбранную точку на нём.

Пример 3: как порог превращается в конкретное клиническое решение. Представь, что эта модель — часть системы, определяющей, кого направить на дорогое и не самое приятное дополнительное обследование. Если система работает в стране с ограниченным числом аппаратов для этого обследования, врачи заинтересованы в высоком пороге — скажем, 0.78 — чтобы направлять только тех, у кого модель почти уверена (тогда TPR = 0.6, FPR = 0.0 — ни одного лишнего здорового пациента не потревожат, но 40% реально больных при этом пропустят). Если же речь о скрининге смертельно опасного заболевания, где цена пропущенного случая несравнимо выше цены лишнего обследования, разумно выбрать низкий порог — скажем, 0.40 — чтобы TPR был максимально близок к 1.0, даже ценой FPR = 0.8. Ни один из этих порогов не «правильный» и не «неправильный» сам по себе — правильный выбор зависит от того, что дороже: пропустить больного или напрасно обследовать здорового. ROC-кривая — это карта всех доступных вариантов этого выбора, а не готовый ответ.

Почему это важно

TPR и FPR разрывают жёсткую привязку оценки модели к одному произвольному порогу — и в этом их принципиальное отличие от precision и accuracy из прошлого урока, которые без явного указания порога попросту не определены. Когда ты в реальном проекте выбираешь порог классификации, ты почти никогда не выбираешь его один раз и навсегда в вакууме — ты выбираешь его исходя из конкретной бизнес-цены ошибок каждого типа, и эта цена может со временем меняться: сегодня дорога ложная тревога, завтра — пропущенный случай. Модель, обученная один раз, при этом не переобучается заново — просто порог, применяемый к её вероятностям на выходе, двигается в одну или другую сторону. Понимание TPR и FPR как функций порога, а не фиксированных чисел, — это первый шаг к тому, чтобы вообще осмысленно говорить о ROC-кривой и AUC, к которым ты перейдёшь в следующих разделах.

Идеальная модель, случайная модель и геометрия ROC-кривой

Интуиция

У ROC-кривой есть удобное свойство: прежде чем оценивать реальную, «среднюю» модель, полезно понять, как выглядят два крайних случая — модель, которая работает идеально, и модель, которая ничего не умеет и просто гадает. Эти две кривые задают систему координат: идеальная модель показывает, к чему нужно стремиться, случайная — от чего нужно отталкиваться, и любая реальная модель на практике окажется где-то между этими двумя ориентирами.

Идеальная модель — та, которая присваивает всем реально положительным объектам более высокие вероятности, чем всем реально отрицательным, без единого исключения. У такой модели существует порог, разделяющий два класса абсолютно чисто: выше этого порога — только положительные объекты, ниже — только отрицательные. Случайная же модель — та, у которой вероятность вообще никак не связана с истинным классом объекта: положительные и отрицательные объекты получают вероятности из одного и того же распределения, просто перемешанные вслепую, как если бы модель подбрасывала монетку вместо того, чтобы анализировать признаки.

Формальное определение

Идеальная модель. Если существует порог $\tau^*$ такой, что при $\tau = \tau^*$ выполняется $\text{TPR} = 1$ и $\text{FPR} = 0$ одновременно, модель называется идеальным классификатором на данной выборке. Её ROC-кривая проходит через точку $(0, 1)$ — верхний левый угол графика — и состоит из двух отрезков: вертикального отрезка от $(0,0)$ до $(0,1)$ (модель безошибочно набирает всех положительных, ни разу не ошибившись на отрицательных, пока порог достаточно высок) и горизонтального отрезка от $(0,1)$ до $(1,1)$ (при дальнейшем снижении порога начинают попадаться отрицательные примеры, но TPR уже максимален и больше не меняется).

Случайная модель. Если предсказанная вероятность статистически не зависит от истинного класса объекта, то при любом пороге $\tau$ ожидаемое значение $\text{TPR}(\tau)$ равно ожидаемому значению $\text{FPR}(\tau)$: доля пойманных положительных примеров равна доле ошибочно пойманных отрицательных, потому что оба класса «просеиваются» одним и тем же случайным ситом. ROC-кривая случайной модели поэтому в среднем совпадает с диагональю $\text{TPR} = \text{FPR}$, идущей из $(0,0)$ в $(1,1)$.

Примеры

Пример 1: идеальная модель на модификации сквозного датасета. Возьми тот же набор из 10 пациентов, но представь, что модель оказалась настолько удачной, что все пять больных получили вероятности выше, чем все пять здоровых — скажем, больные: 0.95, 0.90, 0.85, 0.80, 0.75, здоровые: 0.40, 0.35, 0.30, 0.25, 0.10. Построй таблицу TPR/FPR так же, как в предыдущем разделе: при пороге 0.75 (и выше, вплоть до 0.95) TPR уже дошёл до 1.0 (все пять больных пойманы), а FPR всё ещё равен 0.0 (ни один здоровый ещё не превысил порог). Только когда порог опускается ниже 0.75 — то есть ниже самой маленькой вероятности среди больных, — в игру начинают вступать здоровые пациенты, и FPR начинает расти, но TPR к этому моменту уже не может вырасти, потому что все больные давно пойманы. Кривая идёт строго вверх вдоль левой границы графика, а затем строго вправо вдоль верхней — классический «уголок» идеальной модели.

Пример 2: случайная модель на числах. Представь модель, которая на самом деле никогда не смотрела на признаки пациента и просто присваивает случайную вероятность из равномерного распределения на $[0,1]$. При достаточно большой выборке (скажем, тысячи пациентов, а не десять) для любого порога $\tau$ доля больных с вероятностью выше $\tau$ будет примерно равна доле здоровых с вероятностью выше $\tau$ — просто потому, что вероятность никак не учитывает, болен пациент или нет. Например, при $\tau = 0.3$ примерно 70% пациентов любого класса получат вероятность выше порога (так как $1 - 0.3 = 0.7$ для равномерного распределения), а значит TPR ≈ 0.7 и FPR ≈ 0.7 одновременно — точка почти точно на диагонали. Проделав это для нескольких значений $\tau$, ты получишь несколько точек, лежащих (с поправкой на случайный шум малой выборки) практически на прямой линии $y = x$.

Пример 3: полуслучайная модель — где на самом деле оказывается большинство реальных моделей. В реальных задачах модель почти никогда не бывает ни идеальной, ни полностью случайной — она обладает частичной информацией о классе. Возьми исходный сквозной пример из предыдущего раздела: его ROC-кривая (точки из таблицы) идёт заметно выше диагонали на всём протяжении — например, при FPR = 0.2 модель уже достигает TPR = 0.8, тогда как случайная модель на этом же FPR дала бы TPR ≈ 0.2. Кривая при этом не дотягивает до идеального «уголка» — она не проходит строго через $(0,1)$, потому что здоровый пациент P4 с вероятностью 0.70 вклинивается между больными пациентами по рангу вероятности раньше, чем модель успевает поймать всех пятерых больных. Форма кривой — насколько сильно она выгибается к левому верхнему углу — и есть визуальное отражение того, насколько хорошо модель разделяет классы.

Почему это важно

Диагональ случайной модели — это не просто теоретическая абстракция, а единственный осмысленный ноль отсчёта для качества классификатора. Модель, ROC-кривая которой лежит на диагонали или ниже неё, не просто плохая — она бесполезна: она не даёт никакой информации о классе объекта сверх той, что была бы получена случайным гаданием (а кривая ниже диагонали и вовсе означает, что модель систематически путает классы местами, и её предсказания стоит просто инвертировать). Чем сильнее ROC-кривая выгибается к верхнему левому углу — тем дальше модель от случайного гадания и тем ближе к идеальному разделению классов. Это геометрическое понимание напрямую готовит тебя к следующему шагу — превращению формы этой кривой в одно число, AUC, которое ты будешь использовать для сравнения моделей на практике.

AUC и его вероятностная интерпретация

Интуиция

ROC-кривая — это отличная визуализация, но сравнивать две кривые на глаз, особенно когда они пересекаются в разных точках, неудобно и субъективно. Хочется одного числа, которое суммировало бы «насколько эта кривая близка к идеальному уголку и далека от диагонали». Таким числом оказывается площадь под ROC-кривой — AUC, Area Under Curve. Чем ближе кривая к идеальному уголку (и чем больше площадь под ней), тем выше AUC; чем ближе кривая к диагонали, тем ближе AUC к 0.5.

У AUC есть ещё одна, куда менее очевидная интерпретация, которая на практике оказывается даже полезнее геометрической: AUC равен вероятности того, что случайно выбранный положительный пример получит от модели более высокий скор, чем случайно выбранный отрицательный пример. Это превращает абстрактную «площадь под кривой» в конкретный, понятный вероятностный вопрос: насколько хорошо модель в принципе умеет ранжировать объекты, ставя положительные выше отрицательных, вне всякой связи с каким-либо конкретным порогом.

Формальное определение

AUC (Area Under the ROC Curve) — это интеграл (для непрерывной кривой) или сумма площадей трапеций (при дискретном наборе точек, как в примерах этого урока) под ROC-кривой:

$$\text{AUC} = \int_0^1 \text{TPR}(\text{FPR})\, d(\text{FPR})$$

AUC принимает значения от 0 до 1. AUC = 1.0 соответствует идеальной модели (кривая проходит через $(0,1)$), AUC = 0.5 соответствует случайному гаданию (кривая совпадает с диагональю), AUC < 0.5 означает, что модель систематически инвертирует классы (хуже случайного гадания, но её предсказания легко исправить, поменяв метки местами).

Вероятностная интерпретация (эквивалентна статистике Манна — Уитни). Пусть $X^+$ — случайно выбранный скор модели для положительного примера, $X^-$ — случайно выбранный скор для отрицательного примера. Тогда

$$\text{AUC} = P(X^+ > X^-) + \tfrac{1}{2} P(X^+ = X^-)$$

На практике, при дискретной конечной выборке, эта вероятность оценивается напрямую: нужно перебрать все пары (один положительный пример, один отрицательный пример), посчитать, в какой доле пар скор положительного примера действительно выше скора отрицательного, добавить половину доли пар с равными скорами — и это и есть AUC.

Примеры

Пример 1: точный расчёт AUC через площадь трапеций на сквозном датасете. Возьми одиннадцать точек ROC-кривой из первого раздела, отсортированные по возрастанию FPR: $(0,0)$, $(0,0.2)$, $(0,0.4)$, $(0,0.6)$, $(0.2,0.6)$, $(0.2,0.8)$, $(0.4,0.8)$, $(0.4,1.0)$, $(0.6,1.0)$, $(0.8,1.0)$, $(1.0,1.0)$. Площадь под кривой считается суммой площадей трапеций между соседними точками — $\Delta(\text{FPR}) \cdot \frac{\text{TPR}_1 + \text{TPR}_2}{2}$. Переходы, где FPR не меняется (вертикальные участки), дают нулевую площадь. Ненулевые вклады дают только четыре перехода:

  • от $(0,0.6)$ к $(0.2,0.6)$: $0.2 \times \frac{0.6+0.6}{2} = 0.12$

  • от $(0.2,0.8)$ к $(0.4,0.8)$: $0.2 \times \frac{0.8+0.8}{2} = 0.16$

  • от $(0.4,1.0)$ к $(0.6,1.0)$: $0.2 \times \frac{1.0+1.0}{2} = 0.20$

  • от $(0.6,1.0)$ к $(0.8,1.0)$: $0.2 \times \frac{1.0+1.0}{2} = 0.20$

  • от $(0.8,1.0)$ к $(1.0,1.0)$: $0.2 \times \frac{1.0+1.0}{2} = 0.20$

Сумма: $0.12 + 0.16 + 0.20 + 0.20 + 0.20 = 0.88$. AUC этой модели равен 0.88.

Пример 2: та же самая цифра через вероятностную интерпретацию — подсчёт пар. Раздели скоры по истинному классу: положительные (больные) — 0.95, 0.85, 0.78, 0.66, 0.50; отрицательные (здоровые) — 0.70, 0.55, 0.45, 0.40, 0.20. Всего пар «один положительный, один отрицательный» — $5 \times 5 = 25$. Посчитай для каждого положительного скора, скольких отрицательных он превосходит: 0.95 превосходит все 5; 0.85 превосходит все 5; 0.78 превосходит все 5; 0.66 превосходит 4 из 5 (проигрывает только 0.70); 0.50 превосходит 3 из 5 (проигрывает 0.70 и 0.55). Сумма побед: $5+5+5+4+3 = 22$. AUC $= 22/25 = 0.88$ — то же самое число, что получилось методом трапеций, потому что это буквально два способа посчитать одну и ту же величину.

Пример 3: как AUC различает модели, которые accuracy при пороге 0.5 считает одинаковыми. Представь две модели, каждая из которых при стандартном пороге 0.5 даёт ровно одинаковую accuracy = 80% на одной и той же тестовой выборке из 100 объектов (50 положительных, 50 отрицательных). Модель A уверенно и корректно ранжирует объекты — её ошибки при пороге 0.5 сосредоточены у объектов с пограничными вероятностями около 0.45–0.55, и при переборе других порогов она показывает AUC = 0.90. Модель B, наоборот, делает те же 20% ошибок при пороге 0.5, но среди её ошибок попадаются откровенно уверенные промахи — отрицательные объекты с вероятностью 0.95 и положительные объекты с вероятностью 0.05, — из-за чего её AUC оказывается заметно ниже, скажем 0.75, несмотря на идентичную accuracy при одном конкретном пороге. Если бизнес-задача требует потом подвинуть порог (например, для более консервативного или более агрессивного режима работы), модель A даст куда более предсказуемое и качественное поведение при любом из этих альтернативных порогов — а accuracy при пороге 0.5 никак не предупредила бы тебя об этой разнице.

Почему это важно

AUC — это, пожалуй, самая часто используемая метрика на практике именно потому, что она отвечает ровно на тот вопрос, который специалисту по data science нужно задать в первую очередь: «насколько хорошо эта модель в принципе умеет отличать положительные примеры от отрицательных, вне зависимости от того, какой порог мы потом выберем?» Именно поэтому sklearn.metrics.roc_auc_score — стандартный инструмент для сравнения нескольких моделей друг с другом на этапе выбора алгоритма или подбора гиперпараметров: одно число на модель, не зависящее от произвольного выбора порога, легко сортировать и сравнивать. А уже после того как лучшая по AUC модель выбрана, отдельным шагом — как ты видел в примерах первого раздела — подбирается конкретный порог под конкретную бизнес-задачу, будь то максимизация прибыли, минимизация риска или баланс между ложными тревогами и пропущенными случаями.

Когда ROC-AUC вводит в заблуждение: дисбаланс классов и PR-кривая

Интуиция

У ROC-AUC есть слабое место, и оно связано ровно с тем, как устроена формула FPR. FPR делит число ложных срабатываний на общее число отрицательных примеров $N$ — и если $N$ огромен по сравнению с числом положительных примеров $P$ (типичная ситуация при сильном дисбалансе классов — мошенничество, редкие болезни, поломки оборудования), то даже очень маленькая на вид доля FPR соответствует огромному абсолютному числу ложных срабатываний. ROC-кривая при этом продолжает выглядеть привлекательно и близко к идеальному уголку, потому что она ничего не знает про абсолютные числа — а вот метрика precision, которая делит те же ложные срабатывания на общее число предсказанных положительными объектов (то есть в знаменателе оказываются как раз абсолютные числа), в этой ситуации может рухнуть катастрофически.

Именно на такой случай существует альтернатива — precision-recall curve (PR-кривая): график зависимости precision от recall при переборе тех же самых порогов. Поскольку precision напрямую чувствителен к дисбалансу классов (в отличие от FPR), PR-кривая честно показывает проблему там, где ROC-кривая её маскирует.

Формальное определение

Почему ROC-AUC инвариантен к дисбалансу классов. И TPR, и FPR считаются каждый внутри своего собственного истинного класса — TPR как доля от $P$, FPR как доля от $N$. Если искусственно увеличить число отрицательных примеров в выборке, не меняя вероятностей и не меняя соотношения скоров внутри классов, значения TPR и FPR при каждом пороге не изменятся (это доли внутри каждого класса, а не абсолютные числа), и, следовательно, ROC-кривая и AUC останутся прежними.

Почему Precision чувствителен к дисбалансу классов.

$$\text{Precision}(\tau) = \frac{TP(\tau)}{TP(\tau) + FP(\tau)}$$

В знаменателе стоит абсолютное число $FP(\tau) = \text{FPR}(\tau) \times N$ — оно прямо пропорционально $N$. При фиксированном FPR и растущем $N$ абсолютное число ложных срабатываний $FP$ растёт линейно, и precision при том же самом TP неизбежно падает. Именно поэтому precision (а значит, и PR-кривая) реагирует на дисбаланс классов там, где ROC-кривая остаётся безучастной.

Примеры

Пример 1: детекция мошеннических транзакций — числовой расчёт. Пусть банк проверяет 10 000 транзакций, из которых 100 действительно мошеннические (1% — типичный порядок дисбаланса для такой задачи), а 9900 легитимные. При выбранном пороге модель показывает TPR = 0.90 (нашла 90 из 100 мошеннических операций) и FPR = 0.05 (пять процентов). На первый взгляд это отличная точка на ROC-кривой — она совсем рядом с верхним левым углом. Но пересчитай FPR в абсолютные числа: $FPR \times N = 0.05 \times 9900 = 495$ ложных срабатываний. Тогда precision $= TP / (TP + FP) = 90 / (90 + 495) = 90/585 \approx 0.154$ — из каждых семи транзакций, которые модель пометила как мошеннические, лишь одна оказывается настоящим мошенничеством, а остальные шесть — ложные тревоги, требующие ручной проверки службой безопасности. ROC-AUC для такой модели вполне может оказаться высоким, скажем 0.95, и это будет объективно правдивая оценка способности модели ранжировать транзакции — но она ничего не скажет тебе о том, что в абсолютных числах поток ложных тревог окажется неприемлемо большим для команды, которая должна их разбирать вручную.

Пример 2: та же модель, PR-кривая против ROC-кривой. Для той же точки — TPR = 0.90, precision ≈ 0.154 — построй, что покажет каждая из двух кривых. Точка на ROC-кривой $(\text{FPR}=0.05, \text{TPR}=0.90)$ визуально находится очень близко к идеальному углу $(0,1)$ — глазами всё выглядит прекрасно. Соответствующая точка на PR-кривой $(\text{Recall}=0.90, \text{Precision}\approx0.154)$ находится в нижней правой части графика precision-recall — далеко от идеального угла $(1,1)$ этого графика, и любой человек, смотрящий на эту точку, сразу увидит проблему: чтобы поймать 90% мошенничеств, приходится мириться с точностью чуть больше 15%. Это ровно тот случай, когда одна и та же модель и одна и та же точка выбранного порога выглядят «отлично» на одном графике и «тревожно» на другом — и происходит это исключительно из-за того, как по-разному precision и FPR реагируют на сильный дисбаланс классов.

Пример 3: почему точка отсчёта на PR-кривой сама зависит от баланса классов. У ROC-кривой случайная модель всегда даёт диагональ независимо от того, сбалансированы классы или нет, — это удобный универсальный ориентир. У PR-кривой такого универсального ориентира нет: случайная модель на PR-графике даёт горизонтальную линию на уровне $\text{Precision} = P/(P+N)$ — то есть на уровне общей доли положительных примеров в выборке. При сбалансированных классах (50% положительных) эта линия проходит на уровне 0.5, а при упомянутом дисбалансе 1% мошеннических транзакций она проходит на уровне 0.01 — и модель с precision 0.154 из примера выше, при всей своей визуальной «слабости» на PR-графике, на самом деле работает в 15 раз лучше случайного гадания на этой конкретной несбалансированной задаче. Это не отменяет полезности PR-кривой — она по-прежнему честно показывает абсолютный уровень precision, который команде придётся выдерживать на практике, — но напоминает, что даже её нужно интерпретировать с оглядкой на базовый уровень дисбаланса, а не читать изолированно.

Почему это важно

Выбор между ROC-AUC и PR-кривой — это не вопрос «какая метрика правильная», а вопрос «какой вопрос ты на самом деле задаёшь модели». Если тебе важно понять, насколько хорошо модель в принципе умеет ранжировать объекты вне зависимости от соотношения классов, ROC-AUC остаётся отличным и удобным инструментом — именно поэтому он так распространён при сравнении моделей на этапе выбора алгоритма. Но если ты работаешь с задачей сильного дисбаланса классов — мошенничество, редкие заболевания, дефекты производства — и тебя интересует, насколько практически применим итоговый порог с точки зрения абсолютного числа ложных срабатываний, которые придётся разбирать людям или другим системам, PR-кривая и связанная с ней метрика average precision дадут куда более честную и предупреждающую картину. На практике опытные специалисты в задачах с сильным дисбалансом смотрят на обе кривые вместе, а не выбирают одну вместо другой.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Модель на 20 объектах (10 положительных, 10 отрицательных) при некотором пороге даёт TP=8, FN=2, FP=3, TN=7. Вычисли TPR и FPR.


Задание 2: Объясни своими словами разницу между TPR и Recall из прошлого урока.


Задание 3: В выборке из 200 объектов 50 реально положительных и 150 реально отрицательных. При пороге $\tau$ модель ошибочно пометила 30 отрицательных объектов как положительные. Вычисли FPR.


Задание 4: Модель идеальна: существует порог, при котором TPR=1 и FPR=0 одновременно. Через какие точки проходит её ROC-кривая?


Задание 5: Случайная модель на большой выборке при пороге, отсекающем ровно половину всех объектов независимо от класса, даёт какие примерно значения TPR и FPR?


Задание 6: Дан набор скоров для 4 положительных и 4 отрицательных примеров: положительные — 0.9, 0.8, 0.3, 0.2; отрицательные — 0.7, 0.6, 0.4, 0.1. При пороге $\tau=0.5$ найди TP, FP и вычисли TPR, FPR.


Задание 7: Почему у AUC = 0.5 нет однозначно «хорошей» интерпретации в терминах качества модели?


Задание 8: Модель показывает AUC = 0.30. Что это говорит о её предсказаниях и что можно сделать, чтобы улучшить её без переобучения?


Задание 9: В функции sklearn.metrics.roc_auc_score(y_true, y_score) что нужно передать во втором аргументе — предсказанные метки классов (0/1) или предсказанные вероятности?


Задание 10: Дан датасет из 5 положительных и 5 отрицательных примеров. Модель А имеет AUC=0.95, модель Б имеет AUC=0.75. При пороге 0.5 обе показывают одинаковую accuracy 80%. Какую модель предпочесть, если порог классификации ещё предстоит подбирать под бизнес-задачу?


Продвинутые задания (11–20)

Задание 11: Дан набор из 3 положительных (скоры 0.9, 0.6, 0.4) и 3 отрицательных (скоры 0.8, 0.5, 0.2) примеров. Посчитай AUC методом подсчёта пар.


Задание 12: Используя данные задания 11, построй таблицу TPR/FPR для всех различных порогов и вычисли AUC методом трапеций, чтобы проверить результат.


Задание 13: Объясни, почему добавление в выборку ещё 1000 отрицательных примеров со скорами, равномерно распределёнными на всём диапазоне $[0,1]$ (то есть без изменения того, как модель ранжирует уже имеющиеся объекты), почти не изменит AUC, посчитанный методом подсчёта пар, если новых положительных примеров при этом не добавлялось.


Задание 14: У модели ROC-кривая проходит точно по диагонали на интервале FPR от 0 до 0.3, а затем резко поднимается почти до TPR=1 при FPR=0.3, оставаясь почти горизонтальной до FPR=1. Как это можно проинтерпретировать в терминах поведения модели на разных участках порога?


Задание 15: В задаче с 20 положительными и 20 отрицательными примерами модель А даёт AUC=0.85, модель Б — AUC=0.80. Всегда ли модель А будет показывать более высокую accuracy при любом фиксированном пороге, чем модель Б?


Задание 16: Докажи, что если предсказанные скоры модели инвертировать заменой $p \to 1-p$, новый AUC равен $1 - \text{AUC}_{\text{старый}}$.


Задание 17: Почему при сравнении нескольких моделей на одном и том же тестовом наборе через roc_auc_score не нужно заранее выбирать порог классификации?


Задание 18: В задаче с сильным дисбалансом (900 отрицательных, 100 положительных) модель показывает FPR=0.02 при некотором пороге. Сколько это ложных срабатываний в абсолютных числах и как это может повлиять на восприятие качества модели, если смотреть только на ROC-кривую?


Задание 19: Объясни, почему PR-кривая для случайной модели — это не диагональ, как в случае ROC-кривой, а горизонтальная линия, и на каком уровне она проходит.


Задание 20: Модель А имеет AUC=0.9 на сбалансированной тестовой выборке (50/50). Ту же модель протестировали на выборке с дисбалансом 95/5 (95% отрицательных). Что произойдёт с AUC и что произойдёт с precision при том же самом пороге, дающем одинаковый TPR и FPR на обеих выборках?


Задания-челленджи (21–30)

Задание 21: Даны скоры пяти положительных (0.9, 0.7, 0.65, 0.4, 0.3) и пяти отрицательных (0.85, 0.6, 0.55, 0.35, 0.1) примеров. Построй полную таблицу TPR/FPR по всем порогам и вычисли AUC любым способом.


Задание 22: Докажи (на уровне логической аргументации, не строгой математики), что ROC-кривая всегда является неубывающей функцией TPR от FPR при движении по убыванию порога.


Задание 23: Сравни, как одна и та же ошибка модели — присвоение отрицательному объекту очень высокого скора 0.99 — повлияет на ROC-кривую и на PR-кривую при малом и при большом количестве отрицательных объектов в выборке.


Задание 24: Специалист по data science заявляет: «Наша модель обнаружения мошенничества показывает ROC-AUC 0.98 — она почти идеальна». Какие два уточняющих вопроса ты бы задал, прежде чем согласиться с этим выводом, опираясь на материал этого урока?


Задание 25: Смоделируй ситуацию: датасет диагностики редкого заболевания, 1 больной на 1000 здоровых. Модель при разумном пороге даёт TPR=0.8, FPR=0.02. Вычисли precision в абсолютных числах, взяв выборку из 1 больного и 1000 здоровых (округли TP до целого числа разумно).


Задание 26: Почему нельзя напрямую сравнивать AUC двух моделей, если они были посчитаны на двух разных тестовых выборках с разной степенью дисбаланса классов, даже с учётом того, что AUC формально инвариантен к дисбалансу?


Задание 27: Реши, какую метрику — ROC-AUC или average precision (площадь под PR-кривой) — ты бы предложил как основную метрику для соревнования по машинному обучению, где 99.5% примеров относятся к отрицательному классу (например, обнаружение крайне редкого дефекта на производственной линии), и обоснуй выбор.


Задание 28: Модель для одобрения кредитов имеет ROC-AUC=0.88. Банк хочет минимизировать сумму двух видов потерь: потери от невозврата кредита (каждый пропущенный ненадёжный заёмщик стоит банку в среднем 500 000 рублей) и потери от упущенной прибыли (каждый ошибочно отклонённый надёжный заёмщик стоит банку в среднем 50 000 рублей недополученной прибыли). Как эта информация должна повлиять на выбор порога классификации по сравнению со стандартным порогом 0.5?


Задание 29: Объясни связь между AUC и статистикой Манна — Уитни (Mann–Whitney U), упомянутой в формальном определении этого урока, и почему эта связь позволяет использовать инструменты статистической проверки гипотез для сравнения AUC двух моделей.


Задание 30: Спроектируй практический процесс выбора модели и порога для системы одобрения кредитов: опиши, на каком этапе используется ROC-AUC, на каком — PR-кривая (если она вообще нужна для этой задачи), а на каком — конкретный экономический расчёт порога, и обоснуй порядок этих шагов.


Частые ошибки

Ошибка 1. Считают, что ROC-AUC — это метрика, зависящая от выбранного порога классификации, и пытаются «вычислить ROC-AUC при пороге 0.5».

Как выглядит: «наша модель при пороге 0.5 имеет ROC-AUC 0.85» — постановка вопроса, смешивающая метрику, которая по определению агрегирует все пороги, с метрикой, привязанной к одному конкретному порогу.

Почему возникает: привычка мыслить в категориях precision/recall/accuracy из прошлого урока, каждая из которых действительно требует фиксированного порога, по инерции переносится на AUC.

Как правильно: AUC вычисляется по всему набору предсказанных вероятностей и истинных меток сразу, без явного указания порога — порог вообще не является параметром функции roc_auc_score.

Ошибка 2. Передают в roc_auc_score уже пороговые предсказания (0 и 1) вместо непрерывных вероятностей.

Как выглядит: roc_auc_score(y_true, model.predict(X)) вместо roc_auc_score(y_true, model.predict_proba(X)[:, 1]).

Почему возникает: привычный метод .predict() уже даёт готовые метки классов, и разница между ним и .predict_proba() не всегда очевидна новичку.

Как правильно: для ROC-AUC нужно передавать именно вероятности (или иной непрерывный скор) — иначе функция технически отработает, но фактически посчитает AUC по вырожденной кривой из одной точки, потеряв информацию о качестве ранжирования при разных порогах.

Ошибка 3. Используют ROC-AUC как единственную метрику в задаче с сильным дисбалансом классов, не проверяя precision-recall кривую.

Как выглядит: «наша модель детекции редкого дефекта показывает ROC-AUC 0.97 — модель отличная, запускаем в продакшен».

Почему возникает: привычка использовать один и тот же набор метрик независимо от степени дисбаланса классов в конкретной задаче.

Как правильно: при сильном дисбалансе классов дополнительно смотреть на PR-кривую и на precision при разумных значениях recall — высокий ROC-AUC при дисбалансе совместим с низким практическим precision.

Ошибка 4. Интерпретируют AUC как «долю правильных ответов модели», путая его с accuracy.

Как выглядит: «AUC = 0.85 значит модель права в 85% случаев».

Почему возникает: оба числа лежат в диапазоне от 0 до 1 (или 0–100%), и интуитивно кажется, что оба измеряют одно и то же — общую «правильность» модели.

Как правильно: AUC = 0.85 означает, что при случайном выборе одного положительного и одного отрицательного примера модель с вероятностью 85% присвоит положительному более высокий скор, чем отрицательному — это метрика качества ранжирования, а не доля правильных классификаций при каком-либо конкретном пороге.

Ошибка 5. Сравнивают ROC-AUC моделей, обученных и протестированных на разных наборах данных с разной степенью дисбаланса классов, как будто это напрямую сопоставимые числа.

Как выглядит: «наша модель А (AUC 0.90 на выборке с 50/50) лучше модели Б (AUC 0.85 на другом наборе данных с дисбалансом 90/10)».

Почему возникает: забывают, что инвариантность AUC к дисбалансу классов верна только для одной и той же по сути выборки, а не гарантирует сравнимость AUC, посчитанных на принципиально разных датасетах.

Как правильно: AUC двух моделей нужно сравнивать на одном и том же тестовом наборе данных (или на достаточно похожих по составу наборах), иначе разница в AUC может объясняться разной сложностью выборок, а не разным качеством моделей.

Ошибка 6. Считают, что модель с AUC ниже 0.5 однозначно бесполезна и её нужно выбросить.

Как выглядит: «AUC = 0.35 — модель хуже случайного гадания, отбрасываем её».

Почему возникает: не учитывают, что AUC ниже 0.5 означает систематическую инверсию классов, а не отсутствие полезной информации в модели.

Как правильно: AUC = 0.35 легко превращается в AUC = 0.65 простой инверсией предсказания ($1-p$ вместо $p$) — сама модель в этом случае содержит полезный сигнал, просто интерпретированный «задом наперёд», и её стоит не выбрасывать, а исправить направление интерпретации.

Главное запомнить

  • Модель классификации обычно выдаёт вероятность, а перевод этой вероятности в класс 0/1 требует отдельно выбранного порога — precision, recall и accuracy зависят от этого выбора, и сравнение моделей только по одному фиксированному порогу может ввести в заблуждение.

  • TPR (True Positive Rate) — это то же самое, что Recall, доля верно найденных положительных примеров среди всех реально положительных. FPR (False Positive Rate) — доля ложных срабатываний среди всех реально отрицательных примеров.

  • ROC-кривая строится перебором всех возможных порогов от 0 до 1 и откладыванием точки $(\text{FPR}(\tau), \text{TPR}(\tau))$ для каждого порога — она визуализирует качество модели сразу на всём диапазоне порогов, а не в одной произвольной точке.

  • Идеальная модель даёт ROC-кривую, проходящую через верхний левый угол $(0,1)$; случайная модель даёт кривую, совпадающую с диагональю $\text{TPR}=\text{FPR}$ — это два ориентира, между которыми располагается любая реальная модель.

  • AUC (Area Under Curve) — площадь под ROC-кривой, единственное число от 0.5 (случайное гадание) до 1.0 (идеальная модель), суммирующее качество ранжирования модели по всем порогам сразу.

  • Вероятностная интерпретация: AUC равен вероятности того, что случайно выбранный положительный пример получит более высокий скор модели, чем случайно выбранный отрицательный пример — этот же расчёт эквивалентен статистике Манна — Уитни.

  • sklearn.metrics.roc_auc_score и roc_curve — стандартные инструменты для сравнения нескольких моделей друг с другом на этапе выбора алгоритма, независимо от того, какой порог будет выбран впоследствии.

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

  • При сильном дисбалансе классов даже небольшой FPR соответствует большому абсолютному числу ложных срабатываний, из-за чего precision резко падает, а ROC-кривая при этом продолжает выглядеть обманчиво привлекательной.

  • Precision-recall кривая (PR-кривая) чувствительна к дисбалансу классов и честно показывает проблему низкого precision там, где ROC-кривая её не видит — стандартная альтернатива при работе с редким положительным классом.

Связь с темами курса

Этот урок напрямую продолжает урок 307 (метрики качества): там ты разобрал confusion matrix, accuracy, precision, recall и F1-score — все эти метрики требуют заранее зафиксированного порога классификации, и урок 307 оставил открытым вопрос, откуда вообще берётся этот порог и как сравнивать модели, если результат сравнения меняется вместе с выбором порога. ROC-кривая и AUC — прямой ответ на этот вопрос: вместо того чтобы зафиксировать один порог, они перебирают все пороги сразу и дают модели единую, не зависящую от порога числовую оценку качества ранжирования. TPR, с которым ты работал в этом уроке, — это буквально recall из урока 307, только применённый на каждом из множества возможных порогов, а не на одном заранее выбранном.

Следующий урок 309 обратится к confusion matrix ещё раз, но уже глубже — с фокусом на устройстве самой матрицы ошибок как источника всех классификационных метрик, включая те, что ты уже видел (TPR, FPR, precision, recall), и некоторые новые. Понимание, что confusion matrix, а значит и все производные от неё метрики, — это функция от выбранного порога, которое ты закрепил в этом уроке, будет прямо использоваться и там: любая одна конкретная confusion matrix — это снимок модели при одном конкретном пороге, тогда как ROC-кривая — это целая последовательность таких снимков, склеенная в одну картину.

Интересные факты

  • Название ROC (Receiver Operating Characteristic) в буквальном переводе означает «рабочая характеристика приёмника» — имелся в виду не электронный компонент, а полностью человеческий фактор: как оператор радара интерпретирует сигнал на экране при выбранном им самим (или заданном инструкцией) пороге чувствительности.

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

  • Термин AUC как единое число, суммирующее качество диагностического теста, стал особенно популярен в медицинской статистике 1970–80-х годов — врачам и исследователям было гораздо удобнее сравнивать диагностические тесты по одному числу, чем визуально сопоставлять форму нескольких кривых.

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

Лайфхаки

  • Прежде чем сравнивать AUC двух моделей, убедись, что обе они посчитаны на одном и том же тестовом наборе — сравнение AUC на разных выборках, даже похожих по объёму, может ввести в заблуждение сильнее, чем разница в самом качестве моделей.

  • Если задача связана с сильным дисбалансом классов — построй рядом ROC-кривую и PR-кривую для одной и той же модели, прежде чем принимать решение о запуске в продакшен: высокий ROC-AUC без взгляда на PR-кривую может создать ложное чувство уверенности в качестве модели.

  • При подборе порога под бизнес-задачу переведи TPR и FPR в абсолютные числа объектов (умножив на реальное количество положительных и отрицательных примеров в продакшен-данных, а не в тестовой выборке) — только тогда становится видно, сколько объектов реально придётся обрабатывать людям или downstream-системам при выбранном пороге.

  • Используй roc_curve не только для построения графика, но и для явного поиска порога, ближайшего к желаемой точке на кривой (например, минимизирующего расстояние до идеального угла $(0,1)$ или удовлетворяющего ограничению вроде «FPR не выше 0.05») — многие библиотеки возвращают массив порогов вместе с TPR и FPR именно для такого практического поиска.

  • Не забывай, что AUC = 0.5 — это не «средненькая» модель, а модель без полезного сигнала вообще; если твоя модель на валидации показывает AUC около 0.5, ищи проблему не в тонкой настройке гиперпараметров, а в более фундаментальных вещах — утечке данных, ошибке в разметке или отсутствии связи между признаками и целевой переменной.

  • Держи в голове, что визуально «красивая», близкая к верхнему левому углу ROC-кривая — это необходимое, но не достаточное условие практической полезности модели: перед развёртыванием в продакшене всегда пересчитывай метрики при конкретном рабочем пороге в абсолютных, а не относительных числах.

Ты прошёл путь от простого вопроса «а что если 0.5 — не лучший порог?» до полноценного инструмента, который специалисты по data science используют ежедневно при сравнении моделей и при подборе порога под конкретную бизнес-задачу. ROC-кривая и AUC не заменяют precision, recall и F1-score из прошлого урока — они дают тебе взгляд на модель с высоты птичьего полёта, поверх любого конкретного выбора порога, а окончательное решение о том, где именно на этой кривой остановиться, всегда возвращает тебя обратно к делу и его реальной цене ошибок. В следующем уроке ты вернёшься к confusion matrix — уже с пониманием того, что каждая такая матрица — лишь один кадр из большого фильма, который ты только что научился прокручивать целиком.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!