← Назад к вопросам

Что более критично в классификации: больше ложных срабатываний или больше ложноотрицательных результатов?

1.8 Middle🔥 152 комментариев
#Машинное обучение

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ложные срабатывания vs Ложноотрицательные результаты: критичность в классификации

Это один из самых важных вопросов в практическом машинном обучении. Ответ зависит от конкретной задачи и стоимости ошибок.

Общий ответ: ЭТО ЗАВИСИТ

Нет универсального ответа. Критичность определяется:

  1. Бизнес-контекстом задачи
  2. Стоимостью каждого типа ошибки
  3. Последствиями для пользователей и компании

Примеры: где критичны False Positives

1. Спам-фильтр в email

False Positive: Легитимное письмо заблокировано (отправитель = спам)
Последствие: Пользователь пропустит важное письмо (может быть контрактом, медицинским результатом)

False Negative: Спам прошёл (отправитель = легит)
Последствие: Спам в ящике (неприятно, но не критично)

ВЫВОД: False Positives критичнее
Оптимизация: Maximize Precision (минимизировать FP)

2. Кредитный скоринг (одобрение кредита)

False Positive: Одобрили плохого заёмщика (модель сказала "хороший", он оказался плохим)
Последствие: Банк теряет деньги (default на кредите)
          Убытки: $100K+

False Negative: Отклонили хорошего заёмщика (модель сказала "плохой", он был бы хорошим)
Последствие: Упущенная выручка (не заработали на процентах)
           Убытки: $10K

ВЫВОД: False Positives дороже в 10x раз
Оптимизация: Maximize Precision

Формула потерь:
Cost = 10 * FP + 1 * FN

3. Malware Detection

False Positive: Заблокировали легитимную программу (software = malware?)
Последствие: Пользователь не может установить нужное ПО (раздражение)

False Negative: Пропустили вирус (это хорошее ПО?)
Последствие: Зараза в системе (КРИТИЧНО)

ВЫВОД: False Negatives критичнее
Оптимизация: Maximize Recall

Примеры: где критичны False Negatives

1. Диагностика заболевания (Онкология)

False Positive: Ошибочно сказали "рак" (есть рак? -> нет)
Последствие: Пациент пройдёт дополнительные тесты
           Психологический стресс
           Дополнительные расходы
           Но не смертельно

False Negative: Пропустили рак (есть рак? -> нет)
Последствие: Пациент не лечится
           Рак прогрессирует
           Возможна смерть
           КРИТИЧНО!

ВЫВОД: False Negatives намного критичнее
Оптимизация: Maximize Recall

В медицине:
- Recall > 95% (не хотим пропускать больных)
- Precision может быть 70% (много ложно-положительных ладно, пересчитаем)

2. Обнаружение аномалий (Fraud Detection)

False Positive: Обычная транзакция заблокирована (это мошенничество? -> нет)
Последствие: Клиент не может заплатить
           Плохой UX
           Но можно позвонить в bank

False Negative: Мошеннический платёж прошёл (это мошенничество? -> нет)
Последствие: Компания теряет деньги
           Клиент теряет деньги
           Репутационный ущерб

ВЫВОД: False Negatives дороже
Оптимизация: Maximize Recall (ловим большинство fraud'а)
Практика: Recall=90%, Precision=50% (много FP, но экономим на FN)

Как выбрать правильно

Шаг 1: Определить стоимость каждой ошибки

# Fraud Detection
cost_fp = 10  # ложно заблокировали транзакцию
cost_fn = 500  # пропустили fraud

# Credit Scoring
cost_fp = 100000  # одобрили плохого заёмщика (default)
cost_fn = 5000   # отклонили хорошего

# Medical Diagnosis
cost_fp = 1000  # стресс, доп тесты
cost_fn = 1000000  # неправильное лечение, смерть

Шаг 2: Выбрать оптимальный threshold

from sklearn.metrics import confusion_matrix, precision_recall_curve
import numpy as np

# Модель выдаёт вероятности
y_prob = model.predict_proba(X)[:, 1]  # вероятность класса 1

# Пробуем разные thresholds
precisions, recalls, thresholds = precision_recall_curve(y_true, y_prob)

best_threshold = None
best_cost = float('inf')

for threshold in thresholds:
    y_pred = (y_prob >= threshold).astype(int)
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    
    total_cost = cost_fp * fp + cost_fn * fn
    
    if total_cost < best_cost:
        best_cost = total_cost
        best_threshold = threshold

print(f"Оптимальный threshold: {best_threshold}")

Шаг 3: Использовать weighted метрики

# Weighted F-score
from sklearn.metrics import fbeta_score

# beta > 1 → даём больший вес Recall (штрафуем FN)
# beta < 1 → даём больший вес Precision (штрафуем FP)

f2_score = fbeta_score(y_true, y_pred, beta=2)  # Recall в 2 раза важнее
f0_5_score = fbeta_score(y_true, y_pred, beta=0.5)  # Precision важнее

Практическая таблица

ЗадачаКритичноПочемуМетрика
Медицина (диагноз)False NegativeПропуск болезни = смертьRecall > 95%
Спам-фильтрFalse PositiveБлокировка письма = потеря инфоPrecision > 90%
Fraud DetectionFalse NegativeПропуск fraud = потеря денегRecall > 90%
Кредитный скорингFalse PositiveУбытки на defaultPrecision > 85%
Resume ScreeningFalse NegativeПотеря хорошего кандидатаRecall > 80%
Email ClassificationFalse PositiveКлассификация важного письмаPrecision > 99%

Практический пример: Fraud Detection

# Costs
cost_fp = 10   # ложно заблокировали
cost_fn = 300  # пропустили fraud (чем FN тяжелее, выше порог)

# Обучение с weighted loss
from sklearn.utils.class_weight import compute_sample_weight

sample_weights = np.where(y == 1, cost_fn, cost_fp)
model.fit(X, y, sample_weight=sample_weights)

# Или явно в функции потерь (для XGBoost)
model = XGBClassifier(
    scale_pos_weight=cost_fn / cost_fp  # 300 / 10 = 30
)
model.fit(X, y)

# Результат: модель будет проще предсказывать класс 1 (fraud)
# Потому что FN дороже FP в 30 раз

Итоговая рекомендация

В начале проекта всегда спрашивайте:

"Что стоит дороже — ложный алерт или пропущенный случай?"

Ответ определяет:

  • Какую метрику оптимизировать (Precision vs Recall)
  • Какой threshold выбрать
  • Нужна ли weighted loss функция
  • Как обучать и валидировать модель

В большинстве практических задач False Negatives критичнее (медицина, безопасность, fraud), потому что пропуск опасен. Но в задачах с высокой стоимостью обслуживания (спам, email) False Positives критичнее.

Всегда переводите ML-метрики в бизнес-язык стоимостей. Тогда выбор между Recall и Precision становится очевидным.