Когда лучше использовать F-меру (F1-score)?

«Когда лучше использовать F-меру (F1-score)?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

F1-score — это моя основная метрика в задачах классификации с сильным дисбалансом классов, где одинаково важны и точность (Precision), и полнота (Recall). Я применяю её, когда и ложноположительные (False Positive), и ложноотрицательные (False Negative) ошибки имеют серьёзные последствия.

Типичные сценарии из моего опыта:

  1. Обнаружение мошенничества (Fraud Detection): Пропуск мошеннической операции (FN) ведёт к убыткам, а блокировка легальной операции (FP) — к недовольству клиентов. F1 балансирует эти риски.
  2. Медицинская диагностика редких заболеваний: Важно найти как можно больше больных (высокий Recall), но при этом минимизировать количество ложных диагнозов, ведущих к стрессу и ненужному лечению (высокий Precision).
  3. Сегментация объектов на изображениях (Semantic Segmentation): Для оценки качества предсказания пикселей определённого класса (например, опухоль) на фоне большого количества фоновых пикселей.

Пример оценки модели детектора аномалий:

from sklearn.metrics import f1_score, classification_report

# y_true — реальные метки (1 — аномалия, 0 — норма),
# y_pred — предсказания модели
# Класс '1' (аномалия) составляет всего 5% данных

print(classification_report(y_true, y_pred))
#               precision    recall  f1-score   support
#            0       0.99      0.99      0.99      9500
#            1       0.85      0.80      0.82       500
#     accuracy                           0.98     10000
#    macro avg       0.92      0.89      0.91     10000
# weighted avg       0.98      0.98      0.98     10000

f1 = f1_score(y_true, y_pred, pos_label=1)
print(f"F1-score для класса 'аномалия': {f1:.3f}")  # Критичная для бизнеса метрика

Я бы не использовал F1, если классы сбалансированы и можно смотреть на Accuracy, или если бизнес-требование явно фокусируется только на одной метрике (например, в спам-фильтре иногда допустимо жертвовать Recall ради максимального Precision).