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

Приведи пример сложной задачи с проекта

1.0 Junior🔥 231 комментариев
#Опыт и проекты

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

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

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

Пример сложной задачи: Предсказание чёрна клиентов с дисбалансом данных

Контекст проекта

В fintech-компании стояла задача: спрогнозировать, какие клиенты уйдут на конкурентов в течение 3 месяцев. Это была критична бизнес-задача, потому что потеря клиента = упущенная выручка. Проект требовал работы на всех этапах ML pipeline: от подготовки данных до production deployment.

Основные вызовы

1. Экстремальный дисбаланс классов

# Распределение классов
Осталось клиентов: 98.7% (~400k)
Ушло клиентов: 1.3% (~5k)

# Проблема: если модель всегда предскажет "останется", она получит accuracy 98.7% — но будет бесполезна

Решение:

  • Применил stratified k-fold cross-validation для корректной оценки
  • Использовал ROC-AUC вместо accuracy как основную метрику
  • Реализовал SMOTE (Synthetic Minority Over-sampling Technique) для балансировки обучающего набора
  • Настроил class weights в XGBoost: scale_pos_weight = majority_class / minority_class

2. Feature engineering с множеством данных

Е компании были данные о:

  • Демографии (возраст, регион, доход)
  • Поведении (частота покупок, размер чека, время между транзакциями)
  • Продуктах (какие сервисы использует)
  • Коммуникации (открыл ли письмо, кликнул на предложение)
# Ключевые признаки, которые я создал:

features = {
    "Активность": [
        "days_since_last_transaction",  # сколько дней без покупки
        "transaction_frequency_3m",     # частота транзакций за 3 месяца
        "avg_transaction_amount_3m"     # средний размер чека
    ],
    "Тренды": [
        "transaction_amount_trend",     # растёт ли размер чека?
        "frequency_trend",              # изменилась ли активность?
        "days_since_first_purchase"     # давность клиента
    ],
    "Поведение": [
        "email_open_rate",              # процент открытых писем
        "has_used_promo",               # использовал ли промокоды
        "products_count",               # кол-во разных продуктов
        "complaint_count"               # жалобы / возвраты
    ]
}

Вызов: было ~500 фич после preprocessing. Нужна была feature selection.

Решение:

  • Используя permutation importance в XGBoost, оставил top-50 фич
  • Проверил multicollinearity (VIF > 5 = удалил)
  • Финальный набор: 42 фичи, которые объясняли 95% variance

3. Обработка пропусков и выбросов

Данные были из legacy-системы: пропуски, ошибки, дубликаты.

# Стратегия по пропускам
Высокий процент пропусков (>50%) → удалить фичу
Ловый процент (<5%) → заполнить медианой
Железобетонные нули → заполнить 0 (был смысл)
Датовые пропуски → заполнить min-датой (клиент новый?)

# Выбросы
Транзакции > 99 перцентиля → удалили (мошенничество/ошибки)
Экспоненциальные фичи → применили log-трансформацию

Модель и тренировка

Выбор алгоритма:

  • Пробовал: Logistic Regression, Random Forest, LightGBM, XGBoost
  • Выбрал XGBoost — лучший balance между accuracy и interpretability
  • Настроил early stopping с validation set
# Гиперпараметры (после GridSearch)
params = {
    max_depth: 5,
    learning_rate: 0.05,
    subsample: 0.8,
    colsample_bytree: 0.8,
    scale_pos_weight: 76,  # ratio меньшинства
    reg_lambda: 1.0  # L2 регуляризация
}

Результаты:

  • ROC-AUC: 0.84 (очень хорошо для такой задачи)
  • Precision: 0.72 (из 100 предсказаний об уходе, 72 верны)
  • Recall: 0.68 (ловим 68% клиентов, которые реально уйдут)
  • F1-score: 0.70

Production и мониторинг

Интеграция:

  • Модель развёрнута в REST API (Flask)
  • Batch-прогноз ежедневно для всех клиентов
  • Результаты передаются в CRM для отправки персонализированных предложений

Мониторинг:

  • Отслеживал data drift — распределение входных данных
  • Отслеживал model drift — падает ли качество прогнозов
  • Ежемесячный retrain на свежих данных

Ключевые learnings

  1. Не всё about алгоритмов — feature engineering и data cleaning дали 70% качества
  2. Метрики важны — неправильная метрика (accuracy) завела бы в тупик
  3. Балансировка данных необходима — SMOTE + class weights сильно помогли
  4. Интерпретируемость критична — бизнес хотел знать, почему клиент может уйти
Приведи пример сложной задачи с проекта | PrepBro