Курс: Машинное обучение, МИФИ / SF, Бегали уулу Манас, 2026
Тип работы: Проектная практика (хакатон)
Компания «СберАвтоподписка» — сервис долгосрочной аренды автомобилей для физических лиц. В рамках проекта я построил модель, которая предсказывает вероятность совершения целевого действия пользователем на сайте (оставить заявку, заказать звонок и др.).
Модель позволяет:
- оценивать эффективность каналов привлечения трафика
- адаптировать рекламные кампании под нужную аудиторию
- улучшать UX сайта на основе анализа поведения пользователей
├── 01_data_loading.ipynb # Загрузка данных и первичный анализ
├── 02_EDA.ipynb # Разведочный анализ данных (EDA)
├── 03_ML_model.ipynb # Построение и обучение ML-модели
├── 04_API.ipynb # Тестирование API
├── predict.py # FastAPI-сервис для предсказаний
├── model.pkl # Обученная модель CatBoost
├── features_meta.pkl # Метаданные признаков
├── sber_autoподписка_hackathon.pptx # Презентация проекта
├── swagger_ui_testing.pdf # Скриншот тестирования API через Swagger UI
└── README.md
Данные из Google Analytics (last-click attribution) по сайту «СберАвтоподписки».
| Файл | Описание | Строк | Колонок |
|---|---|---|---|
ga_sessions.pkl |
Один визит = одна строка. Содержит utm, device, geo и др. | 1 860 042 | 18 |
ga_hits.pkl |
Одно событие в рамках сессии | 15 726 470 | 11 |
Датасеты не загружены в репозиторий из-за большого размера (суммарно ~5 ГБ). Данные предоставлены в рамках учебного курса.
Целевая переменная: сессия считается конверсионной если в ней зафиксировано хотя бы одно из 7 целевых действий:
sub_car_claim_click— 37 928 событийsub_submit_success— 18 439 событийsub_car_claim_submit_click— 12 359 событийsub_call_number_click— 3 653 событияsub_callback_submit_click— 3 074 событияsub_car_request_submit_click— 2 966 событийsub_custom_question_submit_click— 619 событий
Конверсия (CR): 2.10% (39 030 целевых сессий из 1 860 042)
- Загрузил оба датасета через
pd.read_pickle() - Изучил структуру, типы данных и пропуски
- Определил целевые действия и сформировал целевую переменную
target - Зафиксировал сильный дисбаланс классов: 97.90% / 2.10%
- Сохранил
sessions_with_target.pklдля следующего этапа
Построил 9 графиков и сформулировал выводы по каждому.
Ключевые находки:
| Наблюдение | Факт |
|---|---|
| Тип устройства | Mobile — 72% трафика, но desktop конвертирует в 1.8× лучше |
| Лучший канал по CR | referral: 4.21% |
| Органический трафик | CR 2.43%, прямые заходы (none): 2.90% |
| Глубина сессии | Средняя: 8.4 хита, медиана: 3.0 |
| Повторные визиты | visit_number положительно коррелирует с конверсией |
| Корреляция is_organic | +0.049 с target |
| Корреляция is_mobile | −0.007 с target |
Разбивка данных (80/20, стратификация):
- Train: 1 488 033 строк | позитивных: 2.10%
- Test: 372 009 строк | позитивных: 2.10%
Feature Engineering — 25 признаков:
Числовые (18): hits_count, log_hits_count, visit_number, log_visit_number, hour, weekday, month, is_organic, is_mobile, is_desktop, is_tablet, is_night, is_work_hours, is_weekend, is_first_visit, is_returning, is_ios, screen_width
Категориальные (7): utm_medium, utm_source, device_category, device_os, device_browser, geo_city, geo_country
Параметры CatBoost:
CatBoostClassifier(
iterations=500,
learning_rate=0.05,
depth=6,
scale_pos_weight=46.7, # учёт дисбаланса классов
eval_metric='AUC',
random_seed=42
)Результаты:
| Модель | ROC-AUC |
|---|---|
| Random baseline | 0.5000 |
| Logistic Regression (бейзлайн) | 0.8730 |
| CatBoost (финальная модель) | 0.8953 |
| Целевой порог по заданию | ≥ 0.6500 |
Целевой порог превышен на +0.245.
Прогресс обучения:
0: AUC = 0.8656
100: AUC = 0.8884
200: AUC = 0.8915
300: AUC = 0.8931
400: AUC = 0.8946
499: AUC = 0.8953 ← лучший результат
Топ-10 признаков по важности (CatBoost Feature Importance):
| Признак | Важность |
|---|---|
| hits_count | 30.67% |
| log_hits_count | 19.76% |
| utm_source | 8.12% |
| utm_medium | 6.84% |
| visit_number | 5.25% |
| month | 4.68% |
| is_first_visit | 4.26% |
| log_visit_number | 4.18% |
| screen_width | 3.16% |
| device_browser | 2.79% |
SHAP-анализ (направление влияния):
hits_count ↑→ сильно увеличивает вероятность конверсииvisit_number ↑→ повторные визиты положительно влияютis_mobile→ снижает вероятность конверсииutm_medium (organic/referral)→ повышает; banner → снижаетhour (ночь)→ ночная аудитория конвертирует выше среднего
Реализовал REST API на FastAPI с четырьмя эндпоинтами:
| Метод | Путь | Описание |
|---|---|---|
| GET | / |
Описание сервиса |
| GET | /health |
Проверка работоспособности |
| POST | /predict |
Возвращает 0 или 1 |
| POST | /predict_proba |
Возвращает вероятность 0.0–1.0 |
Производительность (1000 запросов):
| Метрика | Значение |
|---|---|
| Среднее время ответа | 5.27 мс |
| Медиана | 5.20 мс |
| 99-й перцентиль | 6.41 мс |
| Максимум | 10.90 мс |
| Критерий ≤ 3000 мс | выполнен |
pip install catboost lightgbm shap fastapi uvicorn joblib pandas numpy scikit-learn matplotlib seaborncd "путь/к/папке/проекта"
uvicorn predict:app --reload --port 8000После запуска:
- Сервис доступен:
http://localhost:8000 - Swagger UI:
http://localhost:8000/docs
curl -X POST http://localhost:8000/predict \
-H "Content-Type: application/json" \
-d '{
"visit_number": 5,
"hits_count": 15,
"hour": 14,
"weekday": 2,
"month": 3,
"utm_medium": "organic",
"utm_source": "google",
"device_category": "desktop",
"device_os": "Windows",
"device_browser": "Chrome",
"device_screen_resolution": "1920x1080",
"geo_country": "Russia",
"geo_city": "Moscow"
}'Ответ:
{
"prediction": 1,
"label": "целевое действие",
"response_time": "0.0095 сек"
}| Критерий | Макс. баллов | Результат |
|---|---|---|
| EDA | 25 | Обработка пропусков, 9 графиков, корреляции, выводы |
| ML-модель | 35 | ROC-AUC = 0.8953 (цель ≥ 0.65) |
| Интерпретация фичей | 10 | Feature Importance + SHAP |
| API / скрипт | 15 | FastAPI, время ответа 5.27 мс |
| Презентация | 15 | .pptx прилагается |
| Итого | 100 |
- Python 3.13 + Anaconda
- CatBoost 1.2.10 — основная модель
- Scikit-learn — бейзлайн, метрики
- SHAP — интерпретация модели
- FastAPI + Uvicorn — REST API
- Pandas, NumPy — обработка данных
- Matplotlib, Seaborn — визуализация
Большие файлы данных не включены в репозиторий:
__pycache__/
catboost_info/
*.csv
ga_sessions.pkl
ga_hits.pkl
sessions_eda.pkl
sessions_with_target.pkl