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 — насколько хорошо модель в целом разделяет классы.