Условие
В чём разница между 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))Подводные камни
- ROC-AUC = 0.95 → "отлично" при дисбалансе — типичная ошибка. Проверяйте, есть ли позитивы в выборке, и считайте PR-AUC параллельно.
- Baseline PR-AUC = доля позитивов. Если позитивов 1%, baseline PR-AUC = 0.01. Сравнивайте с этим уровнем.
- AUC по вероятностям, не по бинарным предсказаниям. Передача
predict()вместоpredict_proba()даёт неинформативный AUC. - AUC сравнивает ранжирование, а не калибровку. Можно иметь идеальный AUC и совершенно нереалистичные вероятности — отдельно проверяйте калибровку (
reliability curve,brier_score).
Эталонный ответ
ROC-AUC использует FPR с TN в знаменателе и нечувствителен к ошибкам на редком классе при дисбалансе. PR-AUC построен через precision = TP/(TP+FP) и резко падает при росте FP. На сильно несбалансированных задачах PR-AUC и метрики по позитивному классу честнее показывают качество.