Skip to content

grouprec

Group recommender systems for Python. Deep-learning models and classic, fairness-oriented aggregators behind one API — with license-aware datasets, coupled/decoupled evaluation, and an interactive inspector that shows every recommendation being made.

Open the inspector ↗ Quickstart GitHub

See a group recommendation being made

The inspector is the fastest way to understand what the library does: pick a group, move each member's influence slider, and watch the ranking change. Every number is a real grouprec call — aggregators through GroupRecommender, the deep model through GroupIM.group_scores — computed offline and baked into one page. It runs on the 20-core of MovieLens ml-latest: 204,257 users, 23,290 items, 32.2M ratings.

Open the full inspector ↗ How it's built

Why grouprec

  • One API, two paradigms

    Swap a fairness aggregator (GFAR, EP-FuzzDA, RLProp/LTP) for a deep model (GroupIM, ConsRec, AGREE, …) without touching the rest of your pipeline.

  • Evaluation across the rift

    Score the same recommender under coupled vs decoupled protocols, with per-member fairness lenses (min / minmax / Jain) — the comparison the two group-rec communities rarely make.

  • Reproducible by default

    gr.Experiment records the run's config, git revision, environment, and seeds; rankings are deterministic, and every method ships its BibTeX via gr.cite(...).

  • Bring your own base recommender

    Adapters for LensKit / implicit / RecBole, license-aware dataset loaders, and hooks to register custom metrics.

Quickstart

pip install grouprec                 # light numpy/scipy core
pip install grouprec[torch]          # deep group models + the inspector generator
pip install grouprec[full]           # everything
import grouprec as gr
from grouprec import GroupRecommender, evaluate
from grouprec.backends import EASE

data   = gr.make_blobs_dataset(seed=0)
groups = gr.groups.synthetic(data, kind="similar", size=4, n=100)
folds  = gr.split.crossval(data, k=5, seed=0)
rec    = GroupRecommender(EASE(), gr.aggregators.get("GFAR"), normalize="minmax")

report = evaluate(rec, data, groups, folds, protocol=["coupled", "decoupled"],
                  metrics=["ndcg@10"], group_aggregations=["mean", "min", "minmax"])
print(report.pivot())

Regenerate the inspector yourself (needs the [torch] extra):

grouprec-build-inspector --dataset ml-latest --kcore 20 --out group_rec_inspector.html

Backed by research

A demo-track paper describing this toolkit is under review at RecSys 2026:

Patrik Dokoupil, Ludovico Boratto, and Ladislav Peska. GroupRec: A Unified Toolkit for Reproducible and Inspectable Group Recommendation Research.

See the demo-paper landing page for the reviewer-facing tour.

Explore the docs