Case study
E-Commerce Product Recommendation System
Olist product ranking with an honest leave-one-out benchmark versus popularity.
At a glance
Plain summary for recruiters and visitors. Technical detail follows below.
- What it is
- I built a product recommender on Brazilian e-commerce orders and measured whether collaborative filtering beats a simple popularity list. On this sparse sample popularity wins.
- What I owned
- Solo end to end. Olist preprocessing, collaborative and hybrid models, leave-one-out evaluation, and the shopper gallery demo.
- Why it matters
- Teams see when a simple baseline is enough before investing in heavy personalization. That saves engineering time on sparse catalogs.
- Try it on this page vs full project
- The gallery shows sample shopper picks from a Cloudflare demo. The full FastAPI and Next.js serving stack stays on request.

Problem
E-commerce catalogs need personalized ranking that beats a simple popularity list when collaborative signals are sparse.
Method
Trained collaborative filtering on Olist, blended with popularity (hybrid-lite), and evaluated leave-one-out Precision@10 / Recall@10 / NDCG@10 on a fixed user sample.
Result
On the published leave-one-out table, popularity NDCG@10 is about 0.020 and leads hybrid-lite at about 0.006 on this sparse holdout. Collaborative filtering alone did not beat popularity here. The gallery shows sample shoppers. Full models stay on request.
Architecture
How the system is shaped. Full implementation stays private.
Step 1
Data
Olist orders, users, and catalog features for offline training.
Step 2
Candidates
Collaborative and popularity generators (content models local-only).
Step 3
Rank
Hybrid-lite blend with offline Precision@10, Recall@10, NDCG@10 versus popularity.
Step 4
Serve
Portfolio Cloudflare shopper gallery. Full FastAPI + Next.js stack on request.
Leave-one-out @K=10
1,500 users, seed 42, last interaction held out. Hybrid-lite blends collaborative ranks with popularity. Full content models stay local. Popularity wins this sparse holdout.
| Model | Score | Note |
|---|---|---|
| Popularity | NDCG 0.0199 | Best |
| Hybrid-lite | NDCG 0.0064 | |
| Collaborative | NDCG 0.0000 |
Algorithm
Hybrid collaborative + popularity ranking
Combine CF scores with popularity ranks, then evaluate leave-one-out at cutoff K.
collab = cf_scores(user)
pop = popularity_ranks()
scores = 0.6 * collab + 0.4 * pop
return top_k(scores, k=10)
evaluate_loo(precision, recall, ndcg)Key logic
Compact illustrative snippet (Hybrid score blend (illustrative)). Not the full codebase.
def hybrid_scores(collab: dict, pop: dict, alpha: float = 0.6):
keys = set(collab) | set(pop)
return {i: alpha * collab.get(i, 0) + (1 - alpha) * pop.get(i, 0) for i in keys}Stack
Try a shopper gallery
Free Cloudflare demo with offline leave-one-out metrics and curated sample shoppers. Does not load multi-GB recommenders in the browser.
Source code
Full source is available to hiring managers on request. The public page shows architecture, algorithms, and compact proofs only.