Discord

Checklist NTO AI 2026 Final Stage, engineering tour (team) · 4.3 task

Lost Interactions

Russian title: Кейс «Потеряшки»

Recover the positive user–edition interactions that were lost from a book service's logs during an incident, ranking 20 editions per user.

  • Tabular
  • Recommendation (candidate generation and ranking)
  • Russian original · English translation

The task

After a faulty night release of a book service (LiveLib data, according to the season results news), part of the positive events (wishlist additions and reads) never reached storage, so user histories are incomplete. In the incident window from 2025-10-01 00:00:00 to 2025-11-01 00:00:00, about 20% of positive (user_id, edition_id) pairs were hidden, unevenly across users and time; the exact protocol is not disclosed.

For every user in targets.csv, teams of two build an ML pipeline (candidate generation over the whole catalogue, ranking, final top-20 list) that returns the 20 editions most likely to be lost positive interactions. The event type does not have to be predicted; evaluation is on unique (user_id, edition_id) pairs.

Abridged and translated by SOTA from the official Russian materials. The official statement has the exact rules, and it wins wherever this summary differs.

In English

This task was published in Russian. SOTA translated its 6 files into English on 16 September 2026.

Read the task statement in English 1318 words

Lost Interactions

English translation by SOTA – AI Community of the Russian original. Organisers who would like this translation removed can email [email protected].

4.3. Engineering tour

4.3.1. General information

The task of the final stage of the "Artificial Intelligence" profile: for each user in targets.csv, build a ranked list of 20 editions (edition_id) that are most likely to be lost positive interactions. The solution consists in building an ML pipeline: candidate generation, ranking and assembly of the final list.

4.3.2. Task backstory

The overnight release of a book service went wrong. During the migration of the event schema, some of the production workers began writing logs in the new schema, while the rest stayed on the old one. Because of a bug in the consumer and in deduplication, some of the positive events never reached the final storage.

As a result, the users' interaction history has become incomplete. This degrades personalisation, recommendations and product analytics.

Your role is the recommender-system team, which has to restore the most likely lost positive interactions from the observed data.

4.3.3. Requirements for the team and the participants' competencies

Number of participants in a team: two people.

Competencies that the team members must have:

  • data analysis;
  • machine learning;
  • deep learning.
4.3.4. Equipment and software
Item Description
Name and link (if any) What it is used for in the task
Sberbook <Insert the Sberbook specifications> Laptop on which the solution is developed, run and tested
PyCharm/ VSCode IDE for development and for working with the solution code.
4.3.5. Task description

For each user in targets.csv, you need to build a ranked list of 20 editions (edition_id) that are most likely to be lost positive interactions.

The solution consists in building an ML pipeline.

  1. Candidate generation — searching for potentially relevant editions across the entire available catalogue.
  2. Ranking — selecting the top 20 most likely lost items.
  3. Assembly of the final list — outputting the top 20 for each user.

A detailed description of the file structure and the fields is given in the "Data" section and in data_description.md in the baseline repository.

Positive events in the logs:

  1. event_type = 1 — adding to the wishlist (wishlist).
  2. event_type = 2 — reading (read).

Scoring is done at the level of a unique pair (user_id, edition_id), not at the level of event rows.

A lost item is a hidden (lost) positive pair (user_id, edition_id) from the incident window. The solution does not need to predict the type of the positive event (wishlist/ read).

The loss of positive interactions is partial: in the incident window, about 20% of the positive pairs (user_id, edition_id) are hidden. The losses are uneven across users and over time. The event types (wishlist and read) may be affected to different degrees. The exact protocol by which the hidden lost items were formed is not disclosed. The case is built on a period of 214 days that contains an incident window: from 2025–10–01 00:00:00 to 2025–11–01 00:00:00. Participants receive the observed log for the whole period, in which artificial losses have been applied within the incident window.

Incomplete logs are a realistic problem of production systems. Event losses can arise from migration errors, ETL failures, schema desynchronisation and problems in the message-delivery pipelines.

This case models the emergency recovery of signals for a recommender system. The goal is to build a reproducible ML pipeline that restores the most likely lost positive interactions from the observed data.

Important! In real systems, recovered events are usually treated as a model layer rather than as a replacement for the primary logs.

Data description

Link to the data: https://disk.360.yandex.ru/d/9rEAVmnI_Ic56Q/data.

File interactions.csv

The observed log of user interactions after the partial loss of events. Each row is one event.

Field Description Comment
user_id user identifier (FK → users.user_id) -
edition_id edition identifier (FK → editions.edition_id) -
event_type event type: 1 — wishlist, 2 — read -
rating rating (only for read, otherwise NULL) -
event_ts date and time of the event -

File targets.csv

The list of users for whom the lost positive interactions must be restored.

Field Description Comment
user_id user identifier a single column

File editions.csv

Reference table of editions (edition-level). Each edition is linked to one book.

Field Description Comment
edition_id edition identifier (PK) -
book_id book identifier -
author_id author identifier (FK → authors.author_id) -
publication_year year of publication of the edition, not of the book of the edition, not of the book
age_restriction age restriction e.g. 18+
language_id language identifier no reference table
publisher_id publisher identifier no reference table
title title -
description description text

File authors.csv

Reference table of authors.

Field Description Comment
author_id author identifier (PK) -
author_name author name full name or pseudonym

File genres.csv

Reference table of genres.

Field Description Comment
genre_id genre identifier (PK) -
genre_name genre name -

File book_genres.csv

Many-to-many link between books and genres.

Field Description Comment
book_id book identifier -
genre_id genre identifier (FK → genres.genre_id) -

File users.csv

Reference table of users with demographic features.

Field Description Comment
user_id user identifier (PK) -
gender gender: 1, 2 or NULL -
age age (may be NULL) -

Solution format and requirements

You must submit the file submission.csv of the following form:

user_id,edition_id,rank.

Technical requirements:

  1. For each user_id in targets.csv there must be exactly 20 rows.
  2. Rank must be an integer from 1 to 20.
  3. Within one user_id, the rank values must not repeat.
  4. Within one user_id, the edition_id values must not repeat.
  5. The file must contain predictions for all users in targets.csv.
  6. The order of the rows in the file does not matter.

Example of a valid solution file (sample_submission.csv): https://disk.360.yandex.ru/d/9rEAVmnI_Ic56Q.

4.3.6. Scoring system

The final score is computed as the mean NDCG@20 over all test users. The metric rewards separately for hitting a lost item and for correct ranking.

For each user_id in targets.csv, the participant predicts 20 rows with the fields edition_id and rank (1–20). The organisers hold a hidden labelling is_lost{0,1}is\_lost \in \{0, 1\} for the pairs (user_id, edition_id), where 1 means that the pair is a lost item and 0 means that it is not.

Definitions: rel(rank)=1rel(rank) = 1 if the edition at position rank is a lost item for this user, otherwise rel(rank)=0rel(rank) = 0.

discount(rank)=1/log2(rank+1)discount(rank) = 1/\log_2(rank + 1).

DCG_user@20=rel(rank)discount(rank)\text{DCG\_user@20} = \sum rel(rank) \cdot discount(rank) over rankrank from 1 to 20.

IDCG_user@20=discount(rank)\text{IDCG\_user@20} = \sum discount(rank) over the ideal ranking up to min(relevant_items,20)\min(|\text{relevant\_items}|, 20).

NDCG_user@20=DCG_user@20/IDCG_user@20\text{NDCG\_user@20} = \text{DCG\_user@20}/\text{IDCG\_user@20} if IDCG_user@20>0\text{IDCG\_user@20} > 0, otherwise 0.

Averaging is done over users. The metric evaluates only the hidden lost positive interactions. Scoring is done over the pairs (user_id, edition_id). The Public leaderboard and the Private leaderboard use the same scoring principle on different hidden subsets of users. The split into Public and Private is made by users in a 50/50 proportion.

The collection's solution for this task is in the separate solution file.

4.3.8. Preparation materials
  • Baseline: https://github.com/Orange-Hack/nto-ai-25-26-final-baseline.
  • A detailed description of the file structure and the fields is given in the "Data" section and in data_description.md in the baseline repository.
  • Examples of computing the metric are given in metric_examples.md in the baseline repository.

Translated by SOTA. The Russian original is the official version and wins wherever the two differ. The statement is section 4.3 (pages 139–143) of the official 2025/26 task collection; the case is called «Потеряшки» ("lost items") in Russian. The data and the reference solution are only on the organisers' Yandex Disk, and the baseline code is in the Orange-Hack repository. If you organise this olympiad and would like the translation removed, email [email protected] and we will take it down.

At a glance

You get
interactions.csv (user_id, edition_id, event_type 1 = wishlist / 2 = read, rating for reads, event_ts), targets.csv (user_id), editions.csv (edition_id, book_id, author_id, publication_year, age_restriction, language_id, publisher_id, title, description), authors.csv, genres.csv, book_genres.csv, users.csv (gender, age).
You submit
submission.csv with columns user_id, edition_id, rank: exactly 20 rows per target user, ranks 1–20 without repeats, no repeated editions per user, all target users present.
Scoring
Mean NDCG@20 over users with binary relevance (1 if the edition is a hidden lost pair for that user); IDCG uses min(|relevant|, 20) positions and NDCG is 0 when IDCG is 0. Public and private leaderboards split users 50/50. Team scores are normalised to 100·x/MAX.
Rules
  • Team of 2 (data analysis, machine learning, deep learning).
  • Development on a Sberbook laptop with PyCharm or VS Code (the collection leaves the hardware specification as a placeholder).
  • Participation implies acceptance of the final-stage rules linked from the baseline repository.
Format
Final stage, team engineering tour; weighted 0.7 in the individual final score (informatics and mathematics subject tours 0.15 each).

Details

Year
2026, Moscow, Russia
Round
Final Stage, engineering tour (team) · 4.3 task
Language
Russian; English translation by SOTA
License
Not stated by the source