book-recommender-mf
Matrix-factorization book recommender trained on 3M Goodreads review ratings (52110 users, 369349 books, 32 latent factors). Predicts a 1-10 star rating a user would give any book and ranks unseen books to recommend.
Model details
- Artifact:
book-recommender-mf-v3 - Version:
v3-full-3m - Content hash:
sha256:2f2aa3038c443856e14e74ac13d6914b86178b0e78df0d8341e9988c5a53d716
Intended use
Ranking book recommendations for a known user: load the latent factors, score all books the user has not rated, take the top-N. Also usable to estimate a rating for a (user, book) pair. The ids are Goodreads book ids; resolve titles/descriptions separately (e.g. via a Goodreads metadata dump).
Evaluation
User-wise 20% holdout on the 3M-row training set: best val RMSE 0.8995 (at epoch 4 of 20). Hit@10 on 200 held-out users was 0.0 — the model did not place a >=4-star held-out rating in the top 10 of 369k unrated books; treat ranking quality as unverified at this scale. Runtime is a plain NumPy dot product; no framework needed.
Usage
python -m venv .venv && .venv/bin/pip install numpy; then: python scripts/recommend.py --bundle (ships in scripts/recommend.py). The bundle contains model.npz (user_factors, book_factors, user_bias, book_bias, global_mean), users.json, books.json, id2book.json, meta.json.
Limitations
Trained on a popularity-filtered subset (books/users with >=5 ratings) of 3 Goodreads shard slices; cold-start users/books are not represented. Rating-only signal: no title, author or genre features, so it cannot recommend by content. Full 32-shard Goodreads data (7.4GB, license 'other') is the source; check dataset terms before redistribution. val RMSE reflects rating prediction, not recommendation quality.
Provenance
Published by Mill from an immutable artifact. The content hash above identifies the exact approved model payload.