Ранжировать клиентов банка так, чтобы при ограниченном ресурсе контактов (top‑K) максимизировать конверсии (депозит = "yes") и прибыль.
Источник: UCI Bank Marketing (bank-full.csv) (Kaggle — UCI Bank Marketing Full Dataset).
- Цель:
y(yes/no) -> бинарная 0/1 - Категориальные признаки: CatBoost обрабатывает нативно, в Torch идут в эмбеддинг
Файл bank-full.csv положить в data/ (рекомендуется) или передать путь в скриптах.
Для устойчивости ранжирования и интерпретируемости добавлены:
campaign_bucket: бины поcampaign(например, 1, 2–3, 4–6, 7+)pdays_bucket: бины поpdaysс учетом значения "никогда не было контакта"prev_contact: бинарный индикатор наличия предыдущего контакта (pdays != -1)
Эти признаки используются во всех моделях (baseline - LogReg / CatBoost / Torch).
duration - признак post‑call (известен только после звонка).
По умолчанию весь пайплайн работает в pre‑call режиме (без duration) и сохраняет артефакты в artifacts/pre_call/.
Режим with‑duration используется только как экспериментальная верхняя граница качества, включается флагом --with-duration и сохраняется в artifacts/with_duration/.
priorti_bank/
.jupyter/
.venv/
artifacts/
data/
notebooks/
src/
data/
models/
metrics/
README.md
requirements.txt
python -m src.data.split --path data/bank-full.csv --out artifacts/splits.npz
python -m src.cli trainПримечание: запуск проекта выполняется через python -m src.cli ....
Рекомендуемая установка: из requirements.txt
pip install -r requirements.txtДля воспроизводимости пересоберите артефакты в окружении из requirements.txt.
В репозитории сохранён artifacts/splits.npz, а модели пересобираются командами train/eval.
Метрики в artifacts/*/metrics.json можно использовать как эталон для сравнения.
Полного совпадения для Torch может не быть, но результаты должны быть очень близкими.
python -m src.cli train --with-durationСплиты сохраняются в .npz, что стабильнее между версиями библиотек:
python -m src.data.splitpython -m src.cli evalДля оценки with‑duration укажите флаг:
python -m src.eval --with-durationСводные метрики сохраняются в:
artifacts/pre_call/metrics.jsonartifacts/with_duration/metrics.json
Классификация:
- ROC‑AUC
- PR‑AUC
- LogLoss
Ранжирование:
- Precision@K
- Recall@K
- Lift@K
Precision@K = TP@K / KRecall@K = TP@K / PLift@K = Precision@K / (P / N)гдеTP@K— число положительных (y=1) в top‑K,P— общее число положительных,N— размер теста.
Бизнес‑эффект:
- Profit@K = 100 * TP - 1 * K
Симулируем приоритизацию звонков:
- доход на успешную подписку:
profit_per_tp = 100 - стоимость попытки контакта:
cost_per_contact = 1 - бюджет: обзвон только top‑K клиентов по скору
Profit@K:
Profit = profit_per_tp * TP_in_topK - cost_per_contact * K(K - число обзвоненных клиентов)
Константы - допущения; устойчивость проверяем кривыми Profit@K.
| Модель | ROC‑AUC | PR‑AUC | Precision@10% | Lift@10% | Profit@10% |
|---|---|---|---|---|---|
| LogReg | 0.772467 | 0.413887 | 0.494469 | 4.226355 | 43796.0 |
| CatBoost | 0.803086 | 0.455072 | 0.517699 | 4.424908 | 45896.0 |
| Wide&Deep | 0.790940 | 0.444005 | 0.515487 | 4.405998 | 45696.0 |
- CatBoost стабильно сильный для табличных данных
- Wide&Deep конкурентен за счет эмбеддингов
- Ранжирование по скору повышает прибыль относительно случайного выбора
- Энкодеры для Torch сохраняются рядом с моделью для воспроизводимого инференса
- В
src/metrics/— общие метрики классификации, ранжирования и profit