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

Что такое ROC?

2.0 Middle🔥 191 комментариев
#Машинное обучение#Метрики и оценка моделей

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

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

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

ROC: кривая и метрика оценки классификации

Определение

ROC (Receiver Operating Characteristic) — графическая кривая, которая показывает зависимость между True Positive Rate (TPR) и False Positive Rate (FPR) при различных порогах классификации.

ROC используется для оценки качества бинарной классификации.

Ключевые понятия

Confusion Matrix (Матрица ошибок):

Actual Positive  |  TP (True Positive)   |  FN (False Negative)
Actual Negative  |  FP (False Positive)  |  TN (True Negative)

TPR (True Positive Rate) = Recall:

TPR = TP / (TP + FN)
Процент правильно предсказанных положительных примеров

FPR (False Positive Rate):

FPR = FP / (FP + TN)
Процент неправильно предсказанных отрицательных примеров

Построение ROC кривой

from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

y_proba = model.predict_proba(X_test)[:, 1]

fpr, tpr, thresholds = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)

AUC (Area Under the Curve)

AUC — площадь под ROC кривой. Единая метрика оценки качества модели.

Интерпретация:

AUC = 0.5  → Модель работает как монета (random)
AUC = 0.6  → Плохо
AUC = 0.7  → Приемлемо
AUC = 0.8  → Хорошо
AUC = 0.9  → Отлично
AUC = 1.0  → Идеально (переобучение?)
from sklearn.metrics import roc_auc_score

y_test = [1, 0, 1, 1, 0]
y_proba = [0.9, 0.2, 0.8, 0.7, 0.3]

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

Пороги классификации

ROC показывает, как изменяется TPR и FPR при изменении порога:

При пороге 0.5: обычная классификация
При пороге 0.3: больше TP, но и больше FP
При пороге 0.8: меньше FP, но и меньше TP

ROC для разных моделей

models = {
    'Logistic Regression': LogisticRegression(),
    'Random Forest': RandomForestClassifier(),
    'SVM': SVC(probability=True)
}

для каждой модели:
  обучаем на train
  вычисляем y_proba на test
  строим ROC кривую
  сравниваем AUC

Когда использовать ROC

ROC хорошо для:

  • Бинарной классификации
  • Когда важен trade-off между TPR и FPR
  • Сравнения моделей

ROC плохо для:

  • Несбалансированных датасетов → используй Precision-Recall curve
  • Мультиклассовой классификации → ROC для каждого класса (one-vs-rest)

ROC vs Precision-Recall для дисбаланса

# Датасет: 95% класс 0, 5% класс 1
y_unbalanced = [0] * 950 + [1] * 50
y_proba_unbalanced = np.random.rand(1000)

fpr, tpr, _ = roc_curve(y_unbalanced, y_proba_unbalanced)
auc_roc = auc(fpr, tpr)
# AUC-ROC может быть 0.7+ даже для плохой модели

from sklearn.metrics import precision_recall_curve
precision, recall, _ = precision_recall_curve(y_unbalanced, y_proba_unbalanced)
auc_pr = auc(recall, precision)
# AUC-PR более честная для дисбаланса

Практический пример: Fraud Detection

y_true = [1, 0, 1, 0, 0, 1, 1, 0, 0, 1]
y_scores = [0.9, 0.1, 0.8, 0.2, 0.15, 0.85, 0.7, 0.3, 0.1, 0.95]

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

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

optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print(f"Optimal threshold: {optimal_threshold:.2f}")

ROC для мультиклассовой классификации

from sklearn.preprocessing import label_binarize

n_classes = 3
y_bin = label_binarize(y_true, classes=range(n_classes))

для каждого класса i:
  вычисляем ROC как один класс vs остальные
  получаем AUC для каждого класса

Выводы

ROC кривая и AUC:

  • Показывают trade-off между TPR и FPR
  • AUC = отдельная числовая метрика (0-1)
  • AUC = 0.5 означает что модель работает как случайная
  • Удобны для сравнения моделей

Когда не использовать ROC:

  • Сильный дисбаланс классов → Precision-Recall
  • Мультиклассовая классификация → macro/weighted AUC