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

Какой будет ROC-AUC для случайной модели?

1.7 Middle🔥 131 комментариев
#Метрики и оценка моделей

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

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

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

ROC-AUC для случайной модели

Теоретическое значение

ROC-AUC (Area Under the Receiver Operating Characteristic Curve) для полностью случайной модели всегда равен 0.5.

Это фундаментальное свойство метрики. Давайте разберёмся почему.

Что такое ROC-кривая?

ROC-кривая отображает зависимость между:

  • True Positive Rate (TPR) — доля правильно предсказанных позитивных примеров: TPR = TP / (TP + FN)
  • False Positive Rate (FPR) — доля неправильно предсказанных негативных примеров как позитивные: FPR = FP / (FP + TN)

На оси X откладывается FPR, на оси Y — TPR.

Почему случайная модель даёт AUC = 0.5?

Случайная модель — это модель, которая с равной вероятностью предсказывает класс 0 или 1, независимо от входных данных. Ключевое свойство: она не различает позитивные и негативные примеры.

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

# Истинные метки
y_true = [0, 0, 1, 1, 0, 1, 1, 0]

# Случайные вероятности (50/50)
y_random = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]

auc = roc_auc_score(y_true, y_random)
print(f"ROC-AUC: {auc}")  # Вывод: 0.5 (или близко к 0.5 из-за стохастичности)

Интуитивное объяснение:

ROC-кривая для случайной модели — это диагональная линия от точки (0, 0) к (1, 1). Почему?

  • Когда мы понижаем порог вероятности с 1.0 до 0.0, обе ставки (TP и FP) растут линейно и равномерно
  • FPR = TPR на всём протяжении кривой
  • Площадь треугольника под диагональю = 0.5

Практическое значение

0.5 — это baseline для оценки. Если ваша модель показывает:

  • ROC-AUC > 0.5 — модель работает лучше, чем случайность
  • ROC-AUC ≈ 0.5 — модель не лучше случайного угадывания
  • ROC-AUC < 0.5 — модель работает хуже, чем случайность (инвертируй предсказания!)

Связь с другими метриками

# Альтернативный способ понять случайную модель
from sklearn.metrics import roc_curve

y_true = [0, 0, 1, 1]
y_pred = [0.5, 0.5, 0.5, 0.5]

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

# fpr и tpr будут в примерно одинаковых значениях
# Кривая близка к диагонали

Важный нюанс: класс-имбаланс

Важно: ROC-AUC = 0.5 сохраняется независимо от соотношения классов (class imbalance). Даже если позитивный класс составляет 5%, а негативный 95%, случайная модель всё равно даст AUC = 0.5.

Это одна из причин, почему ROC-AUC предпочтительнее accuracy для несбалансированных данных:

# Несбалансированные данные
y_true = [0]*95 + [1]*5
y_random = np.random.rand(100)  # Случайные вероятности

auc = roc_auc_score(y_true, y_random)
print(f"ROC-AUC: {auc}")  # Всё ещё около 0.5

Практический совет

Всегда проверяй ROC-AUC:

  • ROC-AUC > 0.7 — хорошая модель
  • ROC-AUC > 0.8 — отличная модель
  • ROC-AUC > 0.9 — исключительно хорошая модель

Если ROC-AUC близок к 0.5, переделай признаки, измени архитектуру модели или проверь качество данных.