Как повысить precision и recall модели с 60% до 80%, если этого требует бизнес?

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

Ответ

Повышение метрик с 60% до 80% — это значительный скачок, требующий системного подхода. Вот план действий, основанный на моем опыте:

1. Анализ ошибок — с чего начать:

from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns

# Смотрим, где именно ошибается модель
cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt='d')
print(classification_report(y_true, y_pred))
  • Низкий Precision (много False Positive): Модель слишком «щедро» присваивает положительный класс. Нужно сделать её более консервативной.
  • Низкий Recall (много False Negative): Модель пропускает много положительных примеров. Нужно сделать её более «чувствительной».

2. Конкретные действия для улучшения:

Если проблема в данных:

  • Дисбаланс классов: Применяю SMOTE (для умеренного дисбаланса) или взвешивание классов в модели.
    # В XGBoost/LightGBM
    model = XGBClassifier(scale_pos_weight=ratio_negative/ratio_positive)
  • Качество разметки: Проверяю, нет ли ошибок в y_true. Часто 5-10% исправлений в разметке дают прирост в несколько процентов.
  • Feature Engineering: Добавляю новые признаки, которые могут лучше разделять классы. Например, для задачи фрода создаю признаки «число транзакций за час», «отклонение от среднего чека».

Если проблема в модели:

  • Оптимизация порога решения: По умолчанию используется 0.5. Ищу оптимальный порог по PR-кривой.
    from sklearn.metrics import precision_recall_curve
    precisions, recalls, thresholds = precision_recall_curve(y_true, y_proba)
    # Ищу порог, где precision и recall примерно равны и высоки
    idx = np.argmax((precisions[:-1] + recalls[:-1]) / 2)
    optimal_threshold = thresholds[idx]
  • Подбор гиперпараметров: Использую Optuna или GridSearchCV для тонкой настройки, особенно параметров, контролирующих переобучение (max_depth, min_child_weight, reg_alpha, reg_lambda).
  • Ансамблирование: Комбинирую предсказания нескольких разнородных моделей (например, градиентный бустинг + нейросеть) через стекинг или блендинг.

3. Компромисс и бизнес-логика: Часто напрямую поднять обе метрики сложно. Я обсуждаю с бизнесом, что важнее:

  • Высокий Precision (минимум ложных срабатываний): Если цена False Positive высока (например, блокировка легального пользователя).
  • Высокий Recall (минимум пропусков): Если цена False Negative высока (например, пропуск мошеннической транзакции).

Исходя из этого, можно сместить фокус при оптимизации модели.