Skip to content

📲 Классификация абонентов по базе звонковых транзакций

Notifications You must be signed in to change notification settings

mikhailmartin/BestHack2022-DataScience

Repository files navigation

BestHack2022 DataScience

Навигация

Структура проекта

старается соответствовать шаблону Cookiecutter Data Science.

├── README.md  <- Ты сейчас меня читаешь.
|
├── CONTRIBUTING.md  <- Руководство по использованию линтеров в данном проекте.
|
├── data\
|   ├── raw\                          <- Исходные данные (неизменяемые).
|   ├── interim\                      <- Промежуточные данные (изменённые).
|   |    ├── transactions_by_id_src\  <- Исходные данные только с разбивкой на файлы по
|   |    |                               уникальными клиентам.
|   |    └── aggregated_features\     <- Признаки-агрегаты по уникальному клиенту.
|   └── processed\                    <- Финальные данные для моделирования.
|
├── models\  <- Здесь будут сохранены обученные модели во время WorkFlow процесса.
|
├── notebooks\  <- Jupyter-ноутбуки с исследованиями.
|
├── references\
|
├── src\  <- Исходный код данного проекта.
|   ├── data\                       <- Скрипты обработки данных.
|   |   ├── by_day_to_entire.py     <- Срипт сбора данных, хранящихся в файлах по датам, в единый файл.
|   |   └── entire_to_by_id_src.py  <- Скрипт разбивки и сохранения данных, хранящихся в
|   |                                  едином файле, на множество отдельных по клиенту.
|   |
|   ├── features\  <- Скрипты генерации признаков.
|   |
|   └── models\  <- Скрипты обучения моделей.
|       └── train_catboost.py
|
├── .dvcignore
├── .gitignore
├── .pre-commit-config.yaml
├── dvc.lock
├── dvc.yaml
├── poetry.lock
└── pyproject.toml

Формулировка задания

По статистике каждый активный абонент в среднем получает более 5-ти нежелательных звонков в неделю. При этом для разных людей понятия «желаемого» и «нежелательного» трафика могут не совпадать. Один и тот же номер может использоваться как для назойливого рекламного обзвона, так и для обслуживания клиентов; а на каждого нового мошенника реагировать нужно как можно быстрее.

В архиве transactions.zip содержатся синтетические данные транзакций голосового трафика за 2 месяца, максимально приближенные к реальным. В файле beeline_antispam_hakaton_id_samples.csv содержатся id абонентов, таргет по которым известен (train) и по которым нужно предсказать (test).

Сможете ли вы определить, к какому типу относится конкретный номер? Сможете ли вы построить стабильную и легкую модель?

Часть I - ML

Требуется построить модель, которая классифицировала бы номера на 5 категорий:

  • 0 - не спам
  • 1 - небольшие полезные ИП / малые бизнесы
  • 2 - организации
  • 3 - мобильная карусель
  • 4 - чёрные спамеры и мошенники

Метрика - fbeta_score(average='macro', beta=0.5).

На выходе мы ожидаем файл beeline_antispam_hakaton_id_samples.csv, в котором для тестовых данных (test) проставлена одна из 5 категорий.

Часть II - R&D

Помимо точности предсказания, мы также будем оценивать применимость решения в боевых условиях и качество инсайтов, полученных из данных.

Идеальное решение должно быть не только точным, но также стабильным и «лёгким».

Лёгким, так как реальные данные в тысячи раз тяжелее, а модель должна работать в режиме, приближенном к real-time, чтобы с минимальной задержкой реагировать даже на самых продвинутых мошенников, которые быстро меняют номера и подстраивают своё поведение для обхода антифрод-систем.

Под «лёгкостью» мы понимаем не столько сложность самого алгоритма (одна бустинг модель вполне ОК, десять «застеканных» моделей - нет), сколько глубину используемых данных (необязательно использовать целый месяц, можно попробовать ограничиться одной неделей или несколькими днями, если это не сильно влияет на точность).

Под стабильностью мы понимаем постоянство качества модели в динамике как в целом по категориям, так и по каждому конкретному номеру (в идеальном мире один и тот же номер, если он не меняет фактического владельца, должен иметь одинаковый скор и вчера, и сегодня и завтра). Метрику стабильности, в особенности для случая с конкретными номерами, мы предлагаем вам придумать самим.

В частности, нам бы хотелось, чтобы вы ответили на следующие вопросы (но, возможно, вы захотите поисследовать в данных что-то ещё):

  1. Какие паттерны поведения номеров помогают отделить категории 1-4 друг от друга?
  2. Насколько отличаются предсказания модели, построенные на разных периодах времени?
  3. Не «ломается» ли модель в выходные и праздники?
  4. Какое минимальное количество дней исторических транзакций требуется для, чтобы построить стабильную и достаточно точную модель?
  5. Какую метрику стабильности скора по отдельным номерам вы предлагаете использовать?
  6. Как модель работает на слабоактивных номерах?
  7. Среди номеров из наиболее «спорных» категорий 2 и 3, возможно ли выделить полезный и нежелательный трафик на уровне конкретного звонка?

Мы очень приветствуем, чтобы ваши выводы были подкреплены конкретными цифрами и графиками (визуализация должна подтверждать тезис и быть читаемой, но её красота сама по себе не оценивается).

Удачи!

Описание данных

  • id_a - id абонента, который звонит
  • id_b - id абонента, которому звонят
  • time_key - дата звонка
  • start_time_local - время начала звонка
  • time_zone - часовая зона звонящего абонента
  • duration - длительность звонка
  • forward - индикатор переадресации
  • zero_call_glg - категория звонка с нулевой длительностью
  • source_b - индикатор транзакции из источника B
  • source_f - индикатор транзакции из источника F
  • num_b_length - длина номера абонента, которому звонят

Интерпретатор и окружение

В проекте используется интерпретатор Python 3.12.1.

Виртуальное окружение я создавал с Poetry. Для начала вам понадобится установить данный инструмент, затем создать и активировать виртуальное окружение и установить необходимые зависимости

potry install

В качестве WorkFlow-менеджера используется DVC. Пайплайн можно прогнать следующей командой:

dvc repro

About

📲 Классификация абонентов по базе звонковых транзакций

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published