Ответ
F1-score — это моя основная метрика в задачах классификации с сильным дисбалансом классов, где одинаково важны и точность (Precision), и полнота (Recall). Я применяю её, когда и ложноположительные (False Positive), и ложноотрицательные (False Negative) ошибки имеют серьёзные последствия.
Типичные сценарии из моего опыта:
- Обнаружение мошенничества (Fraud Detection): Пропуск мошеннической операции (FN) ведёт к убыткам, а блокировка легальной операции (FP) — к недовольству клиентов. F1 балансирует эти риски.
- Медицинская диагностика редких заболеваний: Важно найти как можно больше больных (высокий Recall), но при этом минимизировать количество ложных диагнозов, ведущих к стрессу и ненужному лечению (высокий Precision).
- Сегментация объектов на изображениях (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).
Ответ 18+ 🔞
А, ну F1-score, классика жанра! Это ж как тот универсальный солдатик в метриках, когда у тебя в данных пиздец какой дисбаланс. Представь: у тебя 95% одних и 5% других, и если ты будешь смотреть на accuracy, то модель, которая тупо всех в большинство пихает, будет выглядеть как гений. А на деле — полный пиздец, потому что она все редкие, но важные кейсы просрёт.
Вот где F1 выходит на сцену, как хитрая жопа, которая заставляет и точность (Precision), и полноту (Recall) дружить. Типа, «эй, ребята, давайте без крайностей, а?». Если Precision — это «скольких из тех, кого я назвал больными, реально больны», а Recall — «скольких из реально больных я вообще нашёл», то F1 — это их гармоническое среднее. Не среднее арифметическое, нет, бля, это слишком просто. Оно наказывает, если одна из метрик в говне.
Где у меня это чаще всего вылезало, ёпта:
- Поиск мошенничества (Fraud Detection). Тут вообще волнение ебать. Если модель проморгает транзакцию (FN) — бизнес теряет бабки. А если она легальному клиенту карту заблокирует (FP) — клиент уйдёт, нахер, с криками и скандалом. F1 тут как раз и говорит: «Ищи баланс, долбоёб, нельзя ни туда, ни сюда крениться».
- Диагностика редких хворей. Ну тут вообще пипец. Пропустить больного (низкий Recall) — это, простите, почти преступление. Но и здорового человека загнать в онкодиспансер на химию из-за ложного срабатывания (низкий Precision) — тоже нихуя не вариант. Опять F1 в дело, чтобы найти эту хренову тропинку между пропастями.
- Сегментация на картинках. Особенно когда ищешь какую-нибудь хуйню размером с пиксель на фоне овердохуища фона. Точность по пикселям будет зашкаливать, если ты всё назовёшь фоном. А F1 для нужного класса сразу покажет, что ты — говно.
Вот смотри, как это в коде выглядит, на примере детектора аномалий:
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}") # Вот это и есть та самая важная циферка
Видишь? Accuracy 0.98 — красота! Но это пиздёж, потому что модель просто хорошо угадывает нормальные случаи. А вот F1 для класса «аномалия» — 0.82. Вот это уже честная оценка, как она справляется с тем, ради чего её, собственно, и делали.
Когда нахуй не нужен F1? Да когда классы ровные, 50 на 50, и можно на accuracy смотреть. Или когда задача кричит: «Мне похуй на ложные срабатывания, лишь бы ни одного настоящего не пропустить!» (тогда гоним Recall в космос). Или наоборот: «Ложные срабатывания — смерть, лучше десять пропустим» (тупаем Precision). А так — F1 частый гость в моих отчётах, чувак.