Ответ
Критичность типа ошибки целиком определяется бизнес-контекстом задачи и стоимостью ошибки.
-
Ложноотрицательные (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()
# Выбор порога зависит от того, какую метрику важнее максимизировать