В чем разница между F-мерой (F1-score) и ROC AUC?

«В чем разница между F-мерой (F1-score) и ROC AUC?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

F1-score (F-мера) и ROC AUC — метрики для оценки бинарных классификаторов, но они измеряют разные аспекты.

F1-Score

  • Что измеряет: Гармоническое среднее между Precision (точность) и Recall (полнота). Отражает баланс между ложными срабатываниями и пропущенными целями для конкретного порога классификации (обычно 0.5).
  • Формула: F1 = 2 * (Precision * Recall) / (Precision + Recall)
  • Когда использовать: Когда классы несбалансированы и важны оба типа ошибок. Например, в задачах поиска мошенничества (важно не пропустить мошенника — высокий Recall, и не заблокировать честного клиента — высокий Precision).

ROC AUC (Area Under the ROC Curve)

  • Что измеряет: Способность модели разделять два класса (отличить положительный от отрицательного) на всех возможных порогах. Показывает, насколько модель лучше случайного угадывания.
  • Диапазон: От 0 до 1. AUC = 0.5 — модель не лучше случайной, AUC = 1 — идеальное разделение.
  • Когда использовать: Для общей оценки качества модели, особенно когда распределение классов в будущем может измениться или когда порог классификации не фиксирован.

Ключевое отличие: F1-score — это конкретная точка на кривой (зависит от порога). ROC AUC — это интегральная характеристика качества разделения на всех порогах (не зависит от порога).

Пример на Python:

from sklearn.metrics import f1_score, roc_auc_score

y_true = [0, 1, 1, 0, 1]
y_pred_proba = [0.1, 0.9, 0.8, 0.3, 0.65] # вероятности класса 1

# Для F1 нужны бинарные предсказания. Применяем порог 0.5
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred_proba]
f1 = f1_score(y_true, y_pred_binary) # Оценивает качество при пороге 0.5

# ROC AUC работает с вероятностями
roc_auc = roc_auc_score(y_true, y_pred_proba) # Оценивает качество разделения в целом