ROC-AUC vs PR-AUC на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать на собесе

ROC-AUC — топ-1 метрика классификации в продакшене. PR-AUC — must-have для несбалансированных задач (фрод, churn, аномалии). На собесе DS обязательно: «почему ROC-AUC врёт на дисбалансе», «что такое PR-AUC», «какая метрика для anti-fraud».

Главная боль без понимания — DS отчитывается «AUC 0.92» на task с 1% позитивов, а в проде модель ловит 5 фродеров из 1000 — потому что ROC-AUC не чувствителен к этой проблеме.

ROC-AUC: определение и интуиция

ROC (Receiver Operating Characteristic) — кривая в координатах:

  • TPR (True Positive Rate) = recall = TP / (TP + FN)
  • FPR (False Positive Rate) = FP / (FP + TN)

Каждая точка — пара TPR/FPR при некотором threshold.

ROC-AUC — площадь под этой кривой. Значение 0.5 = случайный классификатор, 1.0 = идеальный.

Интуитивная интерпретация. ROC-AUC = вероятность, что для случайной пары (positive, negative) модель даст positive более высокий score, чем negative. Если AUC = 0.85 — в 85% таких пар модель права.

from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_true, y_proba)

Сильные стороны:

  • Не зависит от threshold.
  • Не зависит от prior class balance — на большинстве задач это плюс.
  • Хорошо интерпретируется.

PR-AUC: определение и интуиция

PR-curve — в координатах precision/recall.

  • Precision = TP / (TP + FP)
  • Recall = TP / (TP + FN)

PR-AUC (Average Precision) — площадь под PR-кривой.

from sklearn.metrics import average_precision_score
score = average_precision_score(y_true, y_proba)

Интуиция. Чем выше AP — тем больше positives мы ловим при низком уровне ложных срабатываний.

Сильные стороны:

  • Чувствителен к доле позитивов (это и плюс, и минус).
  • Лучше отражает ценность модели для бизнеса в задачах поиска редких событий.
  • Бэйзлайн = доля позитивов в данных.

Разница на дисбалансе

Главная фишка: ROC-AUC не чувствителен к доле позитивов, PR-AUC — чувствителен.

Пример: 1М объектов, 100 позитивов (0.01%). Модель ловит 90 из 100 топ-100 предсказаний.

  • ROC-AUC ≈ 0.99 (выглядит идеально).
  • PR-AUC ≈ 0.5 (показывает, что модель работает, но не идеально).

Почему: TN огромный (999 900). FPR = FP / (FP+TN) даже при 1000 ложных срабатываний остаётся ≈ 0.001. ROC «не замечает» эту проблему.

Precision же при 1000 ложных и 90 настоящих = 90 / 1090 ≈ 8% — это уже видно.

# на сильном дисбалансе всегда смотри обе
print(roc_auc_score(y, p), average_precision_score(y, p))

Когда что выбирать

ROC-AUC:

  • Сбалансированная задача (50/50, 30/70).
  • Стоимость FP и FN сравнима.
  • Для общего сравнения моделей.
  • Когда нужна стабильность метрики при смене prior (test ≠ prod balance).

PR-AUC:

  • Сильный дисбаланс (< 5% позитивов).
  • Бизнес-задача — найти иголку в стоге сена (фрод, аномалии, рекомендации, поиск).
  • Стоимость FP важна (false alarm дорогой).
  • Хочется метрику, чувствительную к точности на топ-объектах.

Бизнес-метрики поверх:

  • Precision@K, Recall@K — фиксируем threshold или количество.
  • F1, F-beta — единый трейдоф.
  • Lift — во сколько раз модель лучше random на топ-сегменте.
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Бэйзлайн и интерпретация значений

Значение ROC-AUC PR-AUC
Случайная модель 0.5 равна доле позитивов (p)
Хорошая на типичной задаче 0.85-0.95 сильно зависит от p
Отлично на дисбалансе 0.95+ 0.4-0.7 (всё ещё «отлично» при p = 1%)

ROC-AUC = 0.5 всегда плох. PR-AUC надо сравнивать с бэйзлайном — на задаче с p = 0.01 PR-AUC = 0.05 уже в 5 раз лучше random.

Multiclass и threshold-tuning

Multiclass ROC-AUC. Считаем one-vs-rest или one-vs-one, потом усредняем.

roc_auc_score(y_true, y_proba, multi_class='ovr', average='macro')

Macro vs micro vs weighted:

  • macro — простое среднее по классам (равный вес).
  • micro — глобальная агрегация (как бинарная по всем парам).
  • weighted — взвешенное по поддержке класса.

Для дисбалансированного multiclass — weighted обычно полезнее.

Threshold-tuning не относится к AUC, но связан. AUC оценивает модель «в целом», а в проде нужен один threshold. Подбирать через optimal F1 / cost-based / business KPI.

from sklearn.metrics import precision_recall_curve
p, r, t = precision_recall_curve(y, proba)
f1 = 2*p*r / (p+r+1e-9)
best_t = t[f1[:-1].argmax()]

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

Сравнивать AUC между разными выборками. Если у выборок разная prior class balance, ROC-AUC более-менее стабилен, PR-AUC меняется радикально.

Считать ROC-AUC = 0.85 хорошим без контекста. На задаче с 50/50 это ок. На фроде с 0.1% — бесполезная цифра.

Не использовать AP / PR-AUC при дисбалансе. Главный баг отчётов «у нас отличная модель» при практически бесполезной модели в проде.

Использовать roc_auc_score(y, y_pred) вместо y_proba. AUC требует вероятности или score, не классы. Иначе кривая из 3 точек.

Тюнить threshold по тренировочной выборке. Делать на validation, иначе leakage.

Игнорировать PR baseline. PR-AUC = 0.3 — нужно смотреть, что бэйзлайн = доля позитивов.

Доверять одной метрике. На проде смотри precision@K, recall@K, F1, AUC, PR-AUC параллельно — это скажут разную правду.

Связанные темы

FAQ

Какая метрика для anti-fraud?

PR-AUC, precision@K (где K — capacity ручной проверки), recall@K. ROC-AUC — для общего смотрения, но не основная.

Average Precision и PR-AUC — одно и то же?

Почти. AP — взвешенная сумма precision на каждом recall-threshold (Σ (R_n - R_{n-1}) × P_n). PR-AUC через trapezoidal — численно очень близко. На практике используются взаимозаменяемо.

Как получить confidence interval для AUC?

Bootstrap: ресэмплить y/score N раз, считать AUC, взять перцентили. Аналитический CI существует (Hanley-McNeil), но bootstrap проще.

ROC-AUC может уменьшиться при добавлении хороших фичей?

Теоретически — нет, если новая фича несёт информацию. На практике может, если фича шумит на validation. Проверить bias-variance / overfit.

Как сравнить ROC-AUC двух моделей статистически?

DeLong test — стандартный подход. В Python: delong из package compare-auc-delong-xu.

Это официальная информация?

Нет. Статья основана на классических работах (Hanley-McNeil 1982, Davis-Goadrich 2006), документации scikit-learn.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.