Прими участие в заключительном хакатоне этого года от Академии ИИ! Ты сможешь попасть в сообщество самых сильных специалистов по ИИ среди школьников, а еще выиграть реальные деньги уже в школе!
AIAcademyХакатонИИ
Нажимая кнопку «Отправить решение», вы соглашаетесь с Правилами участия в соревновании.
Книжный сервис хочет показывать пользователю витрину рекомендаций «на следующий период» (в нашем случае — месяц, 30 дней).
Поэтому задача формулируется как баланс между точной персонализацией и жанровым разнообразием выдачи.
Для каждого пользователя из таблицы targets.csv необходимо сформировать ранжированный список из 20 изданий (edition_id) на следующий период (тестовое окно) из пула 200 кандидатов из таблицы candidates.csv (по каждому user_id).
Результат — ранжированный список, где rank = 1 соответствует верхней позиции витрины.
Нужно отправить файл submission.csv со списком рекомендаций.
Формат:
user_id,edition_id,rank
Требования к файлу:
rank — целое число от 1 до 20 (1 — верх витрины).user_id должно быть ровно 20 строк.edition_id и rank внутри одного user_id не должен повторяться.edition_id должны входить в 200 кандидатов для данного user_id.Итоговый скор считается как комбинация релевантности и жанрового разнообразия:
где черта сверху означает среднее значение по всем пользователям в тесте.
Идея: итоговая выдача должна быть релевантной, но при этом не однообразной по жанрам.
Для каждого пользователя сравнивается ваш ранжированный список из 20 изданий с фактом будущих взаимодействий в тестовом окне.
Релевантность для издания задаётся по сильному/слабому сигналам:
Примечания:
edition_id есть и read, и wishlist, то используется приоритет read ⇒ rel=3.Далее для пользователя u:
где rel^*(u,k) — релевантности в идеальной сортировке (сначала все read, затем wishlist, затем остальные) для данного пользователя.
Каждое издание x соответствует книге (через editions.book_id) и имеет множество жанров G(x) через book_genres.
Важно: вклад позиции учитывается только для изданий, у которых есть хотя бы одно взаимодействие в тестовом окне.
Определим бинарную релевантность:
и дисконт позиции:
Далее определим relevance-weighted diversity как смесь двух компонентов: покрытие жанров и внутрисписочная разнородность.
Пусть S_{u,k} — множество жанров, уже встретившихся среди релевантных рекомендаций выше позиции k:
где запись G(x) \cdot 0 означает пустое множество, а G(x) \cdot 1 = G(x).
Определим покрытие жанров как сумму дробных вкладов позиций (книга с m жанрами даёт суммарный вклад 1, распределённый как 1/m на каждый новый жанр), но:
Пример: если книга имеет 3 жанра и приносит 2 новых, то вклад равен 2/3.
Определим попарную жанровую дистанцию как Jaccard-distance по множествам жанров:
Внутрисписочную разнородность считаем только среди релевантных рекомендаций (с \tilde{rel}=1). Пусть L_u — множество индексов позиций в топ-20, на которых рекомендация релевантна:
Если |L_u| < 2, то ILD_u@20 = 0. Иначе:
Смешиваем покрытие и внутрисписочную разнородность:
Our website uses cookies, including web analytics services. By using the website, you consent to the processing of personal data using cookies. You can find out more about the processing of personal data in the Privacy policy