Uplift-моделирование для таргетированного маркетинга: T/R-learner, Optuna, MLflow, метрика Uplift@30%.
Разработка uplift-модели для определения целевой аудитории, которой стоит предложить промокод на 500 рублей на доставку еды из ресторанов. Цель — максимизировать метрику Uplift@30% путем идентификации "убеждаемых" клиентов.
Критерии успеха (Uplift@30%):
- 🟢 Отлично: ≥ 0.050
- 🟡 Хорошо: ≥ 0.045
- 🟠 Удовлетворительно: ≥ 0.035
uplift-modeling/
├── data/ # Данные проекта
├── pictures/ # Сохраненные визуализации
├── utils/ # Вспомогательные функции
│ └── utils.py # Функция custom_uplift_by_percentile
├── uplift_project.ipynb # Основной ноутбук с решением
├── requirements.txt # Зависимости проекта
├── rms.sh # Скрипт запуска MLflow сервера
└── README.md # Этот файл
Склонируйте репозиторий проекта:
git clone https://github.com/DataClasse/uplift-modeling.git
cd uplift-modelingДатасет uplift_fp_data.csv разместите в директории data/.
Описание датасета:
- Размер: 64 000 клиентов
- Формат: CSV файл
- Расположение:
data/uplift_fp_data.csv - Столбцы:
recency,history_segment,history,mens,womens,zip_code,newbie,channel,treatment,target
Используйте Python 3.10.13. С другими версиями могут возникнуть конфликты с библиотеками.
python3 -m venv uplift_env
source uplift_env/bin/activate # или . uplift_env/bin/activatepip install -r requirements.txtСоздайте файл .env в корне проекта с необходимыми переменными для MLflow:
# MLflow Tracking Server
TRACKING_SERVER_HOST=127.0.0.1
TRACKING_SERVER_PORT=5000
# PostgreSQL (Backend Store)
DB_DESTINATION_HOST=your_host
DB_DESTINATION_PORT=your_port
DB_DESTINATION_NAME=your_database
DB_DESTINATION_USER=your_user
DB_DESTINATION_PASSWORD=your_password
# S3 (Artifact Store)
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_nameДля логирования экспериментов в MLflow запустите сервер:
chmod +x rms.sh
./rms.shСервер будет доступен по адресу: http://127.0.0.1:5000
Проект выполняется в одном Jupyter Notebook (uplift_project.ipynb) и состоит из двух частей:
-
Этап 1: Первичная подготовка данных
- Импорт библиотек
- Загрузка датасета
- Проверка и заполнение пропусков
-
Этап 2: Исследовательский анализ данных (EDA)
- Анализ сбалансированности выборки
- Проверка статистической значимости
- Корреляционный анализ признаков
- Выводы о влиянии признаков на таргет
-
Этап 3: Построение baseline-модели
- Обоснование выбора модели
- Разделение на train/test (80/20)
- Обучение трех моделей (T/S/R-learner)
- Сравнение моделей и выводы
-
Этап 1: Подбор гиперпараметров
- Оптимизация гиперпараметров (Optuna)
- Обучение финальной модели
- Логирование в MLflow
-
Этап 2: Финальная интерпретация результатов
- Визуализации (Uplift Curve, Qini Curve, Uplift по перцентилям)
- Выводы о качестве модели
- Рекомендации по улучшению
-
Этап 3: Подготовка кода для продакшн
- Реализация класса
UpliftModelInference - Тестирование на примерах
- Реализация класса
В директории utils/ находится вспомогательный код, который может помочь при выполнении проекта:
- Функция
custom_uplift_by_percentileдля визуализации uplift по перцентилям
Финальная метрика: Uplift@30% = 0.0518 (ОТЛИЧНО)
Достигнутые улучшения:
- Baseline T-learner: 0.0410
- Baseline R-learner: 0.0505
- Финальная модель: 0.0518 (+26.3% от T-learner baseline)
Все эксперименты залогированы в MLflow:
- Baseline модели (T/S/R-learner)
- Процесс оптимизации гиперпараметров
- Финальная модель с артефактами и визуализациями
- Регистрация модели в Model Registry
Эксперимент: Uplift_Modeling_YandexEda
Tracking URI: http://127.0.0.1:5000
Основные библиотеки:
pandas,numpy— работа с даннымиscikit-learn— машинное обучениеcausalml— uplift-моделированиеsktlift— метрики и визуализации upliftoptuna— оптимизация гиперпараметровmlflow— логирование экспериментовmatplotlib,seaborn— визуализация
Полный список зависимостей см. в requirements.txt.
Дмитрий Щербаков