Accuracy vs F1-score

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Зачем это различать

На собеседовании ML-вопрос уровня middle+: «accuracy 99% — это хорошая модель?». Правильный ответ: «зависит». Если классы сбалансированы — да. Если imbalanced (например, 1% fraud) — accuracy 99% можно получить, просто сказав «всегда 0». Бесполезная модель с идеальной метрикой.

Вот почему нужен F1-score и другие метрики. Они не обманывают на несбалансированных данных. Когда работаете с churn prediction, fraud detection, rare disease — accuracy точно недостаточно.

В статье:

  • Формулы и интуиция
  • Когда accuracy ок
  • Когда F1 нужен
  • Precision, recall — из чего F1
  • ROC AUC как альтернатива
  • Practical trade-offs

Короткий ответ

  • Accuracy = (TP + TN) / Total — доля правильных предсказаний
  • F1-score = гармоническое среднее precision и recall

Accuracy работает на сбалансированных классах. F1 — когда классы имбалансированы.

Пример когда accuracy обманывает

Классификация fraud:

  • 990 legit транзакций
  • 10 fraud

Модель, которая всегда говорит «не fraud»:

  • Accuracy = 990 / 1000 = 99%

Но модель не поймала ни одной fraud-транзакции. Метрика 99% — обман.

Precision и Recall

Precision

Precision = TP / (TP + FP)

«Из предсказанных как fraud — сколько реально fraud?»

Высокая precision → мало false positives.

Recall (sensitivity)

Recall = TP / (TP + FN)

«Из реальных fraud — сколько поймали?»

Высокий recall → мало false negatives.

F1-score

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

Гармоническое среднее. Высокий только если оба высокие.

Для fraud пример:

  • Precision = 80% (из предсказанных fraud — 80% настоящие)
  • Recall = 60% (поймали 60% реальных fraud)
  • F1 = 2 × 0.8 × 0.6 / (0.8 + 0.6) = 0.686

Когда использовать что

Accuracy подходит

  • Сбалансированные классы (50/50 или 40/60)
  • Все классы одинаково важны
  • Простая классификация (кот vs собака)

F1 / precision / recall — для imbalanced

  • Fraud detection (1% fraud)
  • Rare disease diagnosis (1% positive)
  • Churn в стабильном продукте (5% churn)
  • Spam filter

Precision важнее

Когда false positives дорого:

  • Spam: лучше пропустить spam, чем пометить важное
  • Medical: лучше перепроверить, чем ложная тревога

Recall важнее

Когда false negatives дорого:

  • Fraud: лучше проверить legit, чем пропустить fraud
  • Cancer screening: лучше ложная тревога, чем пропустить рак

F-beta score

Обобщение F1 с весом:

F_beta = (1 + β²) × (Precision × Recall) / (β² × Precision + Recall)
  • β = 1 → F1 (баланс)
  • β = 0.5 → F0.5 (precision важнее)
  • β = 2 → F2 (recall важнее)

Confusion matrix

Полная картина:

                    Predicted
                0         1
Actual  0   [ TN  |  FP ]
        1   [ FN  |  TP ]

Из неё выводятся все метрики.

ROC AUC — альтернативная метрика

ROC AUC = площадь под ROC curve (TPR vs FPR).

  • AUC = 0.5 → случайная модель
  • AUC = 1.0 → идеальная
  • AUC = 0.8 → хорошая

Плюс: threshold-independent (F1 зависит от threshold 0.5). Минус: optimistic на imbalanced (лучше PR-AUC).

В Python

from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report

y_true = [0, 0, 1, 1, 0, 1]
y_pred = [0, 1, 1, 1, 0, 0]

accuracy_score(y_true, y_pred)   # 0.667
precision_score(y_true, y_pred)  # 0.667
recall_score(y_true, y_pred)     # 0.667
f1_score(y_true, y_pred)         # 0.667

# всё сразу
print(classification_report(y_true, y_pred))

На собесе

«Accuracy 99% — хорошо?» Зависит от баланса классов. Check precision + recall.

«Что такое F1?» Гармоническое среднее precision и recall.

«Что важнее в fraud — precision или recall?» Recall обычно (лучше перепроверить, чем пропустить fraud).

«F1 vs ROC AUC?» F1 — threshold-specific. ROC AUC — общая.

Частые ошибки

1. Accuracy на imbalanced

Классический фейл. Всегда смотрите precision/recall на imbalanced.

2. Оптимизировать F1 без context

F1 — компромисс. Иногда нужно только recall (медицина) или только precision (spam).

3. Макро vs Micro F1

Для multi-class:

  • Macro: среднее F1 по классам (все равнозначны)
  • Micro: per-sample, взвешенное

Выбирайте осознанно.

4. Threshold 0.5 default

Optimize threshold под бизнес-нужды, не брать 0.5 слепо.

Связанные темы

FAQ

F1 всегда лучше accuracy?

На imbalanced — да. На balanced — accuracy тоже ок.

Можно оба?

Конечно. Репортите всё: accuracy, precision, recall, F1, AUC.

Micro или Macro F1?

Macro — когда все классы равнозначны. Micro — когда больший вес большим классам.

F1 для regression?

Нет. F1 для classification. Для regression — RMSE, MAE.


Тренируйте ML — откройте тренажёр с 1500+ вопросами для собесов.