Что такое F1 score
Что такое F1
F1 score — метрика качества классификационной модели, объединяющая precision и recall в одно число. Используется там, где accuracy может ввести в заблуждение — обычно на несбалансированных данных.
Классический пример: модель детекции фрода. Фрод случается в 0.1% транзакций. Модель, которая всегда говорит «не фрод», имеет accuracy 99.9%, но не ловит ни одного мошенника. F1 такой модели — 0, правильно показывая, что она бесполезна.
Формула
F1 = 2 × precision × recall / (precision + recall).
Это гармоническое среднее двух метрик. Гармоническое означает, что если одна из них очень маленькая, F1 тоже будет маленьким — не получится компенсировать плохой precision отличным recall.
Значения F1 — от 0 до 1. Чем ближе к 1, тем лучше баланс precision и recall.
Precision и recall — напоминание
Precision: из всех предсказаний «positive», сколько реально positive. Отвечает на вопрос «насколько модель не сгущает краски».
Recall: из всех реальных positive, сколько модель поймала. Отвечает на вопрос «насколько модель ничего не пропускает».
Эти две метрики часто противоречат. Можно получить идеальный precision (1.0), предсказывая «positive» только для самых уверенных случаев — тогда recall будет низким. Или идеальный recall, предсказывая «positive» всем — тогда precision упадёт.
F1 заставляет одновременно держать обе метрики высокими. Это компромисс.
Пример
Классификация 1000 email как спам / не спам. Реально спама — 100. Модель предсказала спам в 150 email. Из них 90 — действительно спам.
True Positives (TP) = 90. False Positives (FP) = 60 (не спам, а модель сказала спам). False Negatives (FN) = 10 (спам, а модель сказала не спам).
Precision = 90 / (90 + 60) = 0.6. Recall = 90 / (90 + 10) = 0.9. F1 = 2 × 0.6 × 0.9 / (0.6 + 0.9) = 0.72.
Попробовать силы на подобных вопросах проще всего в тренажёре Карьерник — прямо в Telegram, без регистрации через сайт.
Когда использовать F1
F1 идеален, когда precision и recall одинаково важны. Хороший пример — поисковая система: нужно и показывать релевантные результаты (precision), и не пропустить их (recall).
Другая ситуация — несбалансированные классы. Для задач, где positive class — редкий (фрод, rare desease, churn), accuracy бесполезна, а F1 даёт осмысленную оценку.
F1 также удобна для сравнения моделей. Одна цифра, по которой видно, какая модель лучше в среднем.
Когда не использовать
Если precision и recall имеют разный вес — F1 вам не нужен. Например, в медицинской диагностике пропустить больного опаснее, чем дать ложную тревогу. Здесь важнее recall. Можно использовать F-beta score с beta > 1 (например, F2).
Если у вас сбалансированные классы и цена false positive = цена false negative, может быть достаточно accuracy. F1 там избыточен.
F-beta
F1 — частный случай более общей метрики F-beta:
F-beta = (1 + beta²) × precision × recall / (beta² × precision + recall).
- beta = 1: F1, равный вес precision и recall.
- beta > 1: больше веса recall. F2 — recall в 2 раза важнее.
- beta < 1: больше веса precision. F0.5 — precision в 2 раза важнее.
Для fraud detection часто используют F0.5 (precision важнее — мало ложных тревог). Для медицинской диагностики — F2 или F3 (recall важнее — не пропустить больного).
F1 для multi-class
Для задач с тремя и больше классами есть варианты:
- Micro F1 — считает precision и recall глобально, потом F1. Для сильно несбалансированных.
- Macro F1 — F1 для каждого класса отдельно, потом среднее. Даёт равный вес всем классам.
- Weighted F1 — F1 для каждого класса, взвешенное по размеру класса.
Каждый отвечает на свой вопрос. Для repot обычно показывают все три.
Расчёт в Python
from sklearn.metrics import f1_score, precision_score, recall_score, classification_report
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}')
print(f'F1: {f1_score(y_true, y_pred):.3f}')
# Для multi-class
print(classification_report(y_true, y_pred))classification_report даёт сразу все метрики по каждому классу.
Пройти 30–50 задач по теме за вечер можно в Telegram-тренажёре. Это то, что отличает «знаю» от «уверенно отвечу на собесе».
F1 vs AUC
F1 и AUC — обе оценивают классификационные модели, но разные.
AUC (Area Under ROC Curve) — общая метрика separability классов. Не зависит от threshold — показывает качество модели в среднем.
F1 зависит от конкретного threshold. Можно выбирать разные пороги и смотреть, как меняется F1. Optimal threshold для F1 — то, при котором F1 максимальный.
Для production-модели обычно сначала смотрят AUC (общее качество), потом оптимизируют F1 для выбранного threshold.
Интерпретация для бизнеса
F1 = 0.8 — «модель хорошая, по балансу precision и recall на уровне выше 80%».
F1 = 0.5 — «средне, значительная часть предсказаний либо пропущена, либо ложна».
F1 = 0.2 — «плохо, модель мало что ловит правильно».
Но интерпретация зависит от baseline. Если базовая вероятность класса 1%, F1 0.5 может быть отличным результатом. Всегда сравнивайте с чем-то (baseline, другая модель, прошлая итерация).
Читайте также
FAQ
F1 и accuracy — в чём разница?
Accuracy — доля правильных предсказаний. F1 — баланс precision и recall. На несбалансированных F1 информативнее.
Что выше — F1 или accuracy?
На сбалансированных данных обычно одинаково. На несбалансированных accuracy часто выше (модель может быть плохой, но accuracy 90% из-за majority class).
F1 0.9 — это отлично?
Да. Но всегда смотрите на baseline — иногда baseline 0.85, и 0.9 — лишь слегка лучше.
F1 работает для регрессии?
Нет, только для классификации. Для регрессии есть R², RMSE.