example data on google_drive https://drive.google.com/file/d/1CynwssmDfnzzW4KqmM4GAIuNtYAv2NcQ/view?usp=drive_link
full project on google_drive https://drive.google.com/drive/folders/1YHltzTxAw6lSGW8B0NtAvy9NuJiXsKYu?usp=drive_link
Цель проекта:
-
Научиться предсказывать совершение целевого действия (ориентировочное значение ROC-AUC ~ 0.65) — факт совершения пользователем целевого действия.
-
Упаковать получившуюся модель в сервис, который будет брать на вход все атрибуты, типа utm_, device_, geo_*, и отдавать на выход 0/1 (1 — если пользователь совершит любое целевое действие).
Приложения к заданию:
- датасет GA Sessions
- датасет GA Hits
План работы:
-
Исследование датасета GA Sessions на предмет: типов данных, пропущенных значений, взаимосвязей между переменными
-
Исследование датасета GA Hits на предмет: типов данных, пропущенных значений, взаимосвязей между переменными
Пункты: 3. 4. 5. обрабатывались в PyCharm код написан для ознакомления
-
Извлечение целевой переменной - event_value из GA Hits
-
Объединение датасета GA Session и целевой переменной
-
Удаление дубликатов
-
Удаление неинформативных признаков, с пропусками в значениях более 45%
-
Заполнение пропусков в категориальных переменных введением дополнительного значения, ввиду предположения, что пропуски в данных колонках обусловлены отсутствием события
-
Изменение значений в скобках (not_set) и (none) в признаке utm_medium
-
Удаление выбросов в числовых переменных, заменой значений выбросов, значением следующим за граничным значением квантиля, в данном случае==2
-
Визуализация данных. Создание дополнительного датафрейма с преобразованием данных по типу '.astype('category').cat.codes', для предварительного просмотра корреляций признаков к целевой переменной
-
Преобразование значений в категориальных признаках. Взяты первые 2-5 букв значения в признаках: utm_source, utm_campaign, utm_adcontent, с сохранением количества уникальных значений
-
Объединение колонок содержащих дату и время и приведение к типу Datetime
-
Преобразование Datetime - взят: месяц, день недели, час, события
-
Приведение значений признака device_screen_resolution к типу float
-
Приведение geo_city, geo_country к координатам, ОТ ИДЕИ ОТКАЗАЛСЯ
-
Изменение признаков geo_city, geo_country. Сокращено количество значений и приведено к типу int. Создан новый признак geo, значения в котором: 0 - все страны кроме России, 1 - города России, 2 - Санкт-Петербург, 3 - Москва.
-
Создание дополнительного признака utm_path из признаков: w_source, w_campaign, w_adcontent
-
Создание дополнительного признака utm_organic класифицирующего тип трафика (платный или бесплатный)
-
Удаление колонок 'session_id', 'client_id' (возможно колоку 'session_id' оставим, посмотрим на поведение модели)
-
Создание дополнительного признака count для сохранения количества повторений данных при удалении дубликатов в последствии отказался
-
Удаление дубликатов
-
Преобразование данных, в отдельном датафрейме, для просмотра корреляций признаков к целевой переменной
-
Просмотр корреляций и удаление слабокоррелируемых признаков. С корреляцией -0.01 - 0.01. От реализации ОТКАЗАЛСЯ
-
Проведение экспериментов по балансировке классов. Использован метод Undersampling. Впоследствии от реализации отказался
! 25. Дальнейшая работа над проектом производилась в PyCharm !
-
Преобразование числовых переменных в StandardScaler
-
Преобразование категориальных переменных в OneHotEncoder
-
Подготовка модуля в PyCharm - take_data для автоматического: получения целевой переменной, объединения датасетов и удаления дубликатов
-
Подготовка pipeline в PyCharm
-
Обучение модели
-
Подготовка модуля для обращения к модели в Fastapi
-
Подготовка модуля для AirFlow
Особенности проекта:
- На этапе исследования данных стало очевидно следующее:
данные слабокоррелированы к целевой переменной
в данных дисбаланс классов
- На этапе Feature engineering были созданы следующие фичи:
date_time - дата и время события
month_day_your - месяц, день недели и час события
geo - численная переменная указывающая на локацию (от перевода к координатам отказался ввиду значительного времени обработки)
utm_organic - переменная указывающая на тип трафика
utm_path - составная переменная состоящая из нескольких признаков типа utm
-
Проводились эксперименты по балансировке классов методами Взвешивания классов и Undersampling. Впоследствии от идеи балансировки классов отказался. Поскольку результаты обучения моделей на подготовленных данных были стабильны и TruePositiveRate была достаточного уровня. Что позволило сохранить естественные данные и не допустить их искусственности.
-
По итогам этапа Evaluation, для обучения модели были оставлены следующие признаки:
visit_date
visit_number
utm_path
utm_organic
device_screen_resolution
geo
count_duplicates
event_value - целевая переменная
- Вывод TruePositiveRate и ConfusionMatrix осуществляется в фукции true_positive_rate модуля predict
Структура проекта:
sber_auto/data: папка с данными
sber_auto/data: исходные данные
sber_auto/data/to_pipeline: данные для обучения модели
sber_auto/data/test: папка для json файлов для предсказаний
sber_auto/data/predictions: папка с файлами предсказанных моделью запросов
sber_auto/modules: модули с кодом PyCarm для работы проекта:
take_data - модуль подготовки датасета из исходных данных
pipeline - модуль конвейера для обработки данных и обучения модели
predict_api - модуль для работы модели по api
predict - модуль для работы серверного сервиса
result_out - модуль вывода предсказания при работе серверного сервиса (файл с предсказаниями записывается в корневую дирректорию компьютера)
sber_auto/dags: модуль для работы с AirFlow (необходимо скопировать в scheduler)
sber_auto/jupyter: jupyter_notebook с исследованиями и подготовкой данных
sber_auto/models: обученная модель проекта
Уточнения по проекту:
ПРОЕКТ ПОСТРОЕН ПО ПРИНЦИПУ: на каждом этапе, при получении новых данных, при обучении новой модели и получении новых предсказаний. Предыдущие данные УДАЛЯЮТСЯ! за исключением исходных данных.
Вывод файла предсказания из модуля result_out осуществляется в корневую директорию
Для корректной работы проекта необходимо папку с проектом поместить в корневую директорию, поскольку все пути проекта прописаны от корневой директории, либо изменить пути.