Что такое AUC ROC

Что такое ROC и AUC

ROC curve (Receiver Operating Characteristic) — это график, показывающий, как меняются True Positive Rate и False Positive Rate при разных порогах классификации. AUC (Area Under Curve) — площадь под этой кривой.

AUC — одно число от 0 до 1, которое говорит, насколько хорошо модель разделяет два класса. 1.0 — идеальная модель. 0.5 — случайная. 0 — модель систематически ошибается.

Как это работает

Представьте, что модель выдаёт вероятности от 0 до 1. Вы выбираете порог: всё выше — класс 1, ниже — класс 0. Разные пороги дают разный баланс между поимкой positive (recall) и ложными тревогами (false positives).

ROC-кривая строится по всем возможным порогам. По оси X — False Positive Rate (FPR), по Y — True Positive Rate (TPR, он же recall). Каждая точка — один threshold.

Идеальная модель имеет точку в верхнем левом углу: TPR = 1, FPR = 0. Случайная — диагональ от (0,0) до (1,1).

AUC — площадь под этой кривой. Для идеальной модели = 1.0, для случайной = 0.5.

Интерпретация AUC

AUC имеет интуитивную интерпретацию: это вероятность, что случайный positive имеет более высокий score, чем случайный negative.

AUC 0.8 означает: если взять два случайных примера, один positive, один negative, в 80% случаев positive получит более высокий score.

Шкала качества:

  • < 0.6 — плохо, лучше не использовать.
  • 0.6-0.7 — средне.
  • 0.7-0.8 — нормально.
  • 0.8-0.9 — хорошо.
  • 0.9+ — отлично.
  • 1.0 — проверьте, нет ли data leakage.

Пример в Python

from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt

y_true = [0, 0, 1, 1, 1]
y_scores = [0.1, 0.4, 0.35, 0.8, 0.7]

auc = roc_auc_score(y_true, y_scores)
print(f'AUC: {auc:.3f}')

fpr, tpr, thresholds = roc_curve(y_true, y_scores)

plt.plot(fpr, tpr, label=f'AUC = {auc:.2f}')
plt.plot([0, 1], [0, 1], 'r--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()

Прокачать тему на реальных задачах удобно в боте @kariernik_bot — база вопросов собрана с собеседований в Яндексе, Авито, Ozon, Тинькофф.

Почему AUC — стандарт

AUC имеет несколько удобных свойств. Первое — не зависит от threshold. Сравниваем модели на общем уровне, без выбора порога.

Второе — устойчив к дисбалансу классов. Для задач с 1% positive AUC всё равно осмысленный, в отличие от accuracy.

Третье — универсален. Используется в медицине, маркетинге, fraud detection, recommendations — везде, где есть бинарная классификация.

Именно поэтому AUC — de facto standard для сравнения ML-моделей на Kaggle, на собесах, в production dashboards.

Ограничения AUC

Не всегда бизнес-значим. AUC 0.85 хорошо звучит, но может не означать бизнес-ценности. Важнее метрики в конкретной области рейтинга — lift@10%, precision@100.

Может вводить в заблуждение при очень несбалансированных данных. AUC 0.9 на задаче с 0.1% positive может означать, что модель в топ-10% поймала 50% positive — не особенно впечатляюще.

Усреднение может скрывать проблемы. Модель может быть отличной в средней части рейтинга и плохой в крайностях. AUC этого не покажет.

Для сравнения сильно разных типов моделей AUC может быть не самой честной. Precision-Recall AUC часто показательнее на несбалансированных.

AUC vs Precision-Recall AUC

На сильно несбалансированных данных иногда используют PR-AUC вместо ROC-AUC. Она строится по кривой precision vs recall, а не FPR vs TPR.

PR-AUC чувствительнее к тому, как модель работает с редким positive class. Для fraud detection и rare disease PR-AUC часто более полезна.

В большинстве задач используют обе и смотрят, какая больше соответствует business needs.

AUC в продакшне

В production models AUC мониторят вместе с другими метриками. Если AUC на свежих данных упала с 0.85 до 0.75 — это data drift или concept drift. Модель стала хуже различать классы из-за изменений в данных.

Проактивный monitoring помогает вовремя переобучить модель или решить, что модель больше не нужна.

На собесе такие штуки часто спрашивают. Быстрый способ довести до автоматизма — тренажёр в Telegram с задачами из реальных интервью.

AUC для multi-class

Для мультиклассовой классификации есть варианты:

  • OVR (One-vs-Rest): считаем AUC для каждого класса против остальных, усредняем.
  • OVO (One-vs-One): AUC для каждой пары классов, усредняем.

sklearn по умолчанию делает OVR:

from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_scores, multi_class='ovr', average='macro')

На собеседовании

Классические вопросы:

  • «Что такое AUC и ROC?» — кривая TPR vs FPR, AUC — площадь под ней.
  • «Как интерпретировать AUC 0.8?» — вероятность 80%, что positive имеет выше score, чем negative.
  • «AUC 0.5 — что это значит?» — случайная модель.
  • «Когда AUC не подходит?» — когда важны конкретные пороги и точечные метрики (precision@k).

Иногда просят нарисовать ROC-кривую или объяснить, что будет с AUC при изменении threshold.

Читайте также

FAQ

AUC выше у деревьев или логрега?

Зависит от задачи. На сложных нелинейных — деревья / градиентный бустинг. На простых линейных — логрег может быть лучше.

Можно ли AUC меньше 0.5?

Формально да, но это значит, что модель систематически ошибается. Инвертируйте предсказания — получите AUC > 0.5.

AUC растёт с добавлением features?

Не обязательно. Добавление шума может ухудшить модель, хотя на train AUC может расти (overfitting).

Как показать AUC бизнесу?

Вместе с практической интерпретацией: «AUC 0.85 означает, что наша модель в 85% случаев правильно различает лояльных и churn-клиентов».