Главная
#Математика и ML #Classification #Data Science

Что такое ROC-AUC и PR-AUC в Data Science и какую кривую смотреть в зависимости от задачи в 2026 году?

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

Содержание
  1. С чего начинается путаница
  2. Что измеряет ROC-кривая
  3. Что означает ROC-AUC
  4. AUC — это площадь под ROC-кривой, но смысл у нее глубже, чем просто площадь
  5. Что измеряет PR-кривая
  6. Почему PR-AUC строже, чем ROC-AUC при дисбалансе
  7. Геометрический смысл различия между ROC и PR
  8. Где здесь связь с оптимизацией
  9. Когда смотреть ROC-AUC
  10. Когда смотреть PR-AUC
  11. Python: как сравнить ROC-AUC и PR-AUC на одной задаче
  12. Что важно вынести из темы
  13. Kaggle notebook по теме:

Поэтому вопрос “какую кривую смотреть?” — это не вопрос вкуса. Это вопрос того, как устроена сама задача. Если здесь ошибиться, можно принять за сильную модель ту, которая просто красиво выглядит на общей статистике, но почти не помогает в реальном процессе принятия решений.

Для Data Science в 2026 году это особенно важно, потому что модели все чаще живут не в ноутбуке, а в продуктах, антифроде, медицинском скрининге, рекомендациях, кредитном риске и системах наблюдения. Там редкий класс может быть маленьким по частоте, но огромным по стоимости ошибки.

С чего начинается путаница

Обе метрики работают с вероятностным score модели. Мы берем один и тот же ранжированный список объектов и начинаем двигать порог. Но дальше каждая кривая задает свою оптику. В продуктовых решениях рядом с этим почти всегда стоит и тема A/B тестов в Data Science, потому что метрики модели и метрики эксперимента не заменяют друг друга. ROC-кривая спрашивает: насколько хорошо модель разделяет положительные и отрицательные объекты в целом? PR-кривая спрашивает: что происходит с качеством положительных решений, когда мы пытаемся поднять больше редкого положительного класса?

Это различие кажется тонким только на словах. На практике оно огромно. В задачах с сильным дисбалансом ROC-AUC иногда выглядит обнадеживающе просто потому, что отрицательных объектов очень много. PR-AUC в такой среде обычно строже, потому что она не позволяет спрятаться за обилием true negative.

Именно поэтому рядом полезно отдельно посмотреть, как читается сама precision-recall curve в задаче с редким положительным классом. Тогда становится видно не только одно итоговое число, но и то, как быстро портится поток положительных решений при росте охвата.

Что измеряет ROC-кривая

ROC строится в координатах true positive rate и false positive rate. Это уже намекает, что кривая смотрит на положительный класс, но через отношение к обеим сторонам confusion matrix.

(\mathrm{TPR}=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FN}})

Раздел математики: математическая статистика.

Что означает каждый символ:

(\mathrm{TPR}) — true positive rate, он же recall.

(\mathrm{TP}) — число правильно найденных положительных объектов.

(\mathrm{FN}) — число пропущенных положительных объектов.

Эта формула появляется из вопроса: какую долю реальных положительных случаев мы вообще подняли?

Численный пример: если положительных объектов было (100), а модель нашла (80), то (\mathrm{TPR}=80/100=0.8). То есть recall равен 80 процентам.

(\mathrm{FPR}=\frac{\mathrm{FP}}{\mathrm{FP}+\mathrm{TN}})

Раздел математики: математическая статистика.

Что означает каждый символ:

(\mathrm{FPR}) — false positive rate.

(\mathrm{FP}) — число отрицательных объектов, ошибочно поднятых как положительные.

(\mathrm{TN}) — число правильно распознанных отрицательных объектов.

Формула появляется из вопроса: какую долю отрицательного класса мы зря тревожим?

Численный пример: если отрицательных объектов было (9900), а ложных тревог оказалось (99), то (\mathrm{FPR}=99/9900=0.01). Это всего один процент ложной тревоги по отрицательному классу.

Геометрически ROC-кривая — это траектория в плоскости ((FPR, TPR)), когда мы двигаем порог. Чем ближе кривая к верхнему левому углу, тем лучше модель отделяет классы.

Что означает ROC-AUC

Площадь под ROC-кривой часто интерпретируют как вероятность того, что случайно выбранный положительный объект получит score выше, чем случайно выбранный отрицательный объект. Это очень сильная интерпретация, потому что она связывает ROC-AUC не с конкретным порогом, а с качеством ранжирования вообще.

Если сказать интуитивно, ROC-AUC отвечает на вопрос: умеет ли модель в среднем ставить действительно важные объекты выше обычных? Для многих задач это полезно. Но здесь есть ловушка: ROC-AUC может оставаться приличным даже тогда, когда редкий класс практически неудобен для реального operational use.

AUC — это площадь под ROC-кривой, но смысл у нее глубже, чем просто площадь

Формально AUC — это area under curve. Но в прикладном смысле ее удобнее понимать как вероятность того, что модель поставит случайный положительный объект выше случайного отрицательного. Это очень сильная интерпретация, потому что она переводит геометрию в ранжирование.

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

Раздел математики: математический анализ и статистика.

Что означает каждый символ:

(\mathrm{AUC}) — площадь под ROC-кривой.

(\mathrm{TPR}(\mathrm{FPR})) — значение true positive rate как функции от false positive rate.

(\int_0^1) — интегрирование по всему диапазону ложноположительной доли.

Формула показывает, что ROC-AUC суммирует поведение кривой по всем возможным порогам, а не оценивает один частный operating point.

Численный пример: если у модели (\mathrm{AUC}=0.84), это можно интерпретировать так: примерно в 84 процентах случайных пар вида “положительный объект против отрицательного” модель поставит положительный выше.

Численный смысл у AUC такой: (AUC=0.5) соответствует почти случайному ранжированию, а (AUC=1.0) — идеальному. Именно поэтому ROC-AUC особенно полезна там, где нам важно не только окончательное решение по порогу, а качество ранжирования вероятностей. Но как только ranking нужно перевести в действие, почти сразу встаёт отдельный вопрос о том, какой threshold вообще делает модель рабочей в реальном процессе.

Что измеряет PR-кривая

PR-кривая строится по precision и recall. Здесь разговор уже идет не о всей структуре классов, а о том, насколько чистым остается поток положительных решений при увеличении полноты охвата.

(\mathrm{Precision}=\frac{TP}{TP+FP})

Раздел математики: математическая статистика.

Что означает каждый символ:

(\mathrm{TP}) — правильно найденные положительные объекты.

(\mathrm{FP}) — ложные положительные объекты.

Precision появляется из прикладного вопроса: если модель уже сказала “плюс”, насколько этому решению можно доверять?

Численный пример: если модель подняла (50) объектов как положительные, а реально правильными из них оказались (15), то precision равен (15/50=0.3). Значит, только 30 процентов тревог действительно полезны.

(\mathrm{Recall}=\frac{TP}{TP+FN})

Раздел математики: математическая статистика.

Что означает каждый символ:

Эта формула та же, что и для (\mathrm{TPR}).

Recall показывает полноту охвата редкого положительного класса.

В PR-кривой он становится второй координатой и начинает конкурировать с precision.

Численный пример: если из (60) настоящих положительных событий система нашла (15), recall равен (15/60=0.25). То есть система покрыла только четверть реальных событий.

Именно здесь видно, почему PR-кривая оказывается полезнее при редких классах. Она заставляет нас смотреть не на удобное соотношение к огромному массиву отрицательных примеров, а на реальную цену каждого положительного решения.

Почему PR-AUC строже, чем ROC-AUC при дисбалансе

Если отрицательных объектов очень много, false positive rate может выглядеть маленьким даже при заметном абсолютном числе ложных тревог. В ROC-пространстве это может делать модель визуально “сильной”. Но для бизнеса эти ложные тревоги все равно остаются реальными. PR-пространство как раз делает это более заметным, потому что precision быстро падает, когда false positive начинают доминировать в потоке положительных решений.

Поэтому в антифроде, медицинском скрининге, поиске дефектов, moderation pipelines и любых rare-event задачах PR-AUC обычно говорит о реальности системы честнее. Она концентрируется на том, что происходит с редким, но важным классом, а не размывает картину большим числом отрицательных наблюдений.

Геометрический смысл различия между ROC и PR

ROC-кривая показывает, насколько хорошо модель отделяет два распределения score друг от друга в целом. Это взгляд “сверху” на задачу ранжирования. PR-кривая показывает, как деградирует или сохраняется качество положительного потока при расширении охвата. Это взгляд “изнутри” на редкий класс.

Если хочется аналогии, ROC — это карта общей разделимости рельефа. PR — это карта стоимости поиска золотых крупиц в массе обычного песка. Вторая аналогия важнее там, где золотых крупиц мало и каждый ложный жест стоит дорого.

Где здесь связь с оптимизацией

Обе метрики используют одну и ту же основу: ранжированный список объектов по score модели. Но дальше начинаются две разные оптимизационные логики. ROC-AUC полезна, когда нам важно общее качество ранжирования и когда отрицательный класс не делает картину слишком обманчивой. PR-AUC полезна, когда целевая optimization-задача связана именно с редким положительным классом и ценой ложных тревог.

После обучения модели мы часто решаем еще одну отдельную optimization-задачу: какой порог выбрать. И здесь выбор метрики тоже критичен. Если порог будет подбираться под задачу с редким классом, смотреть только на ROC-AUC почти всегда недостаточно. Нужно видеть PR-кривую и понимать, что именно происходит с precision при росте recall.

Когда смотреть ROC-AUC

ROC-AUC особенно полезна в нескольких сценариях. Во-первых, когда классы относительно сбалансированы. Во-вторых, когда для нас важна именно общая способность модели ранжировать положительные объекты выше отрицательных. В-третьих, когда downstream-порог еще не зафиксирован и мы хотим сначала понять, насколько хороша сама score-модель как ranking mechanism.

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

Когда смотреть PR-AUC

PR-AUC нужно открывать тогда, когда положительный класс редкий и именно он представляет ценность или риск. Если модель ищет мошенников, дефекты, опасные сообщения, churn-сигналы или больных пациентов, PR-AUC обычно гораздо ближе к реальному operational смыслу. Она быстрее показывает, насколько чистым остается поток найденных объектов и что придется платить за увеличение полноты.

Если сформулировать очень практично: когда ваш positive class маленький, а team around the model не может обработать бесконечный поток ложных тревог, PR-AUC почти всегда информативнее ROC-AUC. А если при этом сам score ещё и плохо калиброван, решение по одной только кривой становится ещё рискованнее, поэтому рядом полезно держать и материал о том, почему вероятность 0.9 не всегда означает реальные 90 процентов.

Python: как сравнить ROC-AUC и PR-AUC на одной задаче

from sklearn.datasets import make_classification  # Генерируем синтетическую задачу бинарной классификации.
from sklearn.model_selection import train_test_split  # Подключаем разбиение на train и test.
from sklearn.linear_model import LogisticRegression  # Берем логистическую регрессию как базовый классификатор.
from sklearn.metrics import roc_auc_score, average_precision_score  # Импортируем ROC-AUC и PR-AUC.

X, y = make_classification(  # Создаем данные с сильным дисбалансом классов.
    n_samples=7000,  # Генерируем семь тысяч объектов.
    n_features=20,  # Используем двадцать признаков.
    n_informative=6,  # Из них шесть действительно полезны.
    n_redundant=2,  # Еще два признака коррелируют с полезными.
    weights=[0.96, 0.04],  # Положительный класс занимает только 4 процента.
    class_sep=1.1,  # Управляем разделимостью классов.
    random_state=42,  # Фиксируем случайность.
)  # Получаем матрицу признаков и target.

X_train, X_test, y_train, y_test = train_test_split(  # Делим данные на train и test.
    X, y, test_size=0.2, stratify=y, random_state=42
)  # Сохраняем долю редкого класса в обеих частях.

model = LogisticRegression(max_iter=1000)  # Создаем модель с запасом по числу итераций.
model.fit(X_train, y_train)  # Обучаем классификатор на train-части.

scores = model.predict_proba(X_test)[:, 1]  # Получаем вероятности положительного класса.
roc_auc = roc_auc_score(y_test, scores)  # Считаем ROC-AUC как оценку общего качества ранжирования.
pr_auc = average_precision_score(y_test, scores)  # Считаем PR-AUC в sklearn-формате Average Precision.

print('ROC-AUC:', round(roc_auc, 4))  # Печатаем ROC-AUC.
print('PR-AUC:', round(pr_auc, 4))  # Печатаем PR-AUC.
print('Positive rate:', round(y_test.mean(), 4))  # Показываем базовую долю положительного класса.

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

Что важно вынести из темы

ROC-AUC и PR-AUC не конкурируют как “правильная” и “неправильная” метрика. Они отвечают на разные вопросы. ROC-AUC лучше описывает общее качество ранжирования и разделимости классов. PR-AUC лучше показывает, что происходит с редким положительным классом, когда мы начинаем двигать порог и строить реальную систему обнаружения.

Если классы более-менее сбалансированы и важна общая ranking quality, ROC-AUC вполне уместна. Если положительный класс редкий и цена ложных тревог или пропусков велика, смотреть нужно прежде всего на PR-AUC и саму PR-кривую. В прикладном ML это не декоративный выбор между двумя графиками, а выбор того языка, на котором вы разговариваете с задачей.

И ещё одна практическая оговорка: интерпретация обеих кривых быстро устаревает, если в проде меняется сам входной поток. Поэтому сильная работа с метриками почти всегда идёт рядом с пониманием того, как drift меняет поведение модели уже после выкладки.

Kaggle notebook по теме:

https://www.kaggle.com/code/robinteuwens/precision-vs-recall-optimizing-fraud-costs

Что читать дальше

Связанные статьи по этой теме

Инструменты Python в 2026 году: современный стек для профессиональной разработки Что должен знать Junior Data Scientist в 2026 году? Как собрать GitHub-портфолио для Data Science
Вернуться в блог