← Назад к вопросам

За что отвечают точки на графике ROC AUC

1.0 Junior🔥 201 комментариев
#Машинное обучение#Метрики и оценка моделей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Точки на графике ROC AUC

ROC AUC (Receiver Operating Characteristic Area Under Curve) — это метрика оценки качества классификационных моделей. Каждая точка на ROC-кривой представляет производительность модели при определённом пороге классификации (threshold).

Структура ROC-кривой

График ROC показает зависимость:

  • По оси Y: True Positive Rate (TPR) = TP / (TP + FN)

    • Доля положительных случаев, которые модель правильно определила
    • "Чувствительность" или "Recall"
  • По оси X: False Positive Rate (FPR) = FP / (FP + TN)

    • Доля отрицательных случаев, которые модель неправильно классифицировала как положительные
    • "1 - Specificity"

Что представляет каждая точка

Каждая точка на ROC-кривой соответствует одному значению порога классификации (от 0 до 1):

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

# Вероятности предсказания модели
y_true = [0, 0, 1, 1, 1, 0, 1]
y_proba = [0.1, 0.2, 0.4, 0.7, 0.9, 0.3, 0.8]

# Рассчёт ROC-кривой
fpr, tpr, thresholds = roc_curve(y_true, y_proba)

# Каждый порог даёт одну точку
print("Пороги (thresholds):")
for i, threshold in enumerate(thresholds):
    print(f"Порог {threshold:.2f}: FPR={fpr[i]:.2f}, TPR={tpr[i]:.2f}")

# Визуализация
plt.plot(fpr, tpr, marker="o", markersize=8)
plt.xlabel("False Positive Rate (FPR)")
plt.ylabel("True Positive Rate (TPR)")
plt.title("ROC-кривая")
plt.show()

Пример: как меняются метрики при разных порогах

# Допустим, модель выдала вероятности:
y_true   = [0, 0, 1, 1, 1]
y_proba  = [0.2, 0.4, 0.5, 0.7, 0.9]

# Порог = 0.5
# Предсказания: [0, 0, 1, 1, 1]
# TP=3, FP=0, FN=0, TN=2
# TPR = 3/3 = 1.0, FPR = 0/2 = 0.0 → Точка (0.0, 1.0)

# Порог = 0.3
# Предсказания: [0, 1, 1, 1, 1]
# TP=3, FP=1, FN=0, TN=1
# TPR = 3/3 = 1.0, FPR = 1/2 = 0.5 → Точка (0.5, 1.0)

# Порог = 0.8
# Предсказания: [0, 0, 0, 0, 1]
# TP=1, FP=0, FN=2, TN=2
# TPR = 1/3 = 0.33, FPR = 0/2 = 0.0 → Точка (0.0, 0.33)

Интерпретация положения точек

Точки в левом верхнем углу (FPR низкий, TPR высокий):

  • Модель хорошо различает классы
  • Мало ложных срабатываний
  • Высокая recall и precision

Точки на диагонали (FPR ≈ TPR):

  • Модель не лучше случайного гадания
  • Нет дискриминирующей способности

Точки в правом нижнем углу (FPR высокий, TPR низкий):

  • Модель имеет негативную предсказательную способность
  • Много ложных срабатываний
  • Мало верных положительных

AUC (Area Under Curve)

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

from sklearn.metrics import roc_auc_score

auc_score = roc_auc_score(y_true, y_proba)
print(f"AUC: {auc_score:.3f}")

# Интерпретация:
# AUC = 1.0 → идеальная классификация
# AUC = 0.5 → случайное гадание
# AUC = 0.0 → полностью неверная классификация

Выбор оптимального порога

import numpy as np

# Найти оптимальный порог (максимизировать TPR - FPR)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]

print(f"Оптимальный порог: {optimal_threshold:.3f}")
print(f"При этом пороге: TPR={tpr[optimal_idx]:.3f}, FPR={fpr[optimal_idx]:.3f}")

Практическое применение

ROC-кривая помогает:

  • Сравнивать модели: модель с более высокой AUC лучше
  • Выбирать порог классификации: в зависимости от задачи (precision vs recall)
  • Оценивать stability: кривая должна быть "гладкой", без скачков
  • Работать с дисбалансом классов: ROC менее чувствительна к дисбалансу, чем accuracy

Заключение

Каждая точка на ROC-кривой — это пара (FPR, TPR) для конкретного порога классификации. Перемещая порог от 0 до 1, мы получаем множество точек, которые образуют кривую. AUC — это интегральная характеристика качества модели, независимая от выбора порога. ROC-анализ особенно полезен при необходимости баланса между чувствительностью и специфичностью.