Собесов

khangich: ROC-AUC vs PR-AUC при дисбалансе

ML / Data ScienceМетрики качестваСредняяMiddle

Условие

В чём разница между ROC-AUC и PR-AUC? Почему при сильном дисбалансе классов (например, 0.5% позитивов) ROC-AUC может показывать 0.95, а PR-AUC — 0.20?

Решение

Подход

ROC-кривая строится в осях:

  • Y: TPR (True Positive Rate, recall) = TP / (TP + FN).
  • X: FPR (False Positive Rate) = FP / (FP + TN).

PR-кривая:

  • Y: Precision = TP / (TP + FP).
  • X: Recall = TP / (TP + FN).

Где зарыта разница.

FPR имеет TN в знаменателе. На несбалансированных данных TN огромен (99.5% выборки) и поглощает почти любые FP. То есть ROC-кривая в области редкого позитива «лениво» реагирует на ошибки FP, и AUC легко близко к 1.

Precision в знаменателе имеет TP + FP. На редком классе FP сразу делает precision маленькой, даже если recall неплохой. PR-AUC резко чувствителен к качеству именно на позитивном классе.

Пример с цифрами.

  • Позитивов 100, негативов 19900 (0.5%).
  • Модель ловит 90 позитивов (recall 0.9) и при этом отдает 500 ложноположительных.
  • TPR = 0.9, FPR = 500/19900 ≈ 0.025 → ROC выглядит замечательно.
  • Precision = 90 / 590 ≈ 0.153 → PR говорит «модель плохая».

В реальной задаче (фрод, медицина) важно именно precision: если модель назвала 590 операций фродом, а только 90 — фрод, оператор устанет.

Когда что использовать.

Класс Метрика
Сбалансированные (>20% позитивов) ROC-AUC
Сильно несбалансированные (< 5% позитивов) PR-AUC, precision@recall, recall@precision
Ранжирование при «не важно, сколько позитивов» ROC-AUC
Бизнес: «сколько FP мы можем себе позволить ради recall» PR-кривая + рабочая точка
from sklearn.metrics import roc_auc_score, average_precision_score
 
print("ROC-AUC :", roc_auc_score(y_true, y_proba))
print("PR-AUC  :", average_precision_score(y_true, y_proba))

Подводные камни

  1. ROC-AUC = 0.95 → "отлично" при дисбалансе — типичная ошибка. Проверяйте, есть ли позитивы в выборке, и считайте PR-AUC параллельно.
  2. Baseline PR-AUC = доля позитивов. Если позитивов 1%, baseline PR-AUC = 0.01. Сравнивайте с этим уровнем.
  3. AUC по вероятностям, не по бинарным предсказаниям. Передача predict() вместо predict_proba() даёт неинформативный AUC.
  4. AUC сравнивает ранжирование, а не калибровку. Можно иметь идеальный AUC и совершенно нереалистичные вероятности — отдельно проверяйте калибровку (reliability curve, brier_score).

Эталонный ответ

ROC-AUC использует FPR с TN в знаменателе и нечувствителен к ошибкам на редком классе при дисбалансе. PR-AUC построен через precision = TP/(TP+FP) и резко падает при росте FP. На сильно несбалансированных задачах PR-AUC и метрики по позитивному классу честнее показывают качество.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти