Ответ
F1-Score — это метрика для оценки бинарной классификации, которая объединяет Precision (точность) и Recall (полноту) в одно число. Это гармоническое среднее, которое особенно полезно при работе с несбалансированными классами, где accuracy может вводить в заблуждение.
Формула:
F1 = 2 * (Precision * Recall) / (Precision + Recall)
Почему это важно?
- Баланс: F1 не позволяет жертвовать одним показателем (например, Recall) ради другого (Precision).
- Несбалансированные данные: Если у вас 95% объектов одного класса и 5% другого, модель, всегда предсказывающая мажоритарный класс, будет иметь accuracy 95%, но F1-Score для миноритарного класса будет 0.
Пример расчета в Python:
from sklearn.metrics import f1_score
y_true = [0, 1, 1, 0, 1, 1, 0] # Фактические метки
# Модель пропустила один положительный случай (второй) и сделала одну ложную тревогу (последний)
y_pred = [0, 0, 1, 0, 1, 1, 1]
score = f1_score(y_true, y_pred)
print(f"F1-Score: {score:.4f}") # Output: F1-Score: 0.6667
Варианты для многоклассовой классификации:
macro: Усредняет F1 для каждого класса без учета дисбаланса.micro: Глобально подсчитывает TP, FP, FN и вычисляет общий F1.weighted: Усредняет F1 по классам с весом, равным поддержке класса (количеству истинных экземпляров).
Ответ 18+ 🔞
Давай разберем эту вашу метрику, а то смотришь на неё — и удивление пиздец, честно. F1-Score, блядь. Ну, типа, не просто точность, а чтоб с умом.
Смотри, есть у тебя модель, которая, допустим, ищет котиков на фото. Precision — это когда она нашла пяток котиков, но из них только три реально котики, а два — это хрен знает что, тапок и бородатый мужик. То есть, доверия ебать ноль. А Recall — это когда на картинке их десять штук, а она нашла только троих, остальные семь сидят и ржут с неё. Оба показателя по отдельности — хуй с горы, если честно.
Вот F1-Score — это такая хитрая жопа, которая их скрещивает. Формула простая, но важная: F1 = 2 * (Precision * Recall) / (Precision + Recall). Она как бы говорит: «Э, бошка думай, чувак! Не гонись только за тем, чтобы меньше тапков в ответах было, и не забрасывай поиск остальных котиков». Баланс, ёпта.
Особенно это ебанько вылезает, когда классы несбалансированные. Представь, у тебя 95 фото тапков и 5 фото котиков. Модель может просто на всё забить и всегда говорить «тапок». Accuracy будет 95%, вау! А на деле она кота сука собака не нашла ни одного. F1 для класса «котик» будет ноль, и сразу видно, что модель — полупидор.
Вот, смотри на коде, как это посчитать, тут всё честно:
from sklearn.metrics import f1_score
# Наши реальные метки
y_true = [0, 1, 1, 0, 1, 1, 0]
# Что наша модель-распиздяйка наворотила: один котика пропустила, один тапок приняла за котика
y_pred = [0, 0, 1, 0, 1, 1, 1]
score = f1_score(y_true, y_pred)
print(f"F1-Score: {score:.4f}") # Output: F1-Score: 0.6667
Видишь? 0.6667. Не ахти, но и не ноль. Модель хоть как-то работает, но есть куда расти, я тебе в рот чих-пых.
А если классов больше двух, там уже начинается ёперный театр. Нужно выбирать, как усреднять:
macro: Просто берет F1 для каждого класса, складывает и делит. Все классы равны, даже если их там овердохуища или один.micro: Считает все ошибки и угадывания глобально, по сути accuracy для несбалансированных данных, только умная.weighted: Самый адекватный часто. Он дает вес каждому классу в зависимости от того, сколько там реальных примеров. Если котиков мало, их низкий F1 меньше потянет общую оценку вниз. Справедливо, хуй моржовый.
Короче, F1 — это не панацея, но манда с ушами, которая не даст тебя обмануть красивым процентом точности. Всегда смотри на неё, когда есть риск накосячить с миноритарным классом, а то будет вам хиросима и нигерсраки в продакшене.