Rate at least 5 movies you've seen. The model solves for your taste profile on the fly and ranks over 12,000 movies for you.
Import ratings from Letterboxd
In Letterboxd, export your data from settings, then choose the ratings.csv file from the zip.
It is read in your browser and never uploaded. Your half-star ratings map to 1 to 5 stars.
Methods
Where this started
This app builds on my senior capstone, DSCI 4093 (presentation slides), which benchmarked eight recommender algorithms on the MovieLens 32M dataset: user- and item-based collaborative filtering, popularity, random, LIBMF, SVD, SVDF and ALS. They were compared on sparse, moderate and dense samples of users. The main result was that only the matrix factorization models SVDF (Funk SVD) and PMF consistently beat the popularity baseline at every data size. Collaborative filtering needed dense rating data to compete at all.
Re-running the comparison on fresh data
For this app I pulled the latest MovieLens release: 33.8 million ratings. I kept movies with 20 or more ratings and users with 20 or more ratings, which left 204,263 users and 23,426 movies. A random 20% of each user's ratings was held out for testing. I reimplemented the models in Python and compared them on two different questions.
- How well does it predict the star rating you'd give one movie? This is measured with RMSE, the error in stars, where lower is better. It's the question my capstone asked.
- How good is the top-10 list it recommends? This is measured with precision, recall and nDCG at 10, where higher is better. A test movie counts as a hit if you rated it 4 stars or more. nDCG also rewards placing hits near the top of the list.
| Model | RMSE ↓ | Precision@10 | Recall@10 | nDCG@10 |
|---|---|---|---|---|
| Popularity baseline | n/a | 0.122 | 0.100 | 0.157 |
| User + movie bias baseline | 0.856 | 0.001 | 0.001 | 0.002 |
| SVDF (Funk SVD) | 0.767 | 0.043 | 0.031 | 0.055 |
| PMF | 0.797 | 0.037 | 0.028 | 0.045 |
| Implicit ALS (default settings) | n/a | 0.227 | 0.225 | 0.302 |
| Implicit ALS (tuned) | n/a | 0.271 | 0.255 | 0.363 |
| EASE (used on this site) | n/a | 0.306 | 0.276 | 0.408 |
| BPR | n/a | 0.172 | 0.160 | 0.221 |
What the numbers say
SVDF is still the best at predicting a single rating. With an RMSE of 0.767 it beats PMF and the bias baseline, which matches my capstone's finding on the new data.
Implicit-feedback models are far better at building a ranked list. Even untuned Implicit ALS scores an nDCG@10 of 0.302, more than 5 times SVDF's and nearly double the popularity baseline. SVDF learns to predict the ratings people chose to give, but most movies are never rated at all. When SVDF ranks the whole catalog, it rewards obscure movies that a handful of fans rated highly. Implicit ALS (Hu, Koren & Volinsky, 2008) models whether someone watched and rated a movie at all. It treats every unrated movie as weak negative evidence, which is exactly what a "what should I watch next" list needs.
Tuning made ALS 20% better. The tuned version ignores ratings below 3 stars, trusts 5-star ratings more than 3-star ones, and slightly down-weights blockbusters. I picked these settings on a separate validation split, so the test scores above stay honest.
EASE scored highest of all, so this site uses it. EASE (Steck, 2019) skips taste vectors. It learns one weight for every pair of movies: how much liking movie A predicts liking movie B. Those weights have an exact formula, so training is a single matrix inversion. The full table is 576 MB, too big for free hosting, so the site keeps only each movie's 200 strongest weights. That cuts it to 19 MB while still scoring 0.393, well ahead of tuned ALS.
SVDF remains the right tool when the goal is to predict how many stars someone would give a movie.
How your recommendations are made
The model was trained offline on all 32 million filtered ratings. When you rate movies, every movie you gave 3.5 stars or more "votes" for the movies it predicts, using its learned weights. The votes are added up, movies you've already rated are skipped, and the highest totals are shown. It takes well under a millisecond. The site shows the 12,087 movies that have at least 100 ratings and a poster on TMDB.
Full code, evaluation scripts and results: github.com/KennedyJohnson/movie-recommender