Название проекта: Построение ML-продукта для выявления и оптимизации платежей преподавателей сервиса Repetit.ru
requirements.txt
- библиотеки Python, необходимые для работы проекта, а также их версииpayments_optimization.ipynb
- рабочая тетрадь с исследованиями, визуализациями и текстовыми описаниямиresearch_class.py
- файл, содержащий класс для проведения исследованияassets
- директория с сохранёнными артефактамиrun_mlflow_server.sh
- скрипт для запуска mlflow server
Сервис передает контакты клиента (ученика) репетитору.
Если репетитор начинает заниматься с учеником, то он должен платить сервису комиссию от каждого занятия.
Но в реальности так происходит не всегда. Иногда, это из-за того, что репетитор звонит по телефону и ему просто не отвечают.
Некоторые репетиторы плохо договариваются о занятиях или обманывают.
Сервис теряет деньги каждый раз, когда отдаёт заявку неэффективному репетитору.
Заказчику нужно как можно раньше понять, что репетитор недобросовестный или мошенник,
чтобы отключить его от сервиса и отдавать заявки ответственным репетиторам.
Сейчас эта задача решается ручным просмотром сотрудниками или никак.
Признаки обмана, выявленные при ручной проверке
Заказчик произвел ручную проверку репетиторов на предмет мошенничества (звонки клиентам и так далее).
Выяснилось, что 20% обманывают нас так или иначе.
- Несоответствие цены в заявке, в анкете репетитора и реальной
- 1 занятие на ученика (соотношение к общему кол-ву занятий)
- Разная стоимость с разными учениками
- Разная стоимость уроков с одним учеником
- Стоят занятия в расписании, а оплат нет
- Когда у репетитора по разным ученикам оплаты рядом по времени, то он сам оплачивает
- Как часто заходит в приложение - если редко, то сам оплачивает
- Статус заявки договорились о занятиях, оплат нет более недели (и не перенесено)
- status в orders = 9
- lessons с amount_payed > 0 за последнюю неделю
- Ученик не отмечен как завершенный, а оплат нет
- В качестве примера, есть SQL запрос позволяющий получить данную информацию
- Репетитор отчитался, что провёл платное занятие, оплаты нет
- В качестве примера, есть SQL запрос позволяющий получить данную информацию
- Цена ниже 500 р. в регионах, ниже 700 в мск
- построение автоматизированного решения для выявления и оптимизации платежей
- Разработать модель, которая по имеющейся информации о репетиторе и проведенных им занятий
будет классифицировать репетиторов на платящих и неэффективных. - Оценка качества модели будет производиться с использованием метрики F1.
- загрузка данных и ознакомление с ними,
- EDA,
- создание новых признаков,
- отбор финального набора обучающих признаков,
- подготовка данных для обучения,
- выбор и обучение моделей,
- оценка качества предсказания лучшей модели на тестовой выборке,
- анализ важности признаков лучшей модели,
- отчёт по проведённому исследованию.
PostgreSQL, MLflow, Python: pandas, psycopg2-binary, phik, matplotlib, seaborn, sklearn
Отчёт по выполненным в ходе исследования шагам.
Загрузка и ознакомление с данными
- шаг выполнен полностью, трудностей не возникло.;
- данные загружены;
- изучены типы данных;
- приняты решения о дальнейшей предобработке;
Предварительная обработка и отбор полезных признаков
- шаг выполнен полностью, трудностей не возникло;
- изменены типы данных по необходимости;
- исключены дубликаты строк;
- обработаны пропущенные значения;
- исключены неинформативные признаки;
- произведено объединение таблиц;
Разведочный анализ
- шаг выполнен полностью, трудностей не возникло;
- исследованы зависимости и корреляции признаков;
Разработка новых синтетических признаков
- в данном исследовании этот шаг не понадобился:
признаков достаточно для получения устойчивых положительных результатов;
Отбор финального набора обучающих признаков
- шаг выполнен полностью, трудностей не возникло;
Выбор и обучение моделей
- шаг выполнен полностью, трудностей не возникло;
- обучены простые модели: логистическая регрессии и случайный лес;
- в качестве baseline использована логистическая регрессиия
с дефолтными настройками на датасете с минимальным набором данных; - наиболее высокое качество предсказания по метрике
F1
на кросс-валидации показал случайный лес:0.619
Итоговая оценка качества предсказания лучшей модели и фнализ важности её признаков
- шаг выполнен полностью, трудностей не возникло;
- исходя из матрицы ошибок, можно сделать следующие выводы:
- Модель верно предсказала 27690 отрицательных случаев и 8295 положительных случаев.
- Модель ошибочно предсказала 8711 положительных случаев как отрицательные (ложноотрицательные) и
1630 отрицательных случаев как положительные (ложноположительные).
- Метрики на тестовой выборке:
ROC-AUC
на тестовой выборке: 0.88F1
на тестовой выборке: 0.62
- Наиболее важными признаками обозначены:
lessons_delivered
,mean_lesson_price
,lessons_started_fraction
,lessons_per_pupil
Выполнено дополнительно
- поднятие базы PostgreSQL и загрузка данных в неё;
- логирование моделей и метрик при помощи MLflow
Общий итог
- для решения поставленной задачи оптимальным образом подходит модель
Random Forest Classifier