← Back to projects

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.
E-Commerce Product Recommendation System

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.

  1. Step 1

    Data

    Olist orders, users, and catalog features for offline training.

  2. Step 2

    Candidates

    Collaborative and popularity generators (content models local-only).

  3. Step 3

    Rank

    Hybrid-lite blend with offline Precision@10, Recall@10, NDCG@10 versus popularity.

  4. 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.

ModelScoreNote
PopularityNDCG 0.0199Best
Hybrid-liteNDCG 0.0064
CollaborativeNDCG 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

Recommendation SystemsCollaborative FilteringPopularity BaselineLeave-one-out EvalMachine LearningPythonFastAPINext.js

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.