КПКейсПрактика
Все материалы
MLгайдсредний

Precision, recall, F1 и ROC-AUC: как выбрать метрику для ML-модели

Разбираем precision, recall, F1, ROC-AUC и PR-AUC на одной задаче: как цена ошибки, дисбаланс классов и порог решения меняют вывод о качестве модели.

КПКейсПрактикаЗапланировано · 18 августа 2026 г.22 мин

У вопроса “какая метрика лучше?” нет ответа вне контекста. Для антифрода пропущенная мошенническая транзакция может стоить дорого, а для службы поддержки слишком много false positive быстро превратит модель в источник лишней работы. Поэтому качество классификатора нужно читать через матрицу ошибок, цену решения и выбранный порог, а не через одну красивую цифру.

Коротко

Precision отвечает на вопрос “какая доля найденных моделью позитивных объектов действительно позитивна”, recall — “какую долю всех позитивных объектов модель нашла”. F1 объединяет их в одно гармоническое среднее. ROC-AUC показывает, насколько хорошо модель ранжирует позитивные объекты выше негативных по всем порогам, но при сильном дисбалансе PR-AUC часто лучше отражает полезное качество.

  • Начни с определения positive class и стоимости false positive/false negative.
  • Не выбирай порог по умолчанию 0.5 без проверки бизнес-сценария.
  • Смотри на precision и recall вместе: рост одного часто покупается падением другого.
  • Для редкого positive class добавь PR-AUC и таблицу качества по сегментам.
  • Разделяй discrimination модели и calibration вероятностей.

Матрица ошибок — общий словарь

Любая бинарная классификация начинается с четырёх исходов. True positive — модель нашла объект нужного класса. False positive — модель сработала, но ошиблась. False negative — важный объект пропущен. True negative — негативный объект правильно оставлен без действия. Пока эти четыре клетки не названы, обсуждение метрик будет расплывчатым.

Базовое правило
positive class + threshold + cost of error

Одна и та же модель может иметь разное практическое качество при разных positive class и порогах.

Что произошло после решения модели
Факт / прогнозПозитивный прогнозНегативный прогноз
Позитивный фактTP · нашли нужный объектFN · пропустили объект
Негативный фактFP · ложная тревогаTN · корректно не сработали

Precision и recall отвечают на разные вопросы

Precision = TP / (TP + FP). Он важен, когда каждое срабатывание запускает дорогую ручную проверку, блокирует клиента или отправляет сообщение, которому нельзя часто ошибаться. Высокий precision означает, что среди найденных моделью объектов мало ложных тревог.

Recall = TP / (TP + FN). Он нужен, когда пропуск позитивного объекта опаснее лишней проверки. В антифроде это может быть пропущенная мошенническая операция, в медицинском скрининге — пропущенный риск, а в поиске документов — не найденный релевантный материал.

Обычно нельзя максимизировать обе метрики одновременно. Если снизить порог, модель начнёт находить больше позитивных объектов: recall вырастет, но вместе с ним может вырасти число FP и упасть precision. Поэтому правильный вопрос звучит не “какая метрика выше”, а “какой компромисс выдерживает процесс”.

Пример trade-off при изменении порога

Иллюстративные значения: порог выбирается после оценки стоимости ошибок и пропускной способности процесса.

precisionrecall

F1 полезен, когда нужен баланс

F1 = 2 × precision × recall / (precision + recall). Это гармоническое среднее, поэтому одна очень низкая компонента заметно тянет итог вниз. F1 удобен как компактная метрика для сравнения моделей при сопоставимом positive class и одинаковой стратегии выбора порога.

Но F1 не знает, какая ошибка дороже. Он одинаково относится к FP и FN. Если пропуск в пять раз опаснее ложной тревоги, лучше задать минимальный recall, а среди подходящих порогов выбрать вариант с лучшим precision или считать взвешенную F-бету. Не превращай F1 в универсальный KPI только потому, что его легко показать в таблице.

pythonСравнить несколько порогов на отложенной выборке
from sklearn.metrics import precision_score, recall_score, f1_score

for threshold in (0.2, 0.4, 0.6, 0.8):
    predicted = (proba >= threshold).astype(int)
    print({
        'threshold': threshold,
        'precision': precision_score(y_true, predicted),
        'recall': recall_score(y_true, predicted),
        'f1': f1_score(y_true, predicted),
    })

ROC-AUC: качество ранжирования, а не готового решения

ROC-AUC измеряет, насколько часто случайный positive получает от модели больший score, чем случайный negative. Порог не фиксирован: график проходит по возможным уровням чувствительности и false positive rate. Это делает ROC-AUC удобным для сравнения способности моделей разделять классы до выбора операционного порога.

Высокий ROC-AUC не гарантирует, что выбранный порог даст приемлемые precision и recall. Модель может хорошо ранжировать объекты, но быть плохо откалибрована или давать слишком много ложных срабатываний при редком positive class. Для редких событий посмотри PR-кривую: она напрямую показывает precision и recall по порогам.

Как читать набор метрик
МетрикаЧто показываетЧего не показывает
Precisionточность найденных позитивных объектовсколько позитивов пропущено
Recallдолю найденных позитивных объектовсколько ложных тревог внутри найденных
F1сбалансированное сочетание precision и recallразную стоимость FP и FN
ROC-AUCспособность ранжировать классыкачество конкретного порога
PR-AUCкачество precision-recall при дисбалансекалибровку вероятностей

Порог выбирается после модели

Порог — это часть продукта, а не случайная настройка в ноутбуке. Сначала получи score или вероятность на валидационной выборке, затем посмотри кривые и стоимость решений. Если у команды есть ограничение “не больше 500 проверок в день”, threshold можно подобрать под этот бюджет. Если есть SLA для recall, сначала зафиксируй минимальный recall, а потом оптимизируй precision.

Важно выбирать порог на данных, которые не использовались для обучения и подбора гиперпараметров. Иначе качество окажется завышенным. После запуска отдельно контролируй распределение score, долю срабатываний и фактическое качество по подтверждённым исходам.

ROC-AUC не заменяет анализ порога

AUC помогает сравнить ranking, но решение всегда живёт в конкретной точке кривой. Покажи эту точку и её бизнес-последствия.

  • Определи, какое действие запускает позитивный прогноз.
  • Назови допустимое число false positive и false negative.
  • Подбери threshold на validation, финально проверь на test.
  • Проверь стабильность precision и recall по сегментам.
  • Зафиксируй порог и причину его выбора в model card.

Дисбаланс классов меняет интерпретацию

При positive class в 1% даже 99% accuracy может означать, что модель всегда отвечает “нет” и не находит ни одного нужного объекта. Поэтому accuracy почти никогда не должна быть единственной метрикой для редкого события. Добавь baseline, confusion matrix, precision, recall и PR-AUC.

Сравнивай модели на одинаковом временном срезе и одинаковом positive class. Если поменялся sampling, class weight или правило разметки, числа могут стать несопоставимыми. В отчёте рядом с метрикой покажи support: сколько фактических positive и negative вошло в проверку.

Минимальный отчёт классификатора
support + confusion matrix + precision/recall + threshold

Без размера классов и порога одна метрика не даёт достаточного контекста.

Как ответить на ML-кейс на собеседовании

Сильный ответ начинается с уточняющего вопроса: что считается positive и какое действие следует за прогнозом. Затем назови стоимость FP и FN, предложи набор метрик и объясни, как выберешь threshold. Наконец, добавь проверку по сегментам и план мониторинга после запуска. Такой ответ показывает, что ты понимаешь не только формулы, но и место модели в процессе.

Не говори “возьмём ROC-AUC, потому что это стандарт”. Скажи, что ROC-AUC полезен для сравнения ranking, но для принятия решения нужны precision/recall на выбранном пороге, PR-AUC при дисбалансе и проверка calibration, если score интерпретируется как вероятность.

Продолжить чтение
Вся библиотека