← Back to the problem

Kazakhstan FAIO 2025 · Statement

HearMe: Personalized Music Recommender

Formatted by IOAI Training from the original (BeksultanSagyndyk/faio-tasks, licence Apache-2.0). The original is authoritative.

Overview

🏆

Welcome to the Music Recommendation System Challenge! 🎶

Our Team:

  • Djalil — Product Owner at hitter & Izi, wants every user to discover the perfect soundtrack for their day 🎧
  • Darkhan — Data Scientist, tasked with turning mountains of user data into smart, personalized recommendations 💡
  • Adilkhan — an active user of the platform, curious and eager for new music discoveries 🎵

Your mission: help Darkhan build a recommendation system that predicts the top 50 most relevant tracks for each user based on their listening history and preferences — making sure users like Adilkhan get the songs they love most.

The dataset comes from real interactions on hitter and Izi, where users listen, like, and download tracks daily. You can explore any approach — from classic machine learning to deep learning or hybrid models.
Think of it as crafting the ultimate playlist that keeps Adilkhan hitting “play” again and again! 🚀


🎯 Goal

Build a model that recommends 50 tracks per user, aiming to predict which songs each listener will enjoy the most — and how much they’ll actually listen.

Help Darkhan impress Djalil with a model that truly understands users like Adilkhan, turning raw data into a seamless, personalized music experience. 🔥

Evaluation

📊 Evaluating Recommendation Quality

Here’s how we measure who made the best recommendations:

  1. Predict Tracks
    For each user (e.g., Adilkhan!), your model predicts a list of 50 tracks they might like.

  2. Check Listening Fractions
    For each recommended track, we record how much the user actually listened:

    • 0.0 — not listened at all
    • 0.25 — listened a quarter of the track
    • 0.5 — listened halfway
    • 0.75 — listened three-quarters
    • 1.0 — listened fully (replays don’t count extra)
  3. User Score
    Sum these fractions across the 50 tracks → this gives a score for that user (range: 0 to 50).

  4. Average per User
    Compute the mean of all users’ scores → tells us, on average, how many tracks each user actually listened to (range : 0 to 50).

  5. Final Score
    normalized score between 0 and 1.

📈 How to Interpret the Metric

  • Score ≥ 0.25 → Users are starting to engage with your recommendations. Even a quarter of a track counts as a small win!
  • Score ~0.5 → Users listen to about half of your recommendations. Nice job! Your suggestions are clearly interesting.
  • Score ~0.75 → Most tracks are listened to three-quarters of the way. Great work! Users really like your recommendations.
  • Score ~1.0 → Users fully listen to almost all recommended tracks. Excellent! You’re nailing it.

Submission

Overview

Your submission should contain ranked recommendations for each user in the test set. Each user must have exactly 50 item recommendations ranked from 1 to 50, where rank 1 is the most recommended item and rank 50 is the least recommended.

File Format

  • File Type: CSV file

Column Specifications

ColumnTypeDescriptionConstraints
idIntegerUnique row identifierSequential starting from 0
user_idIntegerUser identifier from test setMust match test set user_ids
item_idIntegerItem identifier to recommendMust be valid item_id
rankIntegerRecommendation rank1-50 (1 = highest, 50 = lowest)

Requirements

  • All columns are mandatory - missing any column will result in submission error
  • Each user in the test set must have exactly 50 recommendations
  • Ranks must be unique per user-item (1 through 50)
  • No duplicate item recommendations for the same user
  • Colum id is mandatory

Example , how to create id column:

recos.insert(0, 'id', range(len(recos)))

Sample Submission

iduser_iditem_idrank
011231
1131232
2132131233
311233123124
411125
5116
61737
71998
............
49170550

Dataset Description

This dataset is derived from real user interactions on the hitter and Izi music platforms. It includes user-track interactions, track metadata, and user metadata.

The training set covers production-level user behavior from 2025-02-28 to 2025-08-30 (a 6-month period).
The test set represents user interactions from 2025-09-01 to 2025-09-15, used to evaluate recommendation performance. It only includes users who appear in the training interactions (no cold-start users).

⚠️ Note: interactions.csv may contain noise, duplicates, or minor bugs reflective of real-world data.
⚠️ Note: item_metadata.csv, user_metadata.csv may have missing or incomplete records.


Files

  • interactions.csv — Records of user interactions with tracks
  • item_metadata.csv — Metadata about tracks
  • user_metadata.csv — Metadata about users
  • test.csv — List of users for whom predictions must be made

interactions.csv

ColumnDescriptionData TypeNotes
user_idUnique identifier for the user.IntegerReferences users in user_metadata.csv.
item_idUnique identifier for the track (item).IntegerReferences tracks in item_metadata.csv.
listened_durationDuration (in seconds) the user listened to the track in this interaction.IntegerMay be partial or noisy; includes skips/outliers.
listened_datetimeTimestamp of when the interaction occurred.DatetimeFormat: YYYY-MM-DD HH:MM:SS.ssssss.

🕒 Time Range: 2025-02-28 → 2025-08-30 (6 months of production-level data)


item_metadata.csv

ColumnDescriptionData TypeNotes
item_idUnique identifier for the track.IntegerPrimary key for tracks.
track_nameName/title of the track.StringMay include special characters or non-English text.
artist_nameName of the artist(s) or performer(s).StringCan include collaborations (e.g., “Artist feat. Other”).
track_durationFull duration of the track in seconds.IntegerTotal length of track.
track_genres_listComma-separated list of genres associated with the track.StringExample: ['Genre1', 'Genre2']; may include non-English genres.
track_dislike_countTotal dislikes received by the track.IntegerAggregate metric; starts at 0 for new tracks.
track_like_countTotal likes received by the track.IntegerAggregate metric; starts at 0 for new tracks.
track_download_countTotal downloads of the track.IntegerAggregate metric; starts at 0 for new tracks.

user_metadata.csv

ColumnDescriptionData TypeNotes
user_idUnique identifier for the user.IntegerPrimary key for users.
age_binBinned age group of the user (based on the ML model).StringExamples: '18_29', '30_44', '45_60', '61_inf'.
childrenNumber of children the user has (based on the ML model).Integer0–1
genderGender of the user (based on the ML model).String'M' for male, 'F' for female.
top_genreUser's preferred or inferred top genre.StringExamples: 'Поп', 'Джаз', 'Chill'; may be in non-English.
user_disliked_track_countTotal number of tracks disliked by the user.IntegerAggregate user-level metric.
user_liked_track_countTotal number of tracks liked by the user.IntegerAggregate user-level metric.
user_downloaded_track_countTotal number of tracks downloaded by the user.IntegerAggregate user-level metric.

test.csv

ColumnDescriptionData TypeNotes
user_idUnique identifier for the user.IntegerAll users exist in the training interactions; no cold-start users.

🧭 Time Range: 2025-09-01 → 2025-09-15 (interactions period for evaluation)


Prediction Format

The submission file must contain recommendations for each user in the test set, ranked by relevance or preference.

ColumnDescriptionData Type
idSequence of id .Integer
user_idUser identifier (matches test.csv).Integer
item_idRecommended track identifier.Integer
rankRank of the recommendation (starting from 1 to 50).Integer
kaggle competitions download -c hear-me-personalized-music-recommender