warm-transfer¶
Transfer and calibrate scores of a trained recommender onto cold-start items. Plug&play, model-agnostic, no retraining.
from warmtransfer.methods import LinMap
reco = LinMap(alpha=1.0).fit(inputs, seed=42).predict(user_ids, cold_item_ids)
-
Quickstart
Transfer donor scores onto cold items in five minutes.
-
Works with your scores
Bring any donor model's warm-item scores. warm-transfer does not retrain it.
-
It beats strong baselines
Score transfer beats personalized Grouped MP in 36 of 40 dataset-donor cells.
-
Methods & API
Seventeen methods, one
ColdStartMethod.fit(...).predict(...)contract.
What problem it solves¶
Your recommender already scores warm items, but new items have no interaction history. warm-transfer uses those warm scores plus item content to predict scores for cold-start items. The donor can be ALS, BPR, CatBoost, EASE, a two-tower model or a private production model.
Main result¶
On the current benchmark matrix of 8 dataset loaders × 5 donors (seed=42), score-transfer methods
beat the strong personalized grouped_most_popular_pers baseline by per-user AUC in 36 of 40
dataset-donor cells.
The important contrast: naive nearest-neighbor transfer often inherits neighbor popularity and loses
to Grouped MP. Calibrated transfer, especially linmap and stacking_plus, keeps personalization from
the donor scores and is much more robust. The benchmark spans matrix-factorization, GBDT, linear
item-item and neural donors; the 4 misses are mostly on ML-1M, where the baseline AUC is already high.
These numbers are single-seed (seed=42) results. A separate multi-seed run estimates the variance of the headline conclusion on 3 domains (ML-1M, Goodbooks, KION) × ALS × 5 seeds (see the seed-spread results); it confirms the headline is robust on those cells. It does not rerun the 4 marginal cells where transfer loses (ML-1M × bpr/catboost/two_tower, amazon-toys × bpr) — those are not in the multi-seed config and remain single-seed.
Architecture¶
warmtransferis the lightweight core: transfer methods, metrics and content similarity.warmtransfer.benchis the optional benchmark layer: dataset loaders, splitters, donor adapters and thewarmbenchrunner.
Quick verdict: which method fits my data?¶
Not sure which method to pick? Bring your interactions, item content and your model's scores —
recommend evaluates every feasible method on an honest pseudo-cold holdout and tells you the best
one (and whether transfer is worth it at all):
import warmtransfer as wt
result = wt.recommend(interactions, content, donor_scores)
print(result) # leaderboard + verdict
result.best_transfer # best non-baseline method, e.g. "linmap"
result.predict(users, new_item_ids) # winner, refit on all warm data
Or from the terminal:
warmbench try --interactions inter.parquet --content content.parquet --scores scores.parquet
The estimate uses a holdout of your warm items; the donor is not retrained, so treat it as a
mildly optimistic signal of whether transfer helps. A runnable example lives in
examples/recommend_quickstart.py.
Where to go next¶
- New to the project: start with the Quickstart.
- Not sure which method fits: let
recommend()score them on your own data (see Quick verdict above). - Bringing a trained model: read Plug in a donor.
- Choosing between methods: use the capability matrix.
- Checking scientific validity: read the evaluation protocol.