Что критичнее в задаче классификации: ложные срабатывания или ложноотрицательные срабатывания?

«Что критичнее в задаче классификации: ложные срабатывания или ложноотрицательные срабатывания?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Критичность типа ошибки целиком определяется бизнес-контекстом задачи и стоимостью ошибки.

  • Ложноотрицательные (False Negative, FN) критичнее, когда пропуск позитивного класса (объекта) имеет высокую цену. Примеры из моего опыта:

    • Медицинская диагностика: Пропуск злокачественной опухоли на снимке (FN) намного опаснее, чем ложная тревога (FP), которая проверяется дополнительными анализами.
    • Обнаружение мошенничества: Пропуск мошеннической транзакции (FN) ведет к прямым финансовым потерям. В таких случаях мы оптимизируем модель на полноту (Recall): Recall = TP / (TP + FN).
  • Ложные срабатывания (False Positive, FP) критичнее, когда ошибочное срабатывание создает значительные неудобства или затраты. Примеры:

    • Спам-фильтр: Попадание важного письма в спам (FP) хуже, чем пропуск одного спам-письма (FN).
    • Рекомендательная система: Показ абсолютно нерелевантного товара (FP) ухудшает пользовательский опыт. Здесь фокус на точность (Precision): Precision = TP / (TP + FP).

На практике мы используем метрики, объединяющие оба аспекта, и настраиваем порог классификации:

from sklearn.metrics import classification_report, precision_recall_curve
import matplotlib.pyplot as plt

# y_true, y_pred, y_proba - получены от модели
print(classification_report(y_true, y_pred))

# Построение Precision-Recall кривой для выбора порога
precisions, recalls, thresholds = precision_recall_curve(y_true, y_proba)
plt.plot(thresholds, precisions[:-1], label="Precision")
plt.plot(thresholds, recalls[:-1], label="Recall")
plt.legend()
# Выбор порога зависит от того, какую метрику важнее максимизировать