Машинное обучение
Метрики и оценка моделей
Вы построили ML-модель для диагностики редкого заболевания, и она показывает accuracy 99.5%. Руководство в восторге, модель запускают в продакшен. Через полгода выясняется: модель не обнаружила ни одного больного. Все 99.5% правильных ответов - это здоровые люди, которых и так 99.5% в выборке. Модель работала как заглушка, всегда отвечая «здоров». Как одно неправильно выбранное число может обмануть целую команду и почему accuracy - самая опасная метрика в ML?
- **Медицинская диагностика:** алгоритм Google для обнаружения диабетической ретинопатии на снимках глазного дна оценивается не по accuracy, а по recall (чувствительности) - пропущенная болезнь означает слепоту пациента. Порог специально смещён в сторону recall > 90%
- **Fraud detection в банках:** Visa и Mastercard оценивают модели антифрода по precision-recall кривой, а не accuracy. При 0.01% мошеннических транзакций accuracy бессмысленна. Лучшие модели достигают recall 95% при precision 80% - ловят 95 из 100 мошенников ценой 20% ложных тревог
- **Поисковые системы:** Google оценивает качество ранжирования через NDCG и MAP (вариации precision/recall) - метрики, которые учитывают не просто «правильно/неправильно», а порядок результатов. Страница, релевантная на 1-м месте, ценнее той же страницы на 10-м
Предварительные знания
Откуда взялись эти метрики
Большинство метрик, на которые мы опираемся, появились раньше машинного обучения. ROC-кривая родилась во время Второй мировой войны, когда операторам радаров приходилось решать, отметка на экране - это вражеский самолёт или шум; компромисс между обнаружением реальных целей и ложными тревогами и есть та самая кривая true positive против false positive, которую мы строим до сих пор. Precision и recall пришли в 1960-х из информационного поиска: эксперименты Сирила Кливердона в Крэнфилде измеряли, насколько хорошо поисковая система возвращает релевантные документы, не заваливая пользователя лишними. Матрица ошибок просто сводит четыре исхода, которые обе области заново открывали, true positive, false positive, true negative и false negative, в одну таблицу, из которой считается любая метрика классификации.
Accuracy и её ловушки
Вы обучили модель, она выдаёт предсказания. Но как понять, **хорошая** ли она? Первая метрика, которая приходит в голову - **accuracy** (точность): доля правильных ответов среди всех предсказаний. Формула проста: `accuracy = correct / total`. Если модель из 100 писем правильно классифицировала 92 - accuracy = 92%. Звучит понятно. Но эта простота обманчива.
90% accuracy - хороший результат? Не торопитесь радоваться. Представьте задачу: детектор мошеннических транзакций в банке. Из 10 000 транзакций только **50 мошеннические** (0.5%). Модель-пустышка, которая всегда предсказывает «легальная транзакция», получит accuracy = 9950 / 10000 = **99.5%**. При этом она **не обнаружит ни одного мошенничества**. Это и есть **accuracy paradox** - парадокс accuracy.
**Accuracy paradox** возникает при **несбалансированных данных** (imbalanced data) - когда один класс сильно преобладает над другим. В медицине (редкие болезни), кибербезопасности (атаки = 0.01% трафика), fraud detection - accuracy почти всегда вводит в заблуждение. Если в данных 99% одного класса, accuracy 99% **ничего не говорит** о качестве модели.
**Когда accuracy все-таки полезна:** - Данные **сбалансированы** (примерно поровну классов) - распознавание цифр MNIST, классификация настроения отзывов - Ошибки обоих типов **одинаково дороги** - нет разницы, пропустили спам или удалили важное письмо - Как **первая быстрая проверка** - но никогда как единственная метрика Во всех остальных случаях нужны более тонкие метрики: precision, recall, F1.
В задаче обнаружения редкой болезни (1% больных в выборке) модель всегда предсказывает 'здоров'. Какая у неё accuracy и почему это проблема?
Precision, Recall и F1-score
Accuracy обманула нас, потому что смешивает два разных типа ошибок в одно число. Чтобы разобраться, нужны две метрики, которые смотрят на ошибки по отдельности. **Precision** (точность) отвечает на вопрос: *«Из всех, кого модель назвала позитивными, сколько реально позитивны?»* **Recall** (полнота) отвечает на другой: *«Из всех реально позитивных, скольких модель нашла?»*
Представьте рыбака с сетью. **Recall** - это сколько рыбы он поймал из всей рыбы в озере. **Precision** - сколько из пойманного действительно рыба, а не мусор и водоросли. Широкая сеть поймает больше рыбы (высокий recall), но и мусора больше (низкий precision). Узкая сеть ловит только рыбу (высокий precision), но многие рыбы уплывают (низкий recall).
**F1-score** - это гармоническое среднее precision и recall: `F1 = 2 * precision * recall / (precision + recall)`. Почему гармоническое, а не обычное? Потому что оно **штрафует за дисбаланс**. Если precision = 1.0, а recall = 0.01, арифметическое среднее = 0.505 (звучит неплохо), а F1 = 0.02 (показывает, что модель почти не работает). F1 высокий только когда **обе** метрики хороши.
**Когда что важнее - precision или recall:** **Recall важнее** (нельзя пропустить!): - Диагностика рака - лучше лишний раз проверить здорового, чем пропустить больного - Обнаружение дефектов на конвейере - один бракованный товар может отозвать всю партию - Поиск утечек газа - пропущенная утечка = взрыв **Precision важнее** (нельзя ошибочно обвинить!): - Спам-фильтр - пользователь потеряет важное письмо, если оно попадёт в спам - Рекомендации контента детям - нельзя показать неподходящий материал - Автоматическая блокировка аккаунтов - заблокировать невиновного = потерять клиента
Вы разрабатываете систему раннего обнаружения пожаров в здании. Какая метрика должна быть приоритетной и почему?
ROC-кривая и AUC
Precision и recall зависят от выбранного **threshold** (порога). Но как оценить модель **целиком**, при всех возможных порогах сразу? Для этого существует **ROC-кривая** (Receiver Operating Characteristic). Она показывает, как меняется баланс между обнаружением позитивов и ложными тревогами при движении порога от 0 до 1.
**AUC** (Area Under the Curve) - площадь под ROC-кривой. Это одно число от 0 до 1, которое суммирует качество модели при всех порогах. AUC = 0.5 означает, что модель не лучше случайного подбрасывания монеты. AUC = 1.0 - идеальная модель. На практике AUC > 0.9 считается отличным, 0.8-0.9 - хорошим, 0.7-0.8 - приемлемым.
У AUC есть чёткая вероятностная интерпретация: это **вероятность того, что модель присвоит случайному позитивному примеру более высокую вероятность, чем случайному негативному**. Если AUC = 0.92, то в 92% случаев модель правильно ранжирует пару «больной, здоровый» - ставит больного выше.
**Когда ROC-AUC обманывает:** На сильно несбалансированных данных (0.1% позитивов) ROC-AUC может быть высоким, но модель при этом бесполезна. Причина: FPR = FP / (FP + TN). Когда TN огромно (99.9% данных), даже много ложных тревог FP не сильно увеличат FPR. **Альтернатива: PR-кривая** (Precision-Recall curve) - строит precision vs recall при разных порогах. PR-AUC лучше отражает качество модели на несбалансированных данных, потому что precision чувствительна к false positives.
**Краткий гид по выбору метрики:** - **Сбалансированные данные** -> ROC-AUC отлично работает - **Несбалансированные данные** -> PR-AUC надёжнее - **Важен конкретный порог** -> Precision, Recall, F1 при выбранном threshold - **Нужно сравнить модели** -> AUC (не зависит от порога) - **Нужно одно число** -> F1 (при фиксированном пороге) или AUC (без порога)
Модель для обнаружения мошенничества (0.1% fraud в данных) показывает ROC-AUC = 0.95. Можно ли утверждать, что модель отлично работает?
Confusion Matrix и мультиклассовая оценка
Все метрики, которые мы разобрали - accuracy, precision, recall, F1, AUC - вычисляются из четырёх базовых чисел: TP, FP, TN, FN. **Confusion matrix** (матрица ошибок) - это таблица, которая показывает все четыре числа сразу, давая полную картину того, **где именно** модель ошибается.
Для задач с **несколькими классами** confusion matrix расширяется. Если модель классифицирует изображения на «кошка», «собака», «птица» - матрица будет 3x3. Строка - реальный класс, столбец - предсказанный. Диагональ - правильные ответы, остальные ячейки - конкретные типы ошибок. Например, если модель часто путает кошек с собаками, это будет видно в соответствующей ячейке.
При нескольких классах precision, recall и F1 считаются **для каждого класса отдельно**, а потом агрегируются. Есть три стратегии агрегации: **Macro** - среднее по всем классам (каждый класс равноважен). **Micro** - считаем общие TP, FP, FN и из них одну метрику (каждый пример равноважен). **Weighted** - как macro, но с весами пропорционально размеру класса.
**Метрики для регрессии** (когда предсказываем число, а не класс): - **MAE** (Mean Absolute Error) - средняя абсолютная ошибка. Предсказали цену квартиры 5.2 млн, реальная 5.0 млн, ошибка = 0.2 млн. Интуитивно понятная метрика. - **MSE** (Mean Squared Error) - средняя квадратичная ошибка. Штрафует большие ошибки сильнее (ошибка в 10 раз больше -> штраф в 100 раз). - **R-squared (R2)** - доля дисперсии, объяснённая моделью. R2 = 1.0 - идеально, R2 = 0 - модель не лучше среднего, R2 < 0 - модель хуже, чем просто предсказывать среднее значение.
Существует одна универсальная метрика, которая подходит для любой ML-задачи, и нужно просто максимизировать её
Выбор метрики зависит от бизнес-контекста: цены разных типов ошибок, баланса классов и конечной цели. Часто нужно смотреть несколько метрик одновременно
В медицинской диагностике пропустить болезнь (FN) несопоставимо дороже ложной тревоги (FP) - приоритет recall. В спам-фильтре потерять важное письмо (FP) хуже пропущенного спама (FN) - приоритет precision. Одна метрика не может учесть все эти различия
В мультиклассовой задаче с 3 классами (90% класс A, 5% класс B, 5% класс C) вы получили Macro F1 = 0.45, Weighted F1 = 0.88. Что это значит?
Ключевые идеи
- **Accuracy paradox:** на несбалансированных данных accuracy обманывает - модель-пустышка может показать 99% accuracy и при этом не решать задачу. Balanced accuracy и другие метрики дают честную картину
- **Precision vs Recall:** precision - доля верных среди предсказанных позитивов, recall - доля найденных среди реальных позитивов. F1-score балансирует обе метрики через гармоническое среднее
- **ROC-AUC** оценивает модель при всех порогах сразу, но на сильно несбалансированных данных завышает результат - тогда лучше использовать PR-AUC
- **Confusion matrix** показывает полную картину ошибок, а macro/micro/weighted averaging агрегируют метрики для нескольких классов. Не существует одной универсальной метрики - выбор зависит от цены ошибки, поэтому модель с accuracy 99.5% может оказаться бесполезной, как мы видели в начале
Связанные темы
Метрики - инструмент оценки, но их ценность раскрывается в контексте конкретных алгоритмов и методологий:
- Типы машинного обучения — Выбор метрик зависит от типа задачи: classification (precision, recall, F1, AUC) vs regression (MSE, MAE, R2) vs clustering (silhouette, inertia)
- Подготовка данных — Несбалансированные данные - главная причина accuracy paradox. Методы балансировки (oversampling, undersampling, SMOTE) напрямую влияют на метрики
- Логистическая регрессия — Первый алгоритм классификации, где threshold напрямую управляет precision-recall trade-off и формирует ROC-кривую
- Кросс-валидация — Метрики нужно считать правильно - на отложенных данных. Кросс-валидация даёт надёжную оценку метрик и защищает от переобучения
Вопросы для размышления
- Если вы разрабатываете модель для автоматического одобрения кредитов, что дороже - одобрить мошеннику (FP) или отказать честному клиенту (FN)? Как это влияет на выбор метрики и порога?
- Почему F1-score использует гармоническое среднее, а не арифметическое? В каких ситуациях разница между ними будет максимальной?
- Представьте, что вы сравниваете две модели: одна имеет AUC = 0.85, другая - AUC = 0.80, но при конкретном пороге вторая даёт лучший F1. Какую модель вы выберете и почему?
Связанные уроки
- ml-02-types — Метрики зависят от типа задачи: классификация vs регрессия
- ml-06-linear-regression — MSE, RMSE, R^2 - метрики для регрессионных моделей
- ml-10-logistic-regression — Precision/recall/ROC-AUC - метрики для классификации
- aie-31-evaluation