Какое значение ROC AUC не учитывает?

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

Ответ

ROC AUC (Area Under the Receiver Operating Characteristic Curve) — это метрика, оценивающая качество ранжирования объектов моделью (насколько хорошо модель отделяет положительные классы от отрицательных). Однако она не учитывает следующие аспекты:

  1. Конкретный порог классификации: AUC вычисляется по всем возможным порогам и показывает потенциальное качество модели, но не говорит, какой порог выбрать для получения итоговых бинарных предсказаний (классов 0/1). Модель с высоким AUC может иметь низкую точность или полноту при неудачно выбранном пороге.
  2. Распределение классов (дисбаланс): AUC инвариантна к соотношению классов в выборке. Это может быть недостатком, если нас интересует точность предсказания редкого класса. В таких случаях лучше смотреть на Precision-Recall AUC.
  3. Калибровку вероятностей: Модель может идеально ранжировать объекты (AUC ≈ 1.0), но выдавать некорректные, смещённые значения вероятностей (например, все предсказания в диапазоне 0.9-1.0 для положительного класса).
  4. Абсолютные значения ошибок: AUC не чувствительна к абсолютной разнице в предсказанных вероятностях, важна лишь их относительная упорядоченность.

Пример на Python, иллюстрирующий пункт 3:

from sklearn.metrics import roc_auc_score
import numpy as np

# Идеальное ранжирование, но вероятности плохо откалиброваны
y_true = [0, 0, 1, 1]
y_pred_rank_good = [0.1, 0.2, 0.7, 0.8]  # Хорошее ранжирование
# Смещённые вероятности, но ранжирование то же
y_pred_calib_bad = [0.4, 0.45, 0.9, 0.95]

print(f'AUC для y_pred_rank_good: {roc_auc_score(y_true, y_pred_rank_good):.3f}') # 1.0
print(f'AUC для y_pred_calib_bad: {roc_auc_score(y_true, y_pred_calib_bad):.3f}') # 1.0
# AUC одинакова, хотя во втором случае все вероятности завышены.