Чем ROC-AUC лучше accuracy?

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

Ответ

ROC-AUC является более информативной и надежной метрикой, чем accuracy, по нескольким ключевым причинам:

  1. Независимость от порога классификации: Accuracy оценивает качество бинарных предсказаний (0 или 1) при одном, часто произвольно выбранном пороге (обычно 0.5). ROC-AUC же оценивает способность модели разделять классы по всем возможным порогам, что дает более полную картину.
  2. Устойчивость к несбалансированным данным: На сильно несбалансированных выборках (например, 99% негативных, 1% позитивных) accuracy вводит в заблуждение. Модель, всегда предсказывающая мажоритарный класс, получит accuracy 99%, но будет бесполесной. ROC-AUC корректно оценит, что модель не умеет разделять классы.
  3. Оценка вероятностей: ROC-AUC работает с вероятностями (y_score), а не с жесткими предсказаниями, что позволяет сравнивать модели на более глубоком уровне.

Наглядный пример:

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

# Сильно несбалансированные данные
n_samples = 1000
y_true = np.array([0] * 990 + [1] * 10)  # 1% положительных

# Модель-«угадыватель», всегда предсказывающая 0
y_pred = np.zeros(n_samples)
y_proba = np.random.uniform(0, 0.1, n_samples)  # Случайные низкие вероятности

print("Accuracy (всегда 0):", accuracy_score(y_true, y_pred))  # 0.99 - отличный, но ложный результат
print("ROC-AUC (случайные вероятности):", roc_auc_score(y_true, y_proba))  # ~0.5 - показывает отсутствие разделения

Таким образом, ROC-AUC — это метрика разделимости классов, в то время как accuracy — это метрика правильности классификации при конкретном пороге.