Ответ
Одна из наиболее сложных задач — это разработка системы предсказания оттока (churn prediction) для крупного телеком-оператора. Основная сложность заключалась в работе с крайне несбалансированными данными (только 5% клиентов уходили) и большим количеством шумных, разреженных признаков из истории звонков и транзакций.
Мой подход к решению:
- Feature Engineering: Я создал более 100 новых признаков, агрегируя сырые данные за различные временные окна. Это включало тренды активности, сезонность (например, активность по дням недели), а также признаки, основанные на изменениях поведения (например, резкое снижение числа звонков).
- Борьба с дисбалансом: Простое взвешивание классов в модели не давало нужного recall. Я применил комбинированную стратегию:
SMOTEдля генерации синтетических примеров минорного класса иRandomUnderSamplerдля majority класса, что позволило улучшить работу модели на "сложных" клиентах. - Выбор и настройка модели: После сравнения нескольких алгоритмов лучшие результаты показал CatBoost благодаря своей эффективной работе с категориальными признаками. Я настроил кастомную функцию потерь, чтобы сильнее штрафовать пропуск клиента, который действительно уйдет (false negative).
Пример итогового пайплайна:
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from catboost import CatBoostClassifier
# Определение шагов пайплайна
pipeline = Pipeline([
('preprocessor', custom_preprocessor), # Кастомный трансформер для фичей
('oversample', SMOTE(sampling_strategy=0.2, random_state=42)),
('undersample', RandomUnderSampler(sampling_strategy=0.5, random_state=42)),
('classifier', CatBoostClassifier(
iterations=1000,
learning_rate=0.05,
depth=8,
loss_function='Logloss',
eval_metric='F1',
silent=True
))
])
# Обучение с кросс-валидацией
pipeline.fit(X_train, y_train)
В результате нам удалось достичь F1-score в 0.78 на hold-out выборке (против 0.65 у baseline-решения), что позволило бизнесу более точно таргетировать программы удержания.