ROC-кривая и AUC: как оценить качество классификатора
🎯 Зачем это нужно?
Представь: ты создаёшь ИИ, который определяет, заболеет ли человек COVID-19 по анализу крови 🩸. Accuracy = 95% — отлично? НЕТ! Если в популяции болеют только 5%, то алгоритм “всегда говори здоров” тоже даёт 95%!
🏥 Медицинская диагностика: “Лучше ошибиться в сторону осторожности” 📧 Спам-фильтры: Gmail использует ROC для настройки порога — важные письма не должны попадать в спам 🎬 Рекомендации: Netflix настраивает алгоритмы так, чтобы рекомендовать фильмы, которые ты точно досмотришь 🔐 Кибербезопасность: Системы обнаружения вторжений должны ловить все атаки, но не блокировать обычных пользователей
📚 История вопроса
ROC (Receiver Operating Characteristic) придумали в 1941 году… британские радиолокаторщики! 📡 Во время Второй мировой нужно было отличить вражеские самолёты от своих на экране радара. Слишком чувствительный радар — ложная тревога при каждой птичке. Слишком грубый — пропустим настоящую угрозу.
Сегодня те же принципы используют все: от TikTok (какие видео показать) до беспилотников Tesla (что считать препятствием).
💡 Интуиция
[МЕДИА: image_01] Описание: Схема классификации с примерами больных/здоровых пациентов и решениями алгоритма Промпт: “educational illustration showing binary classification concept, sick vs healthy patients, algorithm predictions, true positives false positives visualization, medical theme, modern clean style, suitable for technical audience”
Любой бинарный классификатор можно представить как детектор с настраиваемой чувствительностью:
🔍 Высокая чувствительность: Ловим ВСЁ, но много ложных тревог
- Медицина: “Лучше лишний раз проверить”
- Спам-фильтр: блокирует всё подозрительное
🎯 Низкая чувствительность: Срабатываем только на явные случаи
- Уголовное право: “Презумпция невиновности”
- Автопилот: тормозит только при реальной опасности
ROC-кривая показывает, как меняется баланс при разных порогах принятия решения.
📐 Формальное определение
Для бинарной классификации у нас есть 4 исхода:
| Предсказание: + | Предсказание: - | |
|---|---|---|
| Реальность: + | TP (True Positive) | FN (False Negative) |
| Реальность: - | FP (False Positive) | TN (True Negative) |
True Positive Rate (TPR) = TP/(TP + FN) — доля правильно найденных положительных False Positive Rate (FPR) = FP/(FP + TN) — доля ложно обнаруженных среди отрицательных
ROC-кривая — график TPR от FPR при изменении порога классификации от 0 до 1.
AUC (Area Under Curve) — площадь под ROC-кривой. AUC ∈ [0, 1]:
- AUC = 0.5: случайное угадывание
- AUC = 1.0: идеальный классификатор
- AUC < 0.5: классификатор хуже случайного (но можно инвертировать!)
🔍 Примеры с разбором
Пример 1: COVID-тест
У нас есть тест-система с вероятностными предсказаниями:
| Пациент | Реальный статус | Вероятность болезни |
|---|---|---|
| 1 | Болен (+) | 0.9 |
| 2 | Здоров (-) | 0.1 |
| 3 | Болен (+) | 0.7 |
| 4 | Здоров (-) | 0.3 |
| 5 | Болен (+) | 0.6 |
| 6 | Здоров (-) | 0.2 |
[МЕДИА: image_02] Описание: Пошаговое построение ROC-кривой для примера с COVID-тестом Промпт: “step-by-step ROC curve construction diagram, threshold changes from 0 to 1, points plotting on TPR vs FPR axes, medical testing example, educational visualization, clean modern style”
Порог = 0.8: Только пациент 1 классифицируется как больной
- TP = 1, FP = 0, FN = 2, TN = 3
- TPR = 1/3 = 0.33, FPR = 0/3 = 0.00
Порог = 0.5: Пациенты 1, 3, 5 классифицируются как больные
- TP = 3, FP = 0, FN = 0, TN = 3
- TPR = 3/3 = 1.00, FPR = 0/3 = 0.00
Порог = 0.2: Все кроме пациента 2 классифицируются как больные
- TP = 3, FP = 2, FN = 0, TN = 1
- TPR = 3/3 = 1.00, FPR = 2/3 = 0.67
Пример 2: Сравнение моделей
🤖 Модель A: AUC = 0.95 (отличная для медицины)
🤖 Модель B: AUC = 0.75 (нормально для рекламы)
🤖 Модель C: AUC = 0.50 (бесполезная)
Но! В спам-фильтре важнее не пропустить важное письмо в спам (низкий FPR), даже если пропустим немного спама. Смотрим на левую часть ROC-кривой!
🎮 Практика
Базовый уровень 🟢
Задание 1: У тебя есть классификатор определения мошеннических транзакций. При пороге 0.7: TP=80, FP=20, TN=880, FN=20. Вычисли TPR и FPR.
Задание 2: Какая AUC лучше для детектора вирусов: 0.85 или 0.92? Обоснуй.
Задание 3: ROC-кривая проходит через точки (0,0), (0.2, 0.8), (1,1). Хорош ли такой классификатор?
Задание 4: В чём разница между accuracy и AUC? Когда AUC важнее?
Продвинутый уровень 🟡
Задание 5: У модели A: AUC=0.9, но при низких FPR работает хуже модели B с AUC=0.8. Как это возможно?
Задание 6: Создай датасет из 10 примеров, где случайный классификатор даст AUC ≠ 0.5.
Задание 7: Почему для несбалансированных классов (1% положительных) точность может быть обманчивой, а AUC — нет?
Задание 8: Система рекомендует товары: TPR=0.6, FPR=0.1. Изменили порог: TPR=0.8, FPR=0.3. Какое решение лучше для бизнеса?
Челлендж 🔴
Задание 9: Докажи, что AUC равна вероятности того, что случайно выбранный положительный пример получит более высокий score, чем случайно выбранный отрицательный.
Задание 10: Как связаны ROC-кривая и Precision-Recall кривая? В каких случаях PR-кривая информативнее?
Задание 11: Предложи способ вычисления AUC для многоклассовой классификации (One-vs-Rest vs One-vs-One).
⚠️ Частые ошибки
❌ Ошибка: “AUC = 0.85 всегда лучше AUC = 0.80” ✅ Правильно: Зависит от задачи и важной области ROC-кривой 💡 Почему: В медицине важнее левая часть (низкий FPR), в поиске документов — верхняя (высокий TPR)
❌ Ошибка: “Optimizing accuracy оптимизирует и AUC”
✅ Правильно: Это разные метрики, особенно при несбалансированных классах
💡 Почему: Accuracy учитывает распределение классов, AUC — нет
❌ Ошибка: “ROC-кривая всегда возрастающая” ✅ Правильно: Иногда может “дёргаться” из-за малой выборки 💡 Почему: При изменении порога может одновременно измениться и TP, и FP
🎓 Главное запомнить
✅ ROC показывает trade-off между чувствительностью и специфичностью при разных порогах
✅ AUC — это вероятность правильного ранжирования случайной пары примеров
✅ AUC не зависит от распределения классов, в отличие от accuracy
✅ Выбор метрики зависит от цены ошибок I и II рода в конкретной задаче
🔗 Связь с другими темами
Из урока 307 мы знаем матрицу ошибок — ROC использует те же TP, FP, TN, FN.
Дальше изучим Precision-Recall кривые (важны при сильном дисбалансе классов), калибровку вероятностей и cost-sensitive обучение.
В глубоком обучении AUC оптимизируют через AUC loss или используют focal loss для сложных случаев.
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку