Навигация
старается соответствовать шаблону 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).
Сможете ли вы определить, к какому типу относится конкретный номер? Сможете ли вы построить стабильную и легкую модель?
Требуется построить модель, которая классифицировала бы номера на 5 категорий:
- 0 - не спам
- 1 - небольшие полезные ИП / малые бизнесы
- 2 - организации
- 3 - мобильная карусель
- 4 - чёрные спамеры и мошенники
Метрика - fbeta_score(average='macro', beta=0.5)
.
На выходе мы ожидаем файл beeline_antispam_hakaton_id_samples.csv
, в котором для тестовых данных
(test) проставлена одна из 5 категорий.
Помимо точности предсказания, мы также будем оценивать применимость решения в боевых условиях и качество инсайтов, полученных из данных.
Идеальное решение должно быть не только точным, но также стабильным и «лёгким».
Лёгким, так как реальные данные в тысячи раз тяжелее, а модель должна работать в режиме, приближенном к real-time, чтобы с минимальной задержкой реагировать даже на самых продвинутых мошенников, которые быстро меняют номера и подстраивают своё поведение для обхода антифрод-систем.
Под «лёгкостью» мы понимаем не столько сложность самого алгоритма (одна бустинг модель вполне ОК, десять «застеканных» моделей - нет), сколько глубину используемых данных (необязательно использовать целый месяц, можно попробовать ограничиться одной неделей или несколькими днями, если это не сильно влияет на точность).
Под стабильностью мы понимаем постоянство качества модели в динамике как в целом по категориям, так и по каждому конкретному номеру (в идеальном мире один и тот же номер, если он не меняет фактического владельца, должен иметь одинаковый скор и вчера, и сегодня и завтра). Метрику стабильности, в особенности для случая с конкретными номерами, мы предлагаем вам придумать самим.
В частности, нам бы хотелось, чтобы вы ответили на следующие вопросы (но, возможно, вы захотите поисследовать в данных что-то ещё):
- Какие паттерны поведения номеров помогают отделить категории 1-4 друг от друга?
- Насколько отличаются предсказания модели, построенные на разных периодах времени?
- Не «ломается» ли модель в выходные и праздники?
- Какое минимальное количество дней исторических транзакций требуется для, чтобы построить стабильную и достаточно точную модель?
- Какую метрику стабильности скора по отдельным номерам вы предлагаете использовать?
- Как модель работает на слабоактивных номерах?
- Среди номеров из наиболее «спорных» категорий 2 и 3, возможно ли выделить полезный и нежелательный трафик на уровне конкретного звонка?
Мы очень приветствуем, чтобы ваши выводы были подкреплены конкретными цифрами и графиками (визуализация должна подтверждать тезис и быть читаемой, но её красота сама по себе не оценивается).
Удачи!
id_a
- id абонента, который звонитid_b
- id абонента, которому звонятtime_key
- дата звонкаstart_time_local
- время начала звонкаtime_zone
- часовая зона звонящего абонентаduration
- длительность звонкаforward
- индикатор переадресацииzero_call_glg
- категория звонка с нулевой длительностьюsource_b
- индикатор транзакции из источника Bsource_f
- индикатор транзакции из источника Fnum_b_length
- длина номера абонента, которому звонят
В проекте используется интерпретатор Python 3.12.1.
Виртуальное окружение я создавал с Poetry. Для начала вам понадобится установить данный инструмент, затем создать и активировать виртуальное окружение и установить необходимые зависимости
potry install
В качестве WorkFlow-менеджера используется DVC. Пайплайн можно прогнать следующей командой:
dvc repro