← Назад к вопросам

Что такое precision и recall? Когда важнее каждая из метрик?

1.3 Junior🔥 221 комментариев
#Метрики и оценка моделей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Precision и Recall: ключевые метрики классификации

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

Определения

Precision (точность) — доля верных положительных предсказаний среди всех положительных предсказаний модели:

Precision = TP / (TP + FP)

где:

  • TP (True Positive) — верно классифицированы положительные примеры
  • FP (False Positive) — ошибочно классифицированы отрицательные примеры как положительные

Precision отвечает на вопрос: "Если модель предсказала положительный класс, насколько она права?"

Recall (полнота) — доля верно найденных положительных примеров среди всех фактически положительных примеров:

Recall = TP / (TP + FN)

где:

  • FN (False Negative) — ошибочно классифицированы положительные примеры как отрицательные

Recall отвечает на вопрос: "Какую часть положительных примеров модель смогла найти?"

Визуализация матрицы ошибок

                  Предсказано Positive | Предсказано Negative
Фактически Positive      TP              |         FN
Фактически Negative      FP              |         TN

Precision = TP / (TP + FP)  — вертикальная доля в левой колонке
Recall = TP / (TP + FN)     — горизонтальная доля в верхней строке

Пример на реальных данных

Предположим, модель выявления спама обработала 100 сообщений:

from sklearn.metrics import precision_score, recall_score, confusion_matrix

# Фактические значения
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]  # 1 = спам, 0 = не спам

# Предсказания модели
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 1, 0]

precision = precision_score(y_true, y_pred)  # 0.75
recall = recall_score(y_true, y_pred)        # 0.75

# Матрица ошибок
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(f"TP={tp}, FP={fp}, FN={fn}, TN={tn}")
# TP=3, FP=1, FN=1, TN=5

# Precision = 3/(3+1) = 0.75 (75% предсказанных спамов действительно спам)
# Recall = 3/(3+1) = 0.75 (75% реального спама найдено моделью)

Trade-off между Precision и Recall

Обычно увеличение одной метрики влечёт снижение другой — это зависит от порога классификации:

from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt

# Получить вероятности вместо бинарных предсказаний
y_proba = model.predict_proba(X)[:, 1]

# Рассчитать метрики для разных порогов
precisions, recalls, thresholds = precision_recall_curve(y_true, y_proba)

# Найти оптимальный порог
f1_scores = 2 * (precisions * recalls) / (precisions + recalls + 1e-10)
optimal_idx = f1_scores.argmax()
optimal_threshold = thresholds[optimal_idx]

Когда что важнее?

Precision более важна когда:

  1. Ложноположительные результаты дорогие — например:
    • Спам-фильтры: неправильно удалить письмо дороже, чем пропустить спам
    • Медицинская диагностика (опухоль): ложная тревога приводит к ненужному лечению
    • Системы обнаружения мошенничества: блокировать легального пользователя — плохо
# Высокий порог для Precision
model.predict(X_proba_score > 0.8)  # Требуем высокую уверенность

Recall более важен когда:

  1. Ложноотрицательные результаты дорогие — например:
    • Медицинская диагностика (рак): пропустить болезнь опаснее, чем ложная тревога
    • Поиск преступников: лучше проверить 100 невиновных, чем отпустить 1 виновного
    • Системы безопасности: пропустить угрозу критично
# Низкий порог для Recall
model.predict(X_proba_score > 0.3)  # Лучше пропустить несколько, чем упустить нужное

Сбалансированные метрики

Когда обе метрики одинаково важны, используют:

F1-score — гармоническое среднее:

F1 = 2 * (Precision * Recall) / (Precision + Recall)

F-beta score — если одна метрика важнее другой:

# beta=2: Recall в 2 раза важнее Precision
F2 = 5 * (Precision * Recall) / (4 * Precision + Recall)

Практический пример выбора метрики

from sklearn.metrics import classification_report

print(classification_report(y_true, y_pred))

#              precision    recall  f1-score   support
#           0       0.83      0.83      0.83        6
#           1       0.75      0.75      0.75        4

# Если больше Precision важен → выбрать высокий порог
# Если больше Recall важен → выбрать низкий порог

На практике я всегда начинаю с Confusion Matrix и Classification Report, чтобы понять контекст задачи и выбрать правильный порог классификации.

Что такое precision и recall? Когда важнее каждая из метрик? | PrepBro