Как ответить
Precision при заданном значении recall — это не какая-то отдельная формула, а вычисление precision на конкретной точке PR-кривой. Если recall фиксирован (например, 0.8), то это значит, что мы отбираем модель или порог решения так, чтобы доля TP среди всех реальных положительных объектов (TP+FN) была ровно 0.8. Дальше, зная разметку и предсказания модели на этом пороге, мы просто считаем precision как TP / (TP + FP).
На практике это часто нужно при сравнении моделей с разной вероятностной калибровкой или при бизнес-требованиях: «нам важно покрыть 80% всех мошеннических транзакций». Тогда мы фиксируем recall на 0.8, подбираем порог на валидационной выборке и смотрим, какой precision получается. Если идеальная разметка — это ground truth без ошибок, то все расчёты точны, но на тестовой выборке с разбалансированными классами precision может сильно просесть из-за FP.
Подход к расчёту пошагово:
- Получить предсказанные вероятности модели для каждого объекта тестовой выборки.
- Отсортировать объекты по убыванию вероятности.
- Для каждого объекта (каждого порога) посчитать кумулятивное количество TP и FP на текущем сегменте.
- Recall на каждом пороге = TP / (TP + FN), где FN = общее количество реальных положительных объектов минус TP.
- Найти порог, при котором recall ближе всего к заданному (например, 0.8). Если точного совпадения нет — берём ближайший или интерполируем (хотя на практике редко нужно).
- На этом пороге precision = TP / (TP + FP).
Пример кода на Python для иллюстрации:
import numpy as np
from sklearn.metrics import precision_recall_curve
y_true = np.array([1, 0, 1, 1, 0, 1, 0, 1, 0, 0])
y_scores = np.array([0.9, 0.8, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, 0.05, 0.01])
precisions, recalls, thresholds = precision_recall_curve(y_true, y_scores)
target_recall = 0.8
# находим индекс, где recall ближе всего к target (слева от порога)
idx = np.argmin(np.abs(recalls - target_recall))
print(f'Precision при recall={recalls[idx]:.2f}: {precisions[idx]:.2f}, threshold={thresholds[idx]:.2f}')Важно: при идеальной разметке все FN и FP — это ошибки модели, а не разметки. Но если recall задан, а precision низкий — значит модель даёт много ложных срабатываний, и нужно либо улучшать качество предсказаний, либо снижать порог и жертвовать recall.