Что такое Precision и Recall

Что это такое

Precision и Recall — две основные метрики качества классификационных моделей. Они отвечают на разные вопросы и часто конфликтуют друг с другом.

Precision отвечает: из всех случаев, когда модель сказала «positive», сколько реально positive? Насколько модель не сгущает краски.

Recall отвечает: из всех реальных positive, сколько модель поймала? Насколько модель ничего не пропускает.

Формулы

Precision = TP / (TP + FP).

Recall = TP / (TP + FN).

Где:

  • TP (True Positive) — правильно предсказанные positive.
  • FP (False Positive) — не positive, но модель сказала positive.
  • FN (False Negative) — positive, но модель сказала negative.

Разберём на примере

Спам-фильтр в email. У вас 1000 писем, из них 100 — реальный спам.

Модель помечает 120 писем как спам. Из них 90 — действительно спам.

TP = 90, FP = 30 (не спам, но модель сказала спам), FN = 10 (спам, но модель пропустила).

Precision = 90 / 120 = 0.75. 75% писем, помеченных как спам, действительно спам.

Recall = 90 / 100 = 0.9. Модель поймала 90% реального спама.

Trade-off

Precision и recall почти всегда противоречат. Хотите повысить один — второй упадёт.

Представьте, что модель выдаёт вероятность быть positive от 0 до 1. При низком threshold (0.3) модель помечает много как positive — recall высокий, но много ложных срабатываний, precision низкий.

При высоком threshold (0.9) модель осторожна — только самые уверенные positive. Precision высокий, но многих positive модель пропустит, recall низкий.

Задача аналитика — найти правильный баланс для конкретной задачи.

Попробовать силы на подобных вопросах проще всего в тренажёре Карьерник — прямо в Telegram, без регистрации через сайт.

Когда precision важнее

В spam-фильтре precision важнее. Лучше пропустить один спам в inbox, чем отправить важное письмо в папку «спам». Ошибка FP (ошибочно помеченное письмо) хуже ошибки FN.

В рекомендациях товаров. Показать пользователю нерелевантный товар — плохо (отвлекает, раздражает). Пропустить релевантный — не так критично, покажем другой.

В content moderation. Ошибочно заблокировать нормальный контент — скандал в соцсетях. Пропустить плохой — неприятно, но fixable.

Когда recall важнее

В медицинской диагностике recall важнее. Пропустить больного (FN) опаснее, чем дать ложную тревогу (FP). Лучше дополнительно обследовать 10 здоровых, чем упустить одного больного.

В fraud detection. Пропустить мошенника (FN) — компания теряет деньги. Ложная тревога (FP) — клиент немного раздражён, но легко восстановить доверие.

В поиске пропавших людей. Пропустить человека — катастрофа. Ложные срабатывания — трата ресурсов.

Confusion Matrix

Полная картина классификации — это confusion matrix:

                Predicted
                No      Yes
Actual  No      TN      FP
        Yes     FN      TP
  • TN (True Negative) — правильно предсказали no.
  • TP (True Positive) — правильно предсказали yes.
  • FP (False Positive) — ошибочно сказали yes.
  • FN (False Negative) — ошибочно сказали no.

Из этой матрицы вычисляются все метрики:

  • Accuracy = (TP + TN) / all.
  • Precision = TP / (TP + FP).
  • Recall = TP / (TP + FN).
  • Specificity = TN / (TN + FP).

В Python

from sklearn.metrics import precision_score, recall_score, confusion_matrix

y_true = [0, 1, 1, 0, 1, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 1]

print(f'Precision: {precision_score(y_true, y_pred):.3f}')
print(f'Recall: {recall_score(y_true, y_pred):.3f}')

cm = confusion_matrix(y_true, y_pred)
print(cm)

confusion_matrix даёт матрицу, из которой можно считать любые метрики.

Precision-Recall кривая

Аналог ROC-кривой, но строится из precision и recall при разных threshold. Удобна на сильно несбалансированных данных, где ROC может быть overoptimistic.

from sklearn.metrics import precision_recall_curve

precision, recall, thresholds = precision_recall_curve(y_true, y_scores)

Average Precision (AP) — площадь под PR-кривой. Аналог AUC для PR.

Пройти 30–50 задач по теме за вечер можно в Telegram-тренажёре. Это то, что отличает «знаю» от «уверенно отвечу на собесе».

Пример выбора threshold

У вас fraud-модель, выдающая вероятность фрода. Стандартный threshold 0.5:

  • TP = 90 (поймали фрод).
  • FP = 300 (заблокировали нормальные транзакции).

Precision = 0.23, Recall = 0.9.

Бизнес недоволен: клиенты злятся на ложные блокировки. Повышаем threshold до 0.8:

  • TP = 70.
  • FP = 50.

Precision = 0.58, Recall = 0.7.

Теперь ловим меньше fraud, но и блокируем меньше нормальных. Выбор зависит от бизнес-аппетита к этим ошибкам.

Precision-recall на несбалансированных данных

На задачах с редким positive (fraud, rare desease) precision-recall информативнее, чем accuracy.

Если у вас 1% positive, модель, которая всегда говорит negative, имеет accuracy 99%. Но recall = 0 — модель бесполезна. Precision-recall сразу показывают это.

Читайте также

FAQ

Что важнее — precision или recall?

Зависит от задачи. Медицина — recall. Spam-фильтр — precision. Всегда уточняйте контекст.

Как повысить одно, не жертвуя другим?

Улучшить модель в целом: больше данных, лучше features, другая архитектура. Иначе это trade-off.

Precision-recall vs accuracy?

Для несбалансированных классов — precision-recall. Для сбалансированных обычно оба дают похожие выводы.

F1 лучше precision или recall?

F1 — это компромисс между ними. Если важны обе примерно одинаково — F1. Если одна сильнее — смотрите саму метрику.