Пришел запрос из отдела продаж и маркетинга:
Необходимо разработать алгоритм определения вероятности подключения услуги абонентом для снижения расходов на взаимодействие с нецелевыми пользователями.
В качестве исходных данных доступна информация об отклике абонентов на предложение подключения услуг. Действие абонента отражено в бинарном виде (подключил/не подключил). Отдельным набором предоставлены нормализованные анонимизированные признаки, характеризующие профиль потребления абонента.
- Предсказание вероятности подключения услуги.
- Формирование индивидуального предложения клиенту
Скоринг осуществляется с помощью невзвешенной метрики f1.
jupyter python version: 3.9.13
airflow version: 2.3.1 on python 3.9.13
необходимый кастомный пакет: package/dist/telecom_transformers-1.0.0-py3-none-any.whl
data_train.csv - набор тренировочных данных
data_test.csv - набор тестовых данных
features.csv - деперсонализированные профили пользователей
Здесь можно ознакомиться с анализом структуры спроса и предложения. Этот же дашборд лежит в figures/megafon.twbx. Программная часть анализа находися в ноутбуке eda.ipynb.
research/eda.ipynb - разведочный анализ данных (программная часть)
research/baseline.ipynb - базовое решение, использующее все тренировочные данные и все фичи. Сопоставление фичей по ближайшей дате
research/research.ipynb - исследование влияния PCA компрессии фичей
research/comparison.ipynb - исследование без распределенных вычислений, использующее тренировочные данные после 19 ноября и уже сжатые фичи. Изучение вариантов сопоставления фичей, сравнение моделей, GridSearch, random state stability
research/features.ipynb - изучение набора пользовательских профилей
research/FE.ipynb - разработка и проверка фичей
modeling/check.ipynb - проверка работоспособности сохраненной модели
modeling/threshold.ipynb - определение оптимального порога вероятности для построения рекомендаций
drafts/pyspark_pca.ipynb - черновик для сжатия фичей с помощью PySpark. Во всей работе используются фичи, сжатые именно этим способом
package/ - пакет с трансформерами для модели
modeling/model.zip - архивированная модель, включающая весь цикл подготовки данных
modeling/predict.py - CLI приложение для получения прогноза
modeling/predict_data_test.csv - файл с прогнозами модели
data/parameters.conf - глобальная конфигурация модели (см.ниже)
data/fit_params.json - гиперпараметры, используемые для итогового обучения (обновляются при автоматическом подборе)
data/grid_params.json - сетка гиперпараметров для автоматического подбора
MODEL section
drop_features- пользовательские признаки, отбрасываемые до обработки
bound_date- дата разделения датасета; данные до этой даты не будут использоваться в обучении
n_folds- количество разбиений данных при кросс-валидации
FIT_PARAMS section
adaptive_class_balance- принудительно пересчитывать баланс классов, даже если он жестко указан в параметрах обучения
update_on_cv- обновить файл параметров обучения по итогам кросс-валидации
FIXED section
зафиксированные параметры модели (см. документацию используемого классификатора)
Сначала нужно запустить сам airflow. Сделать это можно по официальной инструкции.
При запуске в docker необходимо дополнительно расшарить папку для передачи данных в контейнер. Также, необходимо добавить default filesystem connection, установить java и расширение apache-airflow-providers-apache-spark.
Мой вариант сборки airflow здесь. Перед запуском необходимо подмонтировать нужные папки проекта, иначе airflow не увидит файлов и придется их копировать. Скрипт монтирования/размонтирования лежит в репозитории по ссылке выше.
Обратите внимание, что
- Содержимое папки
dagsдолжно быть доступно внутри airflow контейнера как минимум для чтения - Путь к файлу
dags/jobs/common.pyдолжен быть именно таким, иначе airflow не сможет импортировать этот модуль внутри задач - Файлы конфигурации модели в папке
dataдолжны быть доступны внутри airflow контейнера для чтения и записи - Метрики и параметры модели дополнительно фиксируются в логах задач airflow