ROC-кривая (Receiver Operating Characteristic) — это график, который показывает качество бинарного классификатора при всех возможных порогах принятия решения. Она позволяет оценить, насколько хорошо модель разделяет два класса, независимо от выбранного порога.

Что откладывается по осям

  • По оси Y — TPR (True Positive Rate), он же Recall или Sensitivity:

Доля реальных «положительных» объектов, которых модель верно нашла.

  • По оси X — FPR (False Positive Rate):

Доля реальных «отрицательных» объектов, которые модель ошибочно назвала «положительными».

Как строится

Классификатор обычно выдаёт вероятность или score. Задаём порог: если score выше порога — предсказываем «положительный», иначе «отрицательный».
Меняя порог от 1 до 0, получаем разные пары (FPR, TPR) — это и есть точки ROC-кривой.

  • Порог очень высокий: модель почти никого не называет положительным → TPR и FPR близки к 0.
  • Порог очень низкий: модель почти всех называет положительными → TPR и FPR близки к 1.
  • Промежуточные пороги дают точки между этими крайностями.

Как интерпретировать

  • Идеальный классификатор — точка (0, 1): TPR = 1, FPR = 0. Кривая идёт в левый верхний угол.
  • Случайное угадывание — диагональ из (0,0) в (1,1). AUC = 0.5.
  • Хорошая модель — кривая выше диагонали и ближе к левому верхнему углу.
  • Плохая модель (хуже случайной) — кривая ниже диагонали; если инвертировать предсказания, она станет хорошей.

AUC — площадь под ROC-кривой

AUC (Area Under Curve) — числовая сводка ROC-кривой:

  • 0.5 — случайное угадывание;
  • 1.0 — идеальное разделение;
  • 0.7–0.8 — приемлемо;
  • 0.8–0.9 — хорошо;
  • 0.9 — отлично.

Смысл AUC: вероятность того, что случайно выбранный положительный объект получит от модели больший score, чем случайно выбранный отрицательный.

Преимущества ROC-AUC

  • Не зависит от выбранного порога — оценивает модель целиком.
  • Инвариантна к балансу классов, так как использует TPR и FPR (доли внутри классов).
  • Позволяет сравнивать разные модели на одном графике.

Недостатки

  • При сильном дисбалансе классов ROC-AUC может быть слишком оптимистичной. Тогда лучше использовать Precision-Recall кривую и PR-AUC.
  • Не показывает калибровку вероятностей.
  • Для многоклассовой задачи требует усреднения: one-vs-rest, macro, micro, weighted.

Пример на Python

from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
 
# y_true — истинные метки (0/1), y_scores — вероятности положительного класса
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
auc = roc_auc_score(y_true, y_scores)
 
plt.plot(fpr, tpr, label=f"AUC = {auc:.2f}")
plt.plot([0, 1], [0, 1], linestyle="--", color="gray")  # случайная модель
plt.xlabel("FPR (1 - Specificity)")
plt.ylabel("TPR (Recall)")
plt.title("ROC-кривая")
plt.legend()
plt.show()

Связь с предыдущими темами

  • Матрица ошибок даёт TP, TN, FP, FN для одного порога. ROC-кривая — это все пороги сразу.
  • Specificity связана с осью X: (FPR = 1 - Specificity).
  • Recall / Sensitivity — это ось Y.

Коротко: ROC-кривая показывает компромисс между чувствительностью и ложными срабатываниями при всех порогах, а AUC — насколько хорошо модель в целом разделяет классы.