Условие
В медицинском скрининге пропуск больного критичнее ложной тревоги. Какую метрику использовать вместо F1?
Решение
Подход
F1 даёт равный вес precision и recall: F1 = 2·P·R/(P+R).
F-beta даёт β² раз больший вес recall:
F_β = (1+β²)·P·R / (β²·P + R)
β=1: F1, симметрично.β=2: F2, recall в 4 раза важнее. Подходит для медскрининга, fraud.β=0.5: F0.5, precision в 4 раза важнее. Подходит для спам-фильтра (не хочется блокировать ham).
Реализация
from sklearn.metrics import fbeta_score, precision_recall_fscore_support
f2 = fbeta_score(y_true, y_pred, beta=2)
f05 = fbeta_score(y_true, y_pred, beta=0.5)
# Threshold optimization по F-beta
import numpy as np
def best_threshold_fbeta(y_true, y_prob, beta=2):
thresholds = np.linspace(0.01, 0.99, 99)
best_t, best_f = 0, 0
for t in thresholds:
pred = (y_prob >= t).astype(int)
f = fbeta_score(y_true, pred, beta=beta)
if f > best_f:
best_t, best_f = t, f
return best_t, best_fСвязь с cost matrix
F_β неявно предполагает, что cost FN = β² · cost FP (грубо). Это приближение реального cost-sensitive criteria. Точнее — expected cost минимизация (см. отдельную задачу).
Альтернативы
- Recall@fixed precision: «recall при precision ≥ 0.8».
- Precision@k: «precision среди top-k предсказаний».
- PR-AUC: площадь под precision-recall кривой; лучше чем ROC при сильном дисбалансе.
- MCC (Matthews correlation coefficient): балансирует все четыре класса confusion matrix.
Подводные камни
- F_β — это не cost matrix, это лишь reweighting. Для буквальных бизнес-costs лучше expected cost.
- F1 на сильно imbalanced (1%) почти всегда мал из-за низкого precision — это не значит, что модель плохая.
- F-beta не учитывает true negatives — может казаться, что модель плохая, хотя она хорошо отбирает negatives.
- Выбор β часто субъективен. Лучше: договориться с бизнесом про cost matrix → вывести threshold из неё, F-beta — fallback.
- Сравнение моделей по F1 на разных порогах — невалидно. Сравнивайте на edинном threshold-policy.
Эталонный ответ
F_β = (1+β²)·P·R/(β²·P+R), β>1 повышает вес recall, β<1 — precision. Для медскрининга F2 или F3. Лучше использовать expected cost matrix; F-beta — приближение через β² ≈ cost_FN/cost_FP.