В чем разница между PR-AUC и ROC-AUC?

«В чем разница между PR-AUC и ROC-AUC?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ROC-AUC (Area Under the Receiver Operating Characteristic Curve) и PR-AUC (Area Under the Precision-Recall Curve) — это метрики для оценки бинарных классификаторов, но они измеряют разные аспекты производительности модели.

Метрика Что оценивает Чувствительность к дисбалансу Типичное применение
ROC-AUC Соотношение True Positive Rate (Recall) и False Positive Rate при варьировании порога классификации. Низкая. Остается стабильной даже при сильном дисбалансе классов. Общие задачи классификации, где оба класса примерно равнозначны (например, определение спама).
PR-AUC Соотношение Precision (точности) и Recall (полноты). Высокая. Резко падает, если модель плохо предсказывает редкий класс. Задачи с сильным дисбалансом, где важен редкий класс (например, обнаружение мошенничества, медицинская диагностика).

Почему это важно? В задачах с дисбалансом (например, 99% негативных и 1% позитивных примеров) высокий ROC-AUC может вводить в заблуждение, так как модель, всегда предсказывающая негативный класс, все равно будет иметь низкий FPR. PR-AUC в такой ситуации сразу покажет низкое качество, так как Precision для редкого класса будет нулевым.

Пример на Python:

from sklearn.metrics import roc_auc_score, average_precision_score
import numpy as np

# Имитация предсказаний модели и истинных меток
y_true = np.array([0, 1, 0, 1, 0, 0, 0, 1])  # Сильный дисбаланс
# Модель уверенно предсказывает негативный класс, но иногда ошибается с позитивным
y_scores = np.array([0.1, 0.9, 0.2, 0.8, 0.05, 0.15, 0.1, 0.7])

roc_auc = roc_auc_score(y_true, y_scores)
pr_auc = average_precision_score(y_true, y_scores)

print(f"ROC-AUC: {roc_auc:.3f}")  # Может быть относительно высоким
print(f"PR-AUC:  {pr_auc:.3f}")   # Будет значительно ниже, что лучше отражает проблему

Вывод: Выбирайте PR-AUC, когда критически важно правильно находить объекты редкого класса и минимизировать ложные срабатывания.