Мы предлагаем решить две задачи:
- Определить есть ли в объявлении контактная информация
- Найти положение контактной информации в описании объявлении
Первая задача обязательная. Вторая - со звездочкой, можете решить ее если останется время или желание :)
Для обучения и инференса обоих задач у вас есть следующие поля:
title
- заголовок,description
- описание,subcategory
- подкатегория,category
- категория,price
- цена,region
- регион,city
- город,datetime_submitted
- дата размещения.
Таргет первой задачи: is_bad
. Для второй разметка не предоставляется.
Есть два датасета: train.csv
и val.csv
.
В датасетах могут встречаться (как и, к сожалению, в любых размечаемых данных) некорректные метки.
train.csv
содержит больше данных, однако разметка в нём менее точная.
В val.csv
существенно меньше данных, но более точная разметка.
Тестовый датасет, на котором мы оценим решение, будет больше похож на val.csv
.
val.csv
находится в папке ./data
.
train.csv
можно качать скриптом ./data/get_train_data.sh
или перейдя по
ссылке
В первой задаче необходимо оценить вероятность наличия в объявлении контактной информации.
Результатом работы модели является pd.DataFrame
с колонками:
index
:int
, положение записи в файле;prediction
:float
от 0 до 1.
Пример:
index | prediction |
---|---|
0 | 0.12 |
1 | 0.95 |
... | ... |
N | 0.68 |
В качестве метрики качества работы вашей модели мы будем использовать усредненный ROC-AUC
по каждой категории объявлений.
Во второй задаче необходимо предсказать начало и конец контактной информации в описании (description
) объявления.
Например:
- для строки
Звоните на +7-888-888-88-88, в объявлении некорректный номер
: (11, 26), - для строки
Звоните на +7-888aaaaa888aaaa88a88, в объявлении некорректный номер
: (11, 33), - для строки
мой tg: @ivanicki_i на звонки не отвечаю
: (8, 18), - для строки
мой tg: ivanicki_i на звонки не отвечаю
: (8, 17), - если в описании объявления (поле
description
) контактов нет, то (None, None) - если в описании объявления (поле
description
) более одного контакта (Звоните не 89990000000 или на 89991111111
), то (None, None).
Результатом работы модели является pd.DataFrame
с колонками:
index
:int
, положение записи в файле;start
:int
orNone
, начало маски контакта;finish
:int
orNone
, конец маски контакта.
(start
<finish
)
Пример:
index | start | finish |
---|---|---|
0 | None | None |
1 | 0 | 23 |
2 | 31 | 123 |
... | ... | |
N | None | None |
Для этой задачи метрикой будет усредненный IoU (Intersection over Union
) по текстам объявлений.
Ваш код для обучения и инференса моделей должен располагаться в папке ./lib
.
Чтобы мы могли проверить ваше решение необходимо изменить метод process
класса Test
в файле ./lib/run.py
.
В нем происходит инференс вашей модели на тестовых данных.
Метод должен возвращать два датафрейма с ответами к задачам 1 и 2 соответственно.
Вы можете получить доступ к валидационным, трейновым (если файл скачан) и тестовым данным с помощью методов 'val', 'train' и 'test'.
Для того чтобы было легче разобраться как происходит запуск моделей мы подготовили константные
"модели" (./lib/model.py
), которые примеряются в ./lib/run.py
для формирования финального ответа.
Форматы тестового файла (в нем будет отсутствовать стобец is_bad
), ответов зачач 1 и 2 приведены выше.
После прогона будут запущены минимальные чекеры на соответствие ответов описанному формату
Решение будет проверяться в автоматическом режиме.
Перед отправкой решения вам необходимо убедиться что все работает корректно запустив команду
docker-compose -f docker-compose.yaml up
в корне данного репозитория.
Весь локальный код репозитория мапится в папку /app
контейнера, локальная папка ./data
мапится в /data
контейнера.
После этого запускается команда python lib/run.py --debug
.
Чтобы все заработало у вас в системе должны быть установлены docker
и docker-compose
.
Вы можете добавить нужные библиотеки в файл requirements.txt
или напрямую в Dockerfile
.
Во время инференса моделей у контейнера не будет доступа в интернет.
Обратите внимание, что в контейнере по умолчанию используется python3.8.
Ресурсы контейнера:
- 4 Гб оперативной памяти
- 2 ядра CPU
- 1 GPU, 2 Гб памяти
Ограничение на время работы:
- 60 000 объектов должны обрабатываться не более 180 минут для предсохраненной модели на CPU и 30 минут на GPU.
Важно, чтобы всё, что нужно для запуска run.py, было в репозитории.
Часто решающие предлагают перед запуском вручную скачать архив с весами модели, в таком случае нужно чтобы веса скачивались и распаковывались при сборке контейнера либо обучение происходило в пайплайне.
- Убедиться, что команда
docker-compose -f docker-compose.yaml up
работает корректно. - Закоммитить код для обучения и инференса модели в master
- Открыть issue в своем репозитории и добавить учетку avito-ds (https://github.com/avito-ds) в Assignes. Если это не первая попытка, то можно переоткрыть старый issue, все так же добавив avito-ds в качестве assignee.
- Предупредить рекрутера Авито/контакта из кадрового агентства о том, что ты выложил финальный результат и прислать ссылку на issue!
Удачи :)
Создать issue с вопросом и добавить учетку avito-ds в качестве assignee.
Веса моей модели весят много, могу ли я добавить веса через git LFS?
Через git LFS нет, но есть workaround. В git можно свободно коммитить файлы до 100 мб. Для файлов большего размера должна применяться git LFS, причем для форкнутых репозиториев применяется квота avito-ds. Текущая квота не достаточна для этих целей. В качестве workaround можно добавить команду или скрипт на скачивание весов из облака в Dockerfile.
Текущий бэйзлайн, который надо побить для первой части - 0.92.