The problem
Playlists are how most people organize music, and the most useful music recommendation is often the simplest: given the songs already in a playlist, what belongs next? Spotify turned this into the RecSys Challenge 2018 by releasing the Million Playlist Dataset — 1,000,000 user playlists with 2M+ unique tracks from ~300K artists — and asking systems to continue partial playlists under 10 scenarios, from a bare title to 100 seed tracks. The full corpus is too heavy for casual student experimentation, and most tutorials retreat to toy collaborative filtering that ignores the playlist-continuation framing entirely. This project delivers a faithful, runnable slice of the real task: the authentic MPD schema, track embeddings learned from playlist co-occurrence, a three-signal scoring blend, and the challenge's exact evaluation protocol (R-precision, NDCG, clicks) on a documented subset — plus a playlist-builder demo where every recommendation explains itself.
How it works
- MPD JSON slices are parsed into playlist-track pairs; a documented subset is sampled with a fixed seed so any examiner can reproduce the build on a student PC.
- Track embeddings are learned with a Word2Vec-style objective over the playlist "sentences", capturing which tracks belong together.
- Audio features (danceability, energy, valence) are normalized per track from the dataset's track metadata.
- At inference, each candidate track is scored by the three-signal blend against the seed tracks and the playlist title, then ranked.
- The demo renders the top continuations with score bars and reason chips; the track explorer shows any track's audio-feature profile.
- Evaluation truncates each test playlist per the 10 challenge scenarios, recommends 500 tracks, and computes R-precision, NDCG and clicks exactly as the challenge defines them.
Tech stack:
- Python 3.10, gensim (Word2Vec-style track embeddings)
- pandas, NumPy, scikit-learn (data pipeline, audio-feature similarity)
- Matplotlib (scenario and metric charts)
- Flask demo app (playlist builder, track explorer, evaluation views)
- Spotify Million Playlist Dataset subset (documented sampling; full 1M optional)
| Parameter | Value |
|---|---|
| Task | Automatic playlist continuation (RecSys Challenge 2018 framing) |
| Dataset | Spotify Million Playlist Dataset: 1,000,000 playlists, 2M+ unique tracks, ~300K artists |
| Dataset scope | Public US playlists, Jan 2010 - Nov 2017; student build trains on a documented subset |
| Signals | Track co-occurrence embeddings (0.5) + audio-feature similarity (0.3) + title matching (0.2) |
| Audio features | Danceability, energy, valence from track metadata |
| Evaluation | 10 challenge scenarios; R-precision, NDCG, recommended-songs clicks — computed by the notebook during your build |
| Design targets | Approximately R-precision 0.18, NDCG 0.35, clicks 1.9 (final numbers from your own run) |
| Recommendations | Up to 500 ranked tracks per playlist, as in the challenge |
| Input | Seed tracks + playlist title |
| Output | Ranked continuation tracks with scores and reason chips |
Project features
- [Playlist-continuation framing] The task is modeled exactly as RecSys Challenge 2018 defined it: extend a partial playlist with up to 500 ranked tracks, not generic "similar songs".
- [Track embeddings from co-occurrence] A Word2Vec-style objective over playlist-track pairs learns embeddings where tracks that share playlists sit close together.
- [Three-signal scoring blend] Continuation score = 0.5 x co-occurrence similarity + 0.3 x audio-feature similarity + 0.2 x playlist-title matching, with weights documented and tunable.
- [Audio-feature similarity] Danceability, energy and valence profiles let the model match vibe even for tracks that rarely co-occur.
- [Playlist-title matching] Title keywords (focus, workout, party) contribute a cold-start signal when few or no seed tracks exist.
- [Reason chips per track] Every continued track shows why it was chosen — co-occurrence counts, shared vibe, title fit — in the demo UI.
- [Challenge-faithful evaluation] The 10 RecSys scenarios (title-only, first track, first 5, 5 random, first 10/25/100, last 5, title+1, title+5) with R-precision, NDCG and clicks, all computed by the notebook.
What is included
- Complete source code (MPD parsing, embedding training, three-signal scorer, evaluation, Flask demo)
- Jupyter notebook (buyer-run procedure: sample subset, train embeddings, evaluate all 10 scenarios)
- Evaluation outputs: per-scenario R-precision, NDCG and clicks tables from your build
- Project report PDF (background, challenge history, methodology, evaluation, dataset caveats)
- PPT presentation for final review
- Viva Q&A preparation document (playlist continuation, embeddings, the three metrics, MPD limitations)
- Setup guide (environment, dataset access via the challenge resources page, subset sampling, running the demo)
Limitations & prerequisites
- The MPD is sampled with randomization, manual filtering and fictitious tracks added — it is not representative of real Spotify listening, and the report states this plainly.
- Title-only cold start is weak: a brand-new empty playlist has zero track signal and title NLP alone carries the recommendation.
- The corpus covers US playlists from 2010-2017; newer artists, genres and regional tastes are missing.
- The full 1M-playlist corpus is heavy — the student build trains on a documented subset, and full-corpus training is listed as future scope.
- Reported metrics are offline challenge metrics; they do not measure whether real users would actually keep the continued tracks.
Frequently Asked Questions
Which dataset is used?
The Spotify Million Playlist Dataset from the RecSys Challenge 2018: 1,000,000 user-created playlists with 2M+ unique tracks by ~300K artists, including playlist titles, track lists and metadata. The student build trains on a documented, fixed-seed subset; the pipeline supports the full corpus.
What exactly is "playlist continuation"?
Given a partial playlist (a title, a few tracks, or both), recommend up to 500 tracks that fit it — the exact task Spotify set in 2018, evaluated across 10 scenarios of varying difficulty.
Are the metric numbers guaranteed?
No. Design targets are approximately R-precision 0.18, NDCG 0.35 and 1.9 clicks (in the range of published challenge baselines); the notebook computes all three metrics on your subset build across the 10 scenarios, and the report presents your measured numbers.
How do I get the dataset?
The MPD is available to registered participants from the challenge's resources page (re-released as an open challenge on AIcrowd in 2020); the setup guide walks through registration, download and the subset-sampling step.
Why three signals instead of just collaborative filtering?
Co-occurrence alone fails on title-only and few-track scenarios. Audio features match vibe without shared history, and title matching gives the cold-start case something to work with — the blend mirrors what won the challenge's creative track.
Can it recommend songs released after 2017?
Not from the MPD, which ends in November 2017. The report states this boundary; extending to newer tracks via audio-content embeddings is listed as future scope. Suitable for B.E./B.Tech final-year projects in Computer Science, AI/ML and Data Science.
Components & software requirements
- Python 3.10, gensim (Word2Vec-style track embeddings)
- pandas, NumPy, scikit-learn (data pipeline, audio-feature similarity)
- Matplotlib (scenario and metric charts)
- Flask demo app (playlist builder, track explorer, evaluation views)
- Spotify Million Playlist Dataset subset (documented sampling; full 1M optional)
Delivery information
Built-to-order project. Delivery timeline is shared after order confirmation based on current queue.
Support terms
Complete documentation, setup guide, and viva preparation included. Support for setup and explanation provided.