# NTO 2025/2026 — "Artificial Intelligence" profile

*English translation by SOTA – AI Community of the Russian original. Organisers who would like this translation removed can email sota.ai.community@gmail.com.*

## Individual stage

This document is a reference for the data and for the format of the solution file.

---

## 1. Data description

**Main format of the source data:** CSV with a semicolon (`;`) separator and double quotes (`"`) for escaping text fields.

### 1.0. Getting the data

The data are on the page https://ods.ai/competitions/nto25-26-2-individ/dataset/ as the zip archive "stage1_individual_data"

### 1.1. Files provided

| File | Description |
|------|----------|
| `train.csv` | The training set, corresponding to the first chronological slice of the data (chunk 1). Contains the full history of user interactions for this period, including books that were read (`has_read=1`) and books on the "to read" list (`has_read=0`). |
| `test.csv` | The test set, containing interactions from the second chronological slice (chunk 2). For each user in the test set, it contains only one pair (user_id, book_id), corresponding to the last work that user read. Important: test.csv includes only those users who have a sufficient history in train.csv. |
| `books.csv` | Book metadata (author, year of publication, etc.). |
| `users.csv` | User metadata (gender, age). |
| `genres.csv` | Reference table of genres. |
| `book_genres.csv` | Table linking books and genres (many-to-many). |
| `book_descriptions.csv` | Text descriptions of books. Used to extract features via TF-IDF and BERT. |

### 1.2. Description of the fields in the metadata

#### train.csv: Training set

| Field | Type | Description |
|------|-----|----------|
| `user_id` | int64 | Unique user identifier. |
| `book_id` | int64 | Unique book identifier. |
| `has_read` | int64 | Interaction flag: 1 - the book was read and rated, 0 - the book was added to the "to read" list (not rated). |
| `rating` | float64 | Rating of the book on a scale from 0 to 10. For records with `has_read=0`, the value is always 0 and is a placeholder. |
| `timestamp` | str | Timestamp of the interaction in the format `YYYY-MM-DD HH:MM:SS`. |

**Important:** In the baseline, only records with `has_read=1` (books that were given a rating) are used for training. Records with `has_read=0` are excluded from the training set. However, it is quite likely that using the records with`has_read=0` will improve the metric value if they are used correctly.

#### Principles by which the data were formed

1.  **Chronological split:** `train.csv` is the earliest chunk of data (`chunk_1`), and the data for `test.csv` and `solution.csv` are taken from the next chunk (`chunk_2`). This guarantees that there are no leaks from the future.

2.  **Filtering of the test set:** `test.csv` does not include all interactions from `chunk_2`, but only specially selected ones:
    - **Last interaction:** For each user, only one interaction is taken: the most recent one with the flag `has_read=1`.
    - **Filter of "warm" users:** `test.csv` includes only those users who have a history in `train.csv`. Criterion: at least 1 book read (`has_read=1`) OR at least 3 books on the "to read" list (`has_read=0`) in the file `train.csv`. This guarantees that participants will have source data for all users in the test.

3.  **Data cleaning:** Anomalous records with `has_read=0` but `rating > 0` were removed from the source dataset.

#### books.csv: Book information

| Field | Type | Description |
|------|-----|----------|
| `book_id` | int64 | Unique book identifier (primary key). |
| `title` | str | Book title. |
| `author_id` | int64 | Unique author identifier. |
| `author_name` | str | Author name. |
| `publication_year` | int64 | Year of publication. |
| `language` | int64 | Numeric code of the book's language. |
| `avg_rating` | float64 | Average rating of the book (computed over all interactions). |
| `publisher` | int64 | Numeric code of the publisher. |

#### users.csv: User information

| Field | Type | Description |
|------|-----|----------|
| `user_id` | int64 | Unique user identifier (primary key). |
| `gender` | int64 | User's gender (1 — male, 2 — female). |
| `age` | int64 | User's age. |

#### genres.csv: Reference table of genres

| Field | Type | Description |
|------|-----|----------|
| `genre_id` | int64 | Unique genre identifier (primary key). |
| `genre_name` | str | Genre name. |
| `books_count` | int64 | Total number of books in this genre. |

#### book_genres.csv: Link between books and genres

| Field | Type | Description |
|------|-----|----------|
| `book_id` | int64 | Book identifier (foreign key to books.csv). |
| `genre_id` | int64 | Genre identifier (foreign key to genres.csv). |

#### book_descriptions.csv: Book descriptions

| Field | Type | Description |
|------|-----|----------|
| `book_id` | int64 | Book identifier (foreign key to books.csv). |
| `description` | str | Text description of the book. May contain empty values. |

**Note:** The descriptions are used to extract features in two ways:
- **TF-IDF**: creating sparse features based on terms and bigrams from the descriptions
- **BERT embeddings**: obtaining dense vector representations of the text with the pre-trained model `DeepPavlov/rubert-base-cased`

---

## 2. Format of the solution file (submission)

The solution file must be in CSV format with a comma (`,`) separator. The file may contain a header, which will be ignored during checking.

**Column structure:** `user_id,book_id,rating_predict`

**Requirements:**
- `user_id`, `book_id` — identifiers corresponding to the pairs from the file `test.csv`. The order of the rows in the solution file does not matter.
- `rating_predict` — the predicted rating value. A real number in the range from 0 to 10. Rounding is not required. The system will automatically clip the values to the range [0, 10].
- The file must contain predictions for all pairs from `test.csv`.
- Maximum file size: 50 MB.

**Example contents of submission.csv:**

```
user_id,book_id,rating_predict
150,25357,7.854
150,18,9.102
24995,136814,5.500
```
