cinematch
- 3 Devlogs
- 21 Total hours
A movie recommendation engine (CineMatch) using collaborative filtering on MovieLens — with model comparison, cold-start handling, and a Streamlit web app.
A movie recommendation engine (CineMatch) using collaborative filtering on MovieLens — with model comparison, cold-start handling, and a Streamlit web app.
wrapped up cinematch today. spent way too long fighting the movie posters lol - added tmdb api to show poster art instead of plain tables, worked instantly on my main machine but the vm kept throwing ssl cert errors and then random connection resets (10054). turned out the vm’s python couldnt verify https certs so fixed that with certifi, and then some antivirus/firewall thing was resetting python’s tls connections while curl worked fine, so i made it fall back to curl when urllib fails. finally got posters loading. also cleaned up so it gracefully shows placeholder cards if theres no api key. then deployed the whole thing to streamlit community cloud (free) so theres an actual live demo link now, added the tmdb key as a secret so its not exposed. so cinematch is officially done - 5 recommendation models compared, cited “because you liked x,y,z” explanations, cold start handling, similar movies, model comparison dashboard, poster art, tests passing, readme + report written, and deployed live. pretty happy with how it turned out.
back on cinematch today, mostly turning the models into something you can actually use. wrapped everything behind a facade class so theres one clean api (get_recommendations, get_similar_movies, cold start fold-in, explanations) instead of poking at each model directly. then built a cli with subcommands - recommend, similar, search, newuser, compare etc - which made testing way faster. after that did the streamlit app, four tabs: personalized recs with the “because you liked x,y,z” reasons, a similar-movies search, a new-user cold start page, and a model comparison page with the rmse/precision charts. kinda satisfying seeing the numbers from the terminal turn into an actual clickable ui. small stuff slowed me down (forgot to activate the venv once, a typo’d argparse arg) but nothing major. everything pushed to github. next up is tests + cleaning the readme, then trying to deploy the streamlit app.
spent basically the whole day on cinematch, my movie recommender built on the movielens data. got the data pipeline done first (cleaning, filtering out users/movies with under 5 ratings, per-user 80/20 split) then built 5 models to actually compare instead of just picking one - popularity baseline, user-based CF, item-based CF, SVD with the surprise library, and a hybrid mixing collaborative + content. most annoying part was my neighborhood models kept recommending random obscure movies that one person happened to rate 5 stars, precision was like 0.01. added some shrinkage so thinly-backed picks get pushed down and it jumped to ~0.13. also kind of learned the hard way that best RMSE doesnt mean best recommendations - SVD won on RMSE but the hybrid actually ranks better. threw in cold-start handling, a similar-movies feature and “because you liked x, y, z” explanations, then wrapped it all in a streamlit app. also fixed a dumb 248mb cache bug (dense matrices that shouldve been sparse, now ~34mb). 11 tests passing. pretty happy with it, gonna clean up the readme and try deploying tomorrow.