Personalized Playlists and the Cold Start
· 3 min read
Personalized Playlists and the Cold Start
This one started as a full stack exercise: React on the front, Django on the back, users create playlists, share them, follow each other. Standard CRUD with a social layer. The recommendation piece was meant to be a small bonus feature at the end.
It became the entire project.
Collaborative filtering, and why it stalls
The textbook approach is collaborative filtering: find users whose taste overlaps with yours, recommend what they liked that you have not heard. It works well, and I got a reasonable version running over a user and track matrix without much trouble.
It also fails completely for exactly the users you most need to impress. A new account has no listening history, so there is no overlap to compute, so there are no neighbours, so there are no recommendations. The system is at its worst on a user's first session, which is the session that decides whether they come back.
The same gap exists on the item side. A track nobody has added to a playlist yet cannot be recommended by collaborative filtering, because collaborative filtering only knows about things through the people who interacted with them. New music is invisible until it is already popular.
The two fixes
For new users, I stopped trying to be clever and asked. A short onboarding step, pick a handful of artists you like, gives enough signal to seed a taste profile. It is not a great profile, but it is enormously better than nothing, and users do not mind answering when the reason is obvious.
For new tracks, the fix was to stop relying only on interaction data. Content features, genre, tempo, audio characteristics, let a track be placed in the same space as tracks it resembles, so it can be recommended on its own merits before anyone has touched it. Blending the content signal with the collaborative signal, weighted toward content when interaction data is thin and toward collaboration as it accumulates, gave a system that degrades gracefully instead of falling off a cliff.
What surprised me
The thing I did not expect was how much explanation mattered. An unexplained recommendation is a suggestion from nowhere and users bounce off it. The same recommendation labelled "because you added three tracks by this artist" gets engaged with. Nothing about the model changed. Only the label did.
The other surprise was that the hybrid was easier to reason about than the pure collaborative version. When something looked wrong, I could ask which half produced it, and usually the answer was obvious.
What I took from it
Recommendation demos are evaluated on users with rich histories, because that is where the technique looks good. Real systems are judged on the first five minutes, when you know nothing about the person. Designing for the empty case first would have saved me most of the rework.