Mab2Rec: Multi-Armed Bandits Recommender

Mab2Rec is a Python library for building bandit-based recommendation algorithms. It supports context-free, parametric and non-parametric contextual bandit models powered by MABWiser and fairness and recommenders evaluations powered by Jurity. It supports all bandit policies available in MABWiser. The library is designed with rapid experimentation in mind, follows the PEP-8 standards and is tested heavily.

Mab2Rec and several of the open-source software it is built on is developed by the Artificial Intelligence Center at Fidelity Investments, including:

An introduction to content- and context-aware recommender systems and an overview of the building blocks of the library is presented at All Things Open 2021.

Quick Start

Individual Recommender

# Example of how to train an individual recommender to generate top-4 recommendations

# Import
from mab2rec import BanditRecommender, LearningPolicy
from mab2rec.pipeline import train, score

# LinGreedy recommender to select top-4 items with 10% random exploration
rec = BanditRecommender(LearningPolicy.LinGreedy(epsilon=0.1), top_k=4)

# Train on (user, item, response) interactions in train data using user features
train(rec, data='data/data_train.csv',
      user_features='data/features_user.csv')

# Score recommendations for users in test data. The output df holds
# user_id, item_id, score columns for every test user for top-k items
df = score(rec, data='data/data_test.csv',
           user_features='data/features_user.csv')

Multiple Recommenders

# Example of how to benchmark multiple bandit algorithms to generate top-4 recommendations

from mab2rec import BanditRecommender, LearningPolicy
from mab2rec.pipeline import benchmark
from jurity.recommenders import BinaryRecoMetrics, RankingRecoMetrics

# Recommenders (many more available)
recommenders = {"Random": BanditRecommender(LearningPolicy.Random()),
                "Popularity": BanditRecommender(LearningPolicy.Popularity()),
                "LinGreedy": BanditRecommender(LearningPolicy.LinGreedy(epsilon=0.1))}

# Column names for the response, user, and item id columns
metric_params = {'click_column': 'score', 'user_id_column': 'user_id', 'item_id_column':'item_id'}

# Performance metrics for benchmarking (many more available)
metrics = []
for top_k in [3, 5, 10]:
    metrics.append(BinaryRecoMetrics.CTR(**metric_params, k=top_k))
    metrics.append(RankingRecoMetrics.NDCG(**metric_params, k=top_k))

# Benchmarking with a collection of recommenders and metrics
# This returns two dictionaries;
# reco_to_results: recommendations for each algorithm on cross-validation data
# reco_to_metrics: evaluation metrics for each algorithm
reco_to_results, reco_to_metrics = benchmark(recommenders,
                                             metrics=metrics,
                                             train_data="data/data_train.csv",
                                             cv=5,
                                             user_features="data/features_user.csv")

Source Code

The source code is hosted on GitHub.

Indices and tables