Getting Started#
This notebook gets you started with a brief nDCG evaluation with LensKit for Python.
This notebook is also available on Google Collaboratory and nbviewer.
Setup#
We first import the LensKit components we need:
from lenskit.als import BiasedMFScorer
from lenskit.batch import recommend
from lenskit.data import ItemListCollection, UserIDKey, load_movielens
from lenskit.knn import ItemKNNScorer
from lenskit.metrics import NDCG, RBP, RecipRank, RunAnalysis
from lenskit.pipeline import topn_pipeline
from lenskit.splitting import SampleFrac, crossfold_users
And Pandas is very useful, as is Seaborn for plotting:
import matplotlib.pyplot as plt
import seaborn as sns
The pyprojroot
package makes it easy to find input data:
from pyprojroot.here import here
Loading Data#
We’re going to use the ML-100K data set:
ml100k = load_movielens(here("data/ml-100k.zip"))
ml100k.interaction_log("pandas", original_ids=True).head()
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
0 | 1 | 1 | 5.0 | 874965758 |
1 | 1 | 2 | 3.0 | 876893171 |
2 | 1 | 3 | 4.0 | 878542960 |
3 | 1 | 4 | 3.0 | 876893119 |
4 | 1 | 5 | 3.0 | 889751712 |
Defining Recommenders#
Let’s set up two scoring models:
model_ii = ItemKNNScorer(20)
model_als = BiasedMFScorer(50)
For each of these, we also need to make a :ref:pipeline <pipeline>
:
pipe_ii = topn_pipeline(model_ii)
pipe_als = topn_pipeline(model_als)
Running the Evaluation#
In LensKit, our evaluation proceeds in 2 steps:
Generate recommendations
Measure them
If memory is a concern, we can measure while generating, but we will not do that for now.
Let’s start by creating and collecting the recommendations; we will generate 100 recommendations per user, and will collect all of them into a single ItemListCollection
:
# test data is organized by user
all_test = ItemListCollection(UserIDKey)
# recommendations will be organized by model and user ID
all_recs = ItemListCollection(["model", "user_id"])
for split in crossfold_users(ml100k, 5, SampleFrac(0.2)):
# collect the test data
all_test.add_from(split.test)
# train the pipeline, cloning first so a fresh pipeline for each split
fit_als = pipe_als.clone()
fit_als.train(split.train)
# generate recs
als_recs = recommend(fit_als, split.test.keys(), 100)
all_recs.add_from(als_recs, model="ALS")
# do the same for item-item
fit_ii = pipe_ii.clone()
fit_ii.train(split.train)
ii_recs = recommend(fit_ii, split.test.keys(), 100)
all_recs.add_from(ii_recs, model="II")
/Users/michael/Documents/LensKit/lkpy/lenskit/lenskit/als/_explicit.py:91: UserWarning: Sparse CSR tensor support is in beta state. If you miss a functionality in the sparse tensor support, please submit a feature request to https://github.com/pytorch/pytorch/issues. (Triggered internally at /Users/runner/miniforge3/conda-bld/libtorch_1732815742335/work/aten/src/ATen/SparseCsrTensorImpl.cpp:55.)
rmat = rmat.to_sparse_csr()
epoch 1 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 1 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 10%|███████████▌ | 1/10 [00:00<00:01, 7.65it/s]
epoch 2 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 2 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 3 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 3 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 30%|██████████████████████████████████▌ | 3/10 [00:00<00:00, 13.93it/s]
epoch 4 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 4 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 5 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 5 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 6 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 6 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 60%|█████████████████████████████████████████████████████████████████████ | 6/10 [00:00<00:00, 17.22it/s]
epoch 7 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 7 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 8 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 8 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 9 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 9 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 9/10 [00:00<00:00, 18.70it/s]
epoch 10 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 10 items: 0%| | 0/1682 [00:00<?, ?it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:07<24:36, 7.85s/it]
items: 0%| | 0/1682 [00:00<?, ?it/s]
items: 39%|████████████████████████████████████████████▋ | 648/1682 [00:00<00:00, 6479.30it/s]
items: 39%|████████████████████████████████████████████▉ | 652/1682 [00:00<00:00, 6466.72it/s]
items: 39%|█████████████████████████████████████████████ | 654/1682 [00:00<00:00, 6466.72it/s]
items: 39%|█████████████████████████████████████████████▍ | 659/1682 [00:00<00:00, 6466.72it/s]
items: 78%|██████████████████████████████████████████████████████████████████████████████████████████▏ | 1320/1682 [00:00<00:00, 6510.64it/s]
items: 79%|██████████████████████████████████████████████████████████████████████████████████████████▌ | 1325/1682 [00:00<00:00, 6571.18it/s]
items: 79%|██████████████████████████████████████████████████████████████████████████████████████████▌ | 1325/1682 [00:00<00:00, 6571.18it/s]
items: 79%|██████████████████████████████████████████████████████████████████████████████████████████▋ | 1327/1682 [00:00<00:00, 6571.18it/s]
items: 79%|██████████████████████████████████████████████████████████████████████████████████████████▊ | 1328/1682 [00:00<00:00, 6571.18it/s]
items: 79%|███████████████████████████████████████████████████████████████████████████████████████████ | 1332/1682 [00:00<00:00, 6571.18it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:03<10:39, 3.40s/it]
Recommending: 13%|██████████████▉ | 25/189 [00:03<00:16, 9.95it/s]
Recommending: 21%|███████████████████████▉ | 40/189 [00:03<00:08, 17.08it/s]
Recommending: 28%|███████████████████████████████▋ | 53/189 [00:03<00:05, 23.61it/s]
Recommending: 37%|█████████████████████████████████████████▎ | 69/189 [00:03<00:03, 35.34it/s]
Recommending: 51%|█████████████████████████████████████████████████████████▉ | 97/189 [00:04<00:01, 60.98it/s]
Recommending: 62%|█████████████████████████████████████████████████████████████████████▉ | 118/189 [00:04<00:00, 80.23it/s]
Recommending: 75%|██████████████████████████████████████████████████████████████████████████████████▊ | 141/189 [00:04<00:00, 100.46it/s]
Recommending: 92%|██████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 174/189 [00:04<00:00, 137.07it/s]
Training ALS: 0%| | 0/10 [00:00<?, ?it/s]
epoch 1 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 1 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 2 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 2 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 3 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 3 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 30%|██████████████████████████████████▌ | 3/10 [00:00<00:00, 20.82it/s]
epoch 4 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 4 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 5 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 5 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 6 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 6 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 60%|█████████████████████████████████████████████████████████████████████ | 6/10 [00:00<00:00, 20.86it/s]
epoch 7 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 7 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 8 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 8 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 9 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 9 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 9/10 [00:00<00:00, 20.64it/s]
epoch 10 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 10 items: 0%| | 0/1682 [00:00<?, ?it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:03<10:32, 3.37s/it]
items: 0%| | 0/1682 [00:00<?, ?it/s]
items: 38%|████████████████████████████████████████████▌ | 646/1682 [00:00<00:00, 6455.30it/s]
items: 39%|████████████████████████████████████████████▊ | 649/1682 [00:00<00:00, 6440.73it/s]
items: 39%|████████████████████████████████████████████▉ | 651/1682 [00:00<00:00, 6440.73it/s]
items: 80%|████████████████████████████████████████████████████████████████████████████████████████████▍ | 1352/1682 [00:00<00:00, 6649.20it/s]
items: 81%|████████████████████████████████████████████████████████████████████████████████████████████▋ | 1356/1682 [00:00<00:00, 6816.17it/s]
items: 81%|████████████████████████████████████████████████████████████████████████████████████████████▉ | 1359/1682 [00:00<00:00, 6816.17it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:03<10:44, 3.43s/it]
Recommending: 14%|███████████████▌ | 26/189 [00:03<00:15, 10.24it/s]
Recommending: 24%|██████████████████████████▉ | 45/189 [00:03<00:07, 19.64it/s]
Recommending: 32%|████████████████████████████████████▍ | 61/189 [00:03<00:04, 29.52it/s]
Recommending: 40%|█████████████████████████████████████████████▍ | 76/189 [00:03<00:02, 39.93it/s]
Recommending: 48%|██████████████████████████████████████████████████████▍ | 91/189 [00:04<00:01, 51.27it/s]
Recommending: 57%|████████████████████████████████████████████████████████████████ | 108/189 [00:04<00:01, 67.04it/s]
Recommending: 68%|███████████████████████████████████████████████████████████████████████████▊ | 128/189 [00:04<00:00, 87.01it/s]
Recommending: 84%|█████████████████████████████████████████████████████████████████████████████████████████████▍ | 159/189 [00:04<00:00, 123.54it/s]
Recommending: 94%|████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 178/189 [00:04<00:00, 129.85it/s]
Training ALS: 0%| | 0/10 [00:00<?, ?it/s]
epoch 1 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 1 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 2 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 2 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 20%|███████████████████████ | 2/10 [00:00<00:00, 19.78it/s]
epoch 3 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 3 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 4 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 4 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 5 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 5 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 50%|█████████████████████████████████████████████████████████▌ | 5/10 [00:00<00:00, 20.56it/s]
epoch 6 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 6 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 7 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 7 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 8 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 8 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 80%|████████████████████████████████████████████████████████████████████████████████████████████ | 8/10 [00:00<00:00, 20.69it/s]
epoch 9 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 9 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 10 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 10 items: 0%| | 0/1682 [00:00<?, ?it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:03<10:29, 3.35s/it]
items: 0%| | 0/1682 [00:00<?, ?it/s]
items: 40%|██████████████████████████████████████████████▏ | 669/1682 [00:00<00:00, 6677.25it/s]
items: 40%|██████████████████████████████████████████████▍ | 674/1682 [00:00<00:00, 6658.85it/s]
items: 40%|██████████████████████████████████████████████▌ | 676/1682 [00:00<00:00, 6658.85it/s]
items: 40%|██████████████████████████████████████████████▉ | 680/1682 [00:00<00:00, 6658.85it/s]
items: 41%|███████████████████████████████████████████████ | 683/1682 [00:00<00:00, 6658.85it/s]
items: 41%|███████████████████████████████████████████████▏ | 685/1682 [00:00<00:00, 6658.85it/s]
items: 81%|█████████████████████████████████████████████████████████████████████████████████████████████ | 1361/1682 [00:00<00:00, 6677.71it/s]
items: 81%|█████████████████████████████████████████████████████████████████████████████████████████████▍ | 1366/1682 [00:00<00:00, 6705.74it/s]
items: 81%|█████████████████████████████████████████████████████████████████████████████████████████████▍ | 1367/1682 [00:00<00:00, 6705.74it/s]
items: 81%|█████████████████████████████████████████████████████████████████████████████████████████████▍ | 1367/1682 [00:00<00:00, 6705.74it/s]
items: 81%|█████████████████████████████████████████████████████████████████████████████████████████████▌ | 1369/1682 [00:00<00:00, 6705.74it/s]
Recommending: 0%| | 0/189 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/189 [00:03<10:34, 3.37s/it]
Recommending: 13%|██████████████▉ | 25/189 [00:03<00:16, 10.03it/s]
Recommending: 24%|███████████████████████████▌ | 46/189 [00:03<00:06, 20.85it/s]
Recommending: 34%|██████████████████████████████████████▊ | 65/189 [00:03<00:03, 32.96it/s]
Recommending: 43%|█████████████████████████████████████████████████ | 82/189 [00:03<00:02, 45.57it/s]
Recommending: 53%|███████████████████████████████████████████████████████████▎ | 100/189 [00:03<00:01, 60.65it/s]
Recommending: 62%|█████████████████████████████████████████████████████████████████████▉ | 118/189 [00:04<00:00, 75.93it/s]
Recommending: 78%|██████████████████████████████████████████████████████████████████████████████████████▉ | 148/189 [00:04<00:00, 108.27it/s]
Recommending: 92%|█████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 173/189 [00:04<00:00, 127.76it/s]
Training ALS: 0%| | 0/10 [00:00<?, ?it/s]
epoch 1 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 1 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 2 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 2 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 3 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 3 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 30%|██████████████████████████████████▌ | 3/10 [00:00<00:00, 20.52it/s]
epoch 4 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 4 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 5 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 5 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 6 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 6 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 60%|█████████████████████████████████████████████████████████████████████ | 6/10 [00:00<00:00, 20.65it/s]
epoch 7 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 7 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 8 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 8 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 9 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 9 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 9/10 [00:00<00:00, 20.62it/s]
epoch 10 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 10 items: 0%| | 0/1682 [00:00<?, ?it/s]
Recommending: 0%| | 0/188 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/188 [00:03<10:24, 3.34s/it]
items: 0%| | 0/1682 [00:00<?, ?it/s]
items: 41%|███████████████████████████████████████████████ | 682/1682 [00:00<00:00, 6818.79it/s]
items: 41%|███████████████████████████████████████████████▍ | 688/1682 [00:00<00:00, 6795.39it/s]
items: 41%|███████████████████████████████████████████████▌ | 689/1682 [00:00<00:00, 6795.39it/s]
items: 41%|███████████████████████████████████████████████▌ | 690/1682 [00:00<00:00, 6795.39it/s]
items: 41%|███████████████████████████████████████████████▋ | 691/1682 [00:00<00:00, 6795.39it/s]
items: 41%|███████████████████████████████████████████████▊ | 694/1682 [00:00<00:00, 6795.39it/s]
items: 41%|████████████████████████████████████████████████ | 696/1682 [00:00<00:00, 6795.39it/s]
items: 82%|██████████████████████████████████████████████████████████████████████████████████████████████▏ | 1377/1682 [00:00<00:00, 6755.14it/s]
items: 82%|██████████████████████████████████████████████████████████████████████████████████████████████▍ | 1382/1682 [00:00<00:00, 6690.06it/s]
items: 82%|██████████████████████████████████████████████████████████████████████████████████████████████▋ | 1384/1682 [00:00<00:00, 6690.06it/s]
items: 82%|██████████████████████████████████████████████████████████████████████████████████████████████▋ | 1384/1682 [00:00<00:00, 6690.06it/s]
items: 82%|██████████████████████████████████████████████████████████████████████████████████████████████▊ | 1387/1682 [00:00<00:00, 6690.06it/s]
Recommending: 0%| | 0/188 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/188 [00:03<10:26, 3.35s/it]
Recommending: 16%|██████████████████▋ | 31/188 [00:03<00:12, 12.44it/s]
Recommending: 24%|███████████████████████████▋ | 46/188 [00:03<00:07, 19.91it/s]
Recommending: 32%|████████████████████████████████████▋ | 61/188 [00:03<00:04, 28.67it/s]
Recommending: 44%|█████████████████████████████████████████████████▎ | 82/188 [00:03<00:02, 43.34it/s]
Recommending: 56%|██████████████████████████████████████████████████████████████▌ | 105/188 [00:03<00:01, 63.17it/s]
Recommending: 64%|████████████████████████████████████████████████████████████████████████ | 121/188 [00:04<00:00, 74.62it/s]
Recommending: 78%|██████████████████████████████████████████████████████████████████████████████████████▏ | 146/188 [00:04<00:00, 101.33it/s]
Recommending: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 172/188 [00:04<00:00, 129.84it/s]
Training ALS: 0%| | 0/10 [00:00<?, ?it/s]
epoch 1 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 1 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 2 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 2 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 3 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 3 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 30%|██████████████████████████████████▌ | 3/10 [00:00<00:00, 20.58it/s]
epoch 4 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 4 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 5 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 5 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 6 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 6 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 60%|█████████████████████████████████████████████████████████████████████ | 6/10 [00:00<00:00, 20.77it/s]
epoch 7 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 7 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 8 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 8 items: 0%| | 0/1682 [00:00<?, ?it/s]
epoch 9 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 9 items: 0%| | 0/1682 [00:00<?, ?it/s]
Training ALS: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 9/10 [00:00<00:00, 20.49it/s]
epoch 10 users: 0%| | 0/943 [00:00<?, ?it/s]
epoch 10 items: 0%| | 0/1682 [00:00<?, ?it/s]
Recommending: 0%| | 0/188 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/188 [00:03<10:24, 3.34s/it]
items: 0%| | 0/1682 [00:00<?, ?it/s]
items: 39%|█████████████████████████████████████████████▌ | 661/1682 [00:00<00:00, 6591.54it/s]
items: 40%|█████████████████████████████████████████████▉ | 666/1682 [00:00<00:00, 6588.82it/s]
items: 40%|██████████████████████████████████████████████▏ | 669/1682 [00:00<00:00, 6588.82it/s]
items: 40%|██████████████████████████████████████████████▏ | 669/1682 [00:00<00:00, 6588.82it/s]
items: 84%|████████████████████████████████████████████████████████████████████████████████████████████████ | 1405/1682 [00:00<00:00, 6843.10it/s]
Recommending: 0%| | 0/188 [00:00<?, ?it/s]
Recommending: 1%|▌ | 1/188 [00:03<10:56, 3.51s/it]
Recommending: 11%|████████████ | 20/188 [00:03<00:21, 7.69it/s]
Recommending: 20%|██████████████████████▏ | 37/188 [00:03<00:09, 16.16it/s]
Recommending: 27%|██████████████████████████████▋ | 51/188 [00:03<00:05, 24.43it/s]
Recommending: 41%|██████████████████████████████████████████████▎ | 77/188 [00:03<00:02, 44.86it/s]
Recommending: 52%|██████████████████████████████████████████████████████████▎ | 97/188 [00:04<00:01, 60.09it/s]
Recommending: 60%|███████████████████████████████████████████████████████████████████▎ | 113/188 [00:04<00:01, 72.82it/s]
Recommending: 72%|████████████████████████████████████████████████████████████████████████████████▍ | 135/188 [00:04<00:00, 94.10it/s]
Recommending: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████▊ | 169/188 [00:04<00:00, 133.14it/s]
Measuring Recommendations#
We analyze our recommendation lists with a RunAnalysis
and some metrics.
ran = RunAnalysis()
ran.add_metric(NDCG())
ran.add_metric(RBP())
ran.add_metric(RecipRank())
results = ran.compute(all_recs, all_test)
lists: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 1874/1886 [00:00<00:00, 8649.59it/s]
Now we have nDCG values, along with some other metrics! We can start computing and plotting.
results.list_metrics().groupby("model").mean()
NDCG | RBP | RecipRank | |
---|---|---|---|
model | |||
ALS | 0.080082 | 0.021305 | 0.082607 |
II | 0.059951 | 0.005444 | 0.039962 |
sns.catplot(results.list_metrics().reset_index(), x="model", y="NDCG", kind="bar")
plt.show()