← Назад к вопросам
Что такое 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