ROC-AUC vs PR-AUC на собеседовании Data Scientist
Карьерник — 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 на топ-сегменте.
Бэйзлайн и интерпретация значений
| Значение | 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 параллельно — это скажут разную правду.
Связанные темы
- Class imbalance на собесе DS
- Калибровка вероятностей на собесе DS
- Loss функции на собесе DS
- Bias-variance trade-off на собесе DS
- Подготовка к собесу Data Scientist
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+ вопросами для собесов.