Ответ
Precision (точность) и Recall (полнота) измеряют разные аспекты работы модели, и их раздельный анализ критически важен для понимания компромиссов.
- Precision (Точность):
TP / (TP + FP)— доля правильно предсказанных положительных объектов среди всех объектов, которые модель назвала положительными. Важен, когда цена ложного срабатывания (False Positive) высока. Например, в спам-фильтре: пометив легитимное письмо как спам (FP), вы можете потерять важное сообщение. - Recall (Полнота):
TP / (TP + FN)— доля правильно найденных положительных объектов среди всех реально положительных объектов. Критичен, когда пропуск положительного объекта (False Negative) недопустим. Например, в диагностике тяжелого заболевания: пропустить болезнь (FN) гораздо опаснее, чем провести дополнительное обследование здорового пациента (FP).
F1-score — это гармоническое среднее Precision и Recall. Он полезен для сравнения моделей одним числом, но скрывает причинно-следственную связь. Модели с одинаковым F1 могут иметь совершенно разный баланс Precision/Recall, что делает их непригодными для разных бизнес-задач.
Пример на Python:
from sklearn.metrics import precision_score, recall_score, f1_score
y_true = [1, 1, 0, 1, 0, 0, 0]
y_pred = [1, 0, 1, 1, 0, 0, 0] # Модель агрессивно ставит "1"
print(f'Precision: {precision_score(y_true, y_pred):.2f}') # 0.67 (2 из 3 предсказанных "1" верны)
print(f'Recall: {recall_score(y_true, y_pred):.2f}') # 0.67 (нашла 2 из 3 реальных "1")
print(f'F1-score: {f1_score(y_true, y_pred):.2f}') # 0.67
На практике выбор метрики (Precision, Recall или их комбинация) определяется стоимостью ошибок в конкретной задаче.
Ответ 18+ 🔞
А, ну вот, опять эти ваши метрики! Сидишь такой, думаешь: ну всё, модель готова, сейчас как запустим — и будет нам счастье. А потом смотришь на цифры и понимаешь — нихуя не понятно. Как будто на дворе 2002-й год и тебе вручили калькулятор с кнопками, которые называются «Precision» и «Recall». Нажимаешь на одну — тебе одно говорят, на другую — вообще противоположное. Ёпта, волнение ебать.
Так, слушай сюда, разжую, как для себя. Представь, что ты — охранник на стройке (это наша модель). Твоя задача — ловить мудаков, которые таскают кирпичи (это положительный класс, «1»).
-
Precision (Точность) — это про то, чтобы не хватать за жопу невиновных. Допустим, ты задержал 10 человек. Если из них 8 реально были с кирпичами в штанах, а двое — просто рабочие шли покурить, то твоя точность — 80%. Эта хуйня важна, когда ложная тревога стоит дорого. Ну, типа, если ты в спам-фильтре пометишь письмо от начальника о премии как спам — это будет пиздец. Цена ошибки — овердохуища. Тебе нужна высокая точность, чтобы не облажаться.
-
Recall (Полнота) — это про то, чтобы ни один вор не ушёл. Допустим, со стройки за день реально сбежало 10 воров. Если ты поймал из них 9, а один ушёл через дыру в заборе, то твоя полнота — 90%. Эта штука критична, когда пропустить хулигана — смерти подобно. Как в диагностике рака: лучше 100 раз ошибиться и отправить здорового на допобследование (FP), чем один раз пропустить больного (FN) и отправить его домой помирать. Полнота должна быть задрана в небеса.
А теперь смотри, в чём подвох. Обычно эти две метрики — как хуй и пальто: когда одна растёт, другая падает. Если ты будешь хватать всех подряд на выходе (высокий Recall), то среди задержанных будет курящих рабочих, прорабов и кота местного (низкий Precision). Если будешь брать только тех, у кого из штанов торчит кирпич (высокий Precision), то половина воров, которые кирпич под курткой пронесли, спокойно уйдут (низкий Recall).
А F1-score — это такая хитрая жопа, которая пытается усреднить эти две противоположности. Типа, гармоническое среднее, блядь. Оно даёт одно число для сравнения, но это как оценивать машину по средней температуре в салоне и багажнике. Может быть 25 градусов, и при этом в салоне пиздец как жарко, а в багажнике — холодрыга. Две модели с одинаковым F1 = 0.7 могут быть абсолютно разными: одна — параноик, который всех подряд ловит (Recall=0.9, Precision=0.5), другая — пофигист, который орёт только на самых очевидных воров (Precision=0.9, Recall=0.5). Для бизнеса разница — как между хуем и винтом.
Вот, смотри на код, тут всё наглядно:
from sklearn.metrics import precision_score, recall_score, f1_score
y_true = [1, 1, 0, 1, 0, 0, 0] # Реальность: вот эти трое — воры, остальные — нет.
y_pred = [1, 0, 1, 1, 0, 0, 0] # Наш охранник: он предсказал трёх воров. Но один из них — ошибка (второй элемент 0), а ещё одного вора он пропустил (второй элемент в y_true).
print(f'Precision: {precision_score(y_true, y_pred):.2f}') # 0.67 (2 из 3 его подозрений верны)
print(f'Recall: {recall_score(y_true, y_pred):.2f}') # 0.67 (он нашёл 2 из 3 реальных воров)
print(f'F1-score: {f1_score(y_true, y_pred):.2f}') # 0.67 (ну, средненько так)
Короче, суть в чём: прежде чем смотреть на цифры, сядь и подумай — а что для тебя страшнее: ложная тревога или пропущенная цель? Ответ на этот вопрос и решит, на какую метрику давить. А F1 — это так, для галочки в отчёте, чтобы начальство, которое нихуя не шарет, кивнуло и сказало «молодцы».