Что такое 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. Если одна сильнее — смотрите саму метрику.