Задача

Строим полноценную рекомендательную систему! Участникам необходимо разработать сервис, который сможет отвечать на запросы с предсказаниями будущих покупок клиента и при этом держать высокую нагрузку. По информации о клиенте и его истории покупок необходимо построить ранжированный список товаров, которые клиент наиболее вероятно купит в следующей покупке.

Критерий качества

Решение должно представлять собой архив с кодом сервиса. Метрика качества - MNAP@30 (Mean Average Precision), средний по всем запросам нормализованный Average Precision. Решение должно обязательно уложиться в ограничения по ресурсам. Если решение не выдерживает нагрузки или отвечает на запросы слишком долго — оно не будет считаться успешно прошедшим тестирование. Запросы поступают в строго хронологическом порядке.

Призы

Призовой фонд задачи - 800 000 ₽! Команда-победитель получит 300 000 ₽, второе место - 150 000 ₽, третье - 100 000₽, а четвертое и пятое места - по 75 000 ₽.
Плюс в номинации за лучшее выложенное в опенсорс решение - дополнительно два приза по 50 000₽. Разрешены команды до 4 человек, со всего мира. В каждой из задач Retail Hero можно участвовать в разных составах команд.

 Правила соревнования

Данные

Для обучения предлагается использовать набор данных из задачи о моделировании uplift-а (общий набор данных):

  • clients.csv: информация о клиентах;
  • products.csv: информация о товарах;
  • purchases.csv: история покупок клиентов до момента рассылки.

Участникам предоставляется проверочный набор запросов check_queries.tsv, построенный на основе этих данных. Время всех запросов — позже 2019-03-01. Файл check_queries.tsv имеет формат:

  <query> \t <next_transaction> \n
<query> \t <next_transaction> \n
...

Здесь <query> — тело запроса (см. описание программного интерфейса), <next_transaction> — информация о ближайшей (после запроса) покупке, на основе этой информации будет вычисляться точность построенного списка товаров.

Тестовые запросы делаются по пользователям, которых нет в общем наборе данных.

Программный интерфейс решения

Решение должно быть выполнено в виде HTTP-сервера, доступного по порту 8000, который отвечает на два вида запросов:

GET /ready
На запрос необходимо ответить кодом 200 OK в случае, если решение готово к работе. Любой другой код означает, что решение еще не готово. У решения есть ограниченное время на подготовку к работе, за которое можно прочитать данные с диска, создать в оперативной памяти необходимые структуры данных.

POST /recommend
Запрос на генерацию списка рекомендованных товаров. Тело запроса — JSON (Content-Type: application/json) с информацией о клиенте и его предыдущих покупках. Ответ на запрос необходимо предоставить в формате JSON. Обязательно использовать заголовок Content-Type: application/json.

Метрика качества

Математической метрикой успешности решения задачи является MNAP@30: усредненный по всем запросам нормализованный Average Precision.

task 2 function task 2 function

Здесь Q — множество запросов на рекомендацию товаров, Precision@k(q) — доля релевантных товаров в первых k позициях списка рекомендаций, а IdealAP(q) — максимальное значение AP(q), достижимое в случае, когда первые позиции рекомендованного списка заполнены релевантными рекомендациями.

AP измеряется от 0 (в списке из 30 не нашлось ни одного релевантного товара) до 1 (весь топ списка рекомендаций заполнен релевантными товарами). Число купленных клиентом товаров (набор релевантных товаров) не влияет на вес запроса в метрике.

Формат решений

В проверяющую систему необходимо отправить код алгоритма, запакованный в ZIP-архив. Решения запускаются в изолированном окружении при помощи Docker, время и ресурсы для тестирования ограничены. В простом случае, участнику нет необходимости разбираться с технологией Docker.

В корне архива обязательно должен быть файл metadata.json следующего содержания:

{
"image": "datasouls/python",
"entry_point": "python generator.py"
}

Здесь image — поле с названием docker-образа, в котором будет запускаться решение, entry_point — команда, при помощи которой запускается решение. Для решения текущей директорией будет являться корень архива.

Для запуска решений можно использовать существующие окружения:

  • datasouls/python — Python3 с установленным большим набором библиотек;
  • openjdk - для Java;
  • Также, подойдет любой другой образ, доступный для загрузки из DockerHub.

При необходимости, Вы можете подготовить свой образ, добавить в него необходимое ПО и библиотеки; для использования его необходимо будет опубликовать на DockerHub.

Архив с материалами

Технические ограничения

Решение запускается в следующих условиях:

  • решению доступны ресурсы: 8 Гб оперативной памяти, 4 vCPU;
  • решение не имеет доступа к интернету;
  • время на подготовку к работе: 5 секунд (после чего на запрос /ready необходимо отвечать кодом 200)
  • решение должно выдерживать нагрузку в 20 RPS (запросов в секунду), запросы должны обрабатываться одновременно;
  • ограничение по времени запроса /recommend: максимальное 1 сек, 95% запросов должны укладываться в 0.3 сек;
  • решение должно принимать HTTP запросы с внешних машин (не только localhost/127.0.0.1);
  • максимальный размер упакованного и распакованного архива с решением: 1 Гб;
  • максимальный размер используемого Docker образа: 10 Гб.

Запросы поступают в строго хронологическом порядке.