Участникам предстоит предсказать наиболее релевантные объявления для пользователей Авито
В этом соревновании нужно отобрать наиболее релевантные объявления, с которыми пользователь проконтактирует. При этом важно соблюсти баланс между вертикалями каталога (всего 8 анонимизированных значений vertical_id): модель должна удерживать качество сразу во всех категориях, а не выигрывать только за счёт одной вертикали.
Для обучения предоставлены обезличенные действия пользователей на площадке Авито за период с 21 января 2026 по 22 апреля 2026. Все исходные идентификаторы (user_id, item_id, eid, vertical_id) анонимизированы.
Датасет разделён по дате:
2026-04-15 00:00:00, используются для обучения (~5 млрд событий).2026-04-15 00:00:00 — 2026-04-15 12:00:00 (12 часов), события из этого окна не используются ни в train, ни в eval.2026-04-15 12:00:00 по 2026-04-22 для 94 408 пользователей, используются как таргет для проверки качества.Для каждого пользователя из eval-выборки нужно предсказать до 160 уникальных item_id, с которыми он проконтактирует в период eval.
Решение загружается в виде CSV-файла с двумя колонками — user_id и item_id. Одна строка — одна пара (пользователь, объявление).
user_id,item_id
12,8345
12,91024
12,12
77,553
77,91024
...
Ограничения на файл:
user_id (Recall@160);(user_id, item_id) должны быть уникальны — дубликаты считаются ошибкой валидации;user_id должны принадлежать eval-выборке (см. eval_users.csv), item_id — множеству из item_features.parquet;Качество предсказаний оценивается метрикой Recall@160, усреднённой по пользователям eval-выборки:
recall_u = |predicted_u ∩ targets_u| / |targets_u|
Recall@160 = mean over users u of recall_u
Где targets_u — это множество объявлений, с которыми пользователь u реально проконтактировал в eval-периоде (см. раздел «Как собирается eval»), а predicted_u — его кандидаты из сабмита (не более 160).
Лидерборд разделён на Public и Private:
(user_id, bucket) в пропорции 20% / 80% внутри каждого бакета (вертикального и holdout). Стратификация гарантирует, что каждая вертикаль и каждый holdout-пул внесли пропорциональный вклад и в Public, и в Private.Для оффлайн-валидации можно использовать готовый скрипт prepare_local_eval.py (см. раздел «Локальная валидация»).
Eval-таргет собирается из реальных контактных событий пользователей в период с 2026-04-15 12:00:00 по 2026-04-22. Баланс по вертикалям достигается через квоты по бакетам: 5 вертикальных + 5 holdout, до 10 000 пользователей в каждом.
timestamp ≥ 2026-04-15 12:00:00 (12-часовой gap после train).eid из contact_eids.csv.item_id встречается в train у ≥ 2 разных пользователей;(user_id, item_id) отсутствует в train-истории пользователя (anti-join — eval-таргет должен быть «новой» рекомендацией, а не повторным контактом по уже увиденному объявлению);item_id входит в item_features.parquet.mapped_vertical_id: v0={0}, v2={2}, v3={3}, v4={4}, v57={5, 7} (id 5 и 7 объединены в один бакет). mapped_vertical_id 1 и 6 — в eval не входят;item_id по времени — эта длина совпадает с лимитом сабмита (Recall@160).Концептуально пайплайн (без literal-путей — пост-threshold кликстрим участникам не публикуется):
# 1. Items с >=2 уникальными пользователями в train train_items_2u = train.group_by("item_id").agg(...).filter(n_users >= 2) # 2. (user, item) пары, виденные в train — для anti-join seen_in_train = train.select(["user_id", "item_id"]).unique() # 3. Eval-кандидаты: # timestamp >= EVAL_START_MS (после 12h gap, начало 2026-04-15 12:00 MSK) # eid ∈ contact_eids # item_id ∈ train_items_2u # (user_id, item_id) ∉ seen_in_train candidates = post_threshold_clickstream \ .filter(...).join(train_items_2u).join(seen_in_train, how="anti") # 4. Бакетинг 5 vertical (до 10k каждый) + 5 holdout × 10k → 94 408 пользователей. # 5. Первые K=160 уникальных контактных item_id на пользователя по timestamp.
Полностью runnable версия этого же пайплайна (но на синтетическом split внутри train) — это prepare_local_eval.py (см. раздел «Локальная валидация»). Если нужно своими руками воспроизвести логику оффициального eval — изучайте именно его, постановка фильтров идентичная.
История этих 94 408 пользователей до 2026-04-15 00:00:00 доступна отдельно в eval_user_events.pq — её можно свободно использовать для инференса и обучения: это не таргет, а история пользователя на момент предсказания.
Чтобы экспериментировать с моделью без расхода квоты сабмитов, опубликован готовый скрипт prepare_local_eval.py, который собирает «искусственный» eval внутри train-периода с тем же набором фильтров:
python prepare_local_eval.py \ --train data/train.parquet \ --item-features data/item_features.parquet \ --contact-eids data/contact_eids.csv \ --out data/local_eval.csv # ...затем тренируйте модель только на событиях с timestamp < 2026-04-08 00:00:00, # предсказывайте 160 кандидатов на пользователя в local_eval.csv, # скоррируйте через bin/datafest_2026_v2/calc_metric.py
CLI принимает только пути к данным и --synth-threshold (по умолчанию 2026-04-08 00:00:00 — на неделю раньше реальной). Остальные параметры зашиты в скрипт как константы и совпадают с официальной спецификацией: 12h gap, K=160, ≥2 users per item, 0.9 vertical threshold, бакетинг v0/v2/v3/v4/v57+5 holdout по 10 000 пользователей. Скрипт пишет два файла: local_eval.csv (для calc_metric.py) и local_eval_users.csv (user_id → bucket — для per-bucket анализа Recall@160).
Эталонный простейший бейзлайн — Popular: popular.py. Запускается одной командой и выдаёт валидный сабмит за ~10 секунд:
python popular.py \ --eval-user-events data/eval_user_events.pq \ --item-features data/item_features.parquet \ --eval-users data/eval_users.csv \ --out submission_popular.csv
Что считается: топ-160 самых частых item_id в pre-threshold истории eval-пользователей, ограничено вертикалями {0, 2, 3, 4, 5, 7} (то есть используемыми в eval-бакетах). Один и тот же список для всех 94 408 пользователей.
Участники могут объединяться в команды до 4 человек.
Канал общения и обсуждения между участниками всех вопросов — https://t.me/+CoMfO8J2F8w4MzQy
Период выбора итоговых решений до 12:00 (по московскому времени) 27 мая 2026
Задачей является предсказание актуальных для пользователя объявлений на основании истории пользователя и метаинформации о нем и объявлениях. Участникам необходимо определить с какими объявления пользователь вероятнее всего проконтактирует.
Ознакомиться с Правилами участия в соревновании AvitoTech ML cup 2026
Все файлы и их описание вы найдете во вкладке “Данные” после старта соревнований
1 место - 300 000 рублей
2 место - 250 000 рублей
3 место - 200 000 рублей
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