Skip to main content

A Comparative Framework for Multimodal Recommender Systems

Project description

Cornac

Cornac is a comparative framework for multimodal recommender systems. It focuses on making it convenient to work with models leveraging auxiliary data (e.g., item descriptive text and image, social network, etc). Cornac enables fast experiments and straightforward implementations of new models. It is highly compatible with existing machine learning libraries (e.g., TensorFlow, PyTorch).

Cornac is one of the frameworks recommended by ACM RecSys 2023 for the evaluation and reproducibility of recommendation algorithms.

Quick Links

Website | Documentation | Tutorials | Examples | Models | Datasets | Paper | Preferred.AI

.github/workflows/python-package.yml CircleCI AppVeyor Codecov Docs
Release PyPI Conda Conda Recipe Downloads
Python Conda Platforms License

Installation

Currently, we are supporting Python 3. There are several ways to install Cornac:

  • From PyPI (recommended):

    pip3 install cornac
    
  • From Anaconda:

    conda install cornac -c conda-forge
    
  • From the GitHub source (for latest updates):

    pip3 install Cython numpy scipy
    pip3 install git+https://github.com/PreferredAI/cornac.git
    

Note:

Additional dependencies required by models are listed here.

Some algorithm implementations use OpenMP to support multi-threading. For Mac OS users, in order to run those algorithms efficiently, you might need to install gcc from Homebrew to have an OpenMP compiler:

brew install gcc | brew link gcc

Getting started: your first Cornac experiment

Flow of an Experiment in Cornac

import cornac
from cornac.eval_methods import RatioSplit
from cornac.models import MF, PMF, BPR
from cornac.metrics import MAE, RMSE, Precision, Recall, NDCG, AUC, MAP

# load the built-in MovieLens 100K and split the data based on ratio
ml_100k = cornac.datasets.movielens.load_feedback()
rs = RatioSplit(data=ml_100k, test_size=0.2, rating_threshold=4.0, seed=123)

# initialize models, here we are comparing: Biased MF, PMF, and BPR
mf = MF(k=10, max_iter=25, learning_rate=0.01, lambda_reg=0.02, use_bias=True, seed=123)
pmf = PMF(k=10, max_iter=100, learning_rate=0.001, lambda_reg=0.001, seed=123)
bpr = BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123)
models = [mf, pmf, bpr]

# define metrics to evaluate the models
metrics = [MAE(), RMSE(), Precision(k=10), Recall(k=10), NDCG(k=10), AUC(), MAP()]

# put it together in an experiment, voilà!
cornac.Experiment(eval_method=rs, models=models, metrics=metrics, user_based=True).run()

Output:

MAE RMSE AUC MAP NDCG@10 Precision@10 Recall@10 Train (s) Test (s)
MF 0.7430 0.8998 0.7445 0.0548 0.0761 0.0675 0.0463 0.13 1.57
PMF 0.7534 0.9138 0.7744 0.0671 0.0969 0.0813 0.0639 2.18 1.64
BPR N/A N/A 0.8695 0.1042 0.1500 0.1110 0.1195 3.74 1.49

For more details, please take a look at our examples as well as tutorials. For learning purposes, this list of tutorials on recommender systems will be more organized and comprehensive.

Model serving

Here, we provide a simple way to serve a Cornac model by launching a standalone web service with Flask. It is very handy for testing or creating a demo application. First, we install the dependency:

$ pip3 install Flask

Supposed that we want to serve the trained BPR model from previous example, we need to save it:

bpr.save("save_dir", save_trainset=True)

After that, the model can be deployed easily by running Cornac serving app as follows:

$ FLASK_APP='cornac.serving.app' \
  MODEL_PATH='save_dir/BPR' \
  MODEL_CLASS='cornac.models.BPR' \
  flask run --host localhost --port 8080

# Running on http://localhost:8080

Here we go, our model service is now ready. Let's get top-5 item recommendations for the user "63":

$ curl -X GET "http://localhost:8080/recommend?uid=63&k=5&remove_seen=false"

# Response: {"recommendations": ["50", "181", "100", "258", "286"], "query": {"uid": "63", "k": 5, "remove_seen": false}}

If we want to remove seen items during training, we need to provide TRAIN_SET which has been saved with the model earlier, when starting the serving app. We can also leverage WSGI server for model deployment in production. Please refer to this guide for more details.

Efficient retrieval with ANN search

One important aspect of deploying recommender model is efficient retrieval via Approximate Nearest Neighor (ANN) search in vector space. Cornac integrates several vector similarity search frameworks for the ease of deployment. This example demonstrates how ANN search will work seamlessly with any recommender models supporting it (e.g., MF).

Supported framework Cornac wrapper Examples
spotify/annoy AnnoyANN ann_example.py, ann_all.ipynb
meta/faiss FaissANN ann_example.py, ann_all.ipynb
nmslib/hnswlib HNSWLibANN ann_example.py, ann_hnswlib.ipynb, ann_all.ipynb
google/scann ScaNNANN ann_example.py, ann_all.ipynb

Models

The recommender models supported by Cornac are listed below. Why don't you join us to lengthen the list?

Year Model and paper Model type Require-ments Examples
2024 Hypergraphs with Attention on Reviews (HypAR), paper Hybrid / Sentiment / Explainable reqs exp
2022 Disentangled Multimodal Representation Learning for Recommendation (DMRL), paper Content-Based / Text & Image reqs exp
2021 Bilateral Variational Autoencoder for Collaborative Filtering (BiVAECF), paper Collaborative Filtering / Content-Based reqs exp
Causal Inference for Visual Debiasing in Visually-Aware Recommendation (CausalRec), paper Content-Based / Image reqs exp
Explainable Recommendation with Comparative Constraints on Product Aspects (ComparER), paper Explainable N/A exp
2020 Adversarial Multimedia Recommendation (AMR), paper Content-Based / Image reqs exp
Hybrid Deep Representation Learning of Ratings and Reviews (HRDR), paper Content-Based / Text reqs exp
LightGCN: Simplifying and Powering Graph Convolution Network, paper Collaborative Filtering reqs exp
Predicting Temporal Sets with Deep Neural Networks (DNNTSP), paper Next-Basket reqs exp
Recency Aware Collaborative Filtering (UPCF), paper Next-Basket reqs exp
Temporal-Item-Frequency-based User-KNN (TIFUKNN), paper Next-Basket N/A exp
Variational Autoencoder for Top-N Recommendations (RecVAE), paper Collaborative Filtering reqs exp
2019 Correlation-Sensitive Next-Basket Recommendation (Beacon), paper Next-Basket reqs exp
Embarrassingly Shallow Autoencoders for Sparse Data (EASEᴿ), paper Collaborative Filtering N/A exp
Neural Graph Collaborative Filtering (NGCF), paper Collaborative Filtering reqs exp
2018 Collaborative Context Poisson Factorization (C2PF), paper Content-Based / Graph N/A exp
Graph Convolutional Matrix Completion (GCMC), paper Collaborative Filtering reqs exp
Multi-Task Explainable Recommendation (MTER), paper Explainable N/A exp
Neural Attention Rating Regression with Review-level Explanations (NARRE), paper Explainable / Content-Based reqs exp
Probabilistic Collaborative Representation Learning (PCRL), paper Content-Based / Graph reqs exp
Variational Autoencoder for Collaborative Filtering (VAECF), paper Collaborative Filtering reqs exp
2017 Collaborative Variational Autoencoder (CVAE), paper Content-Based / Text reqs exp
Conditional Variational Autoencoder for Collaborative Filtering (CVAECF), paper Content-Based / Text reqs exp
Generalized Matrix Factorization (GMF), paper Collaborative Filtering reqs exp
Indexable Bayesian Personalized Ranking (IBPR), paper Collaborative Filtering reqs exp
Matrix Co-Factorization (MCF), paper Content-Based / Graph N/A exp
Multi-Layer Perceptron (MLP), paper Collaborative Filtering reqs exp
Neural Matrix Factorization (NeuMF) / Neural Collaborative Filtering (NCF), paper Collaborative Filtering reqs exp
Online Indexable Bayesian Personalized Ranking (Online IBPR), paper Collaborative Filtering reqs
Visual Matrix Factorization (VMF), paper Content-Based / Image reqs exp
2016 Collaborative Deep Ranking (CDR), paper Content-Based / Text reqs exp
Collaborative Ordinal Embedding (COE), paper Collaborative Filtering reqs
Convolutional Matrix Factorization (ConvMF), paper Content-Based / Text reqs exp
Learning to Rank Features for Recommendation over Multiple Categories (LRPPM), paper Explainable N/A exp
Session-based Recommendations With Recurrent Neural Networks (GRU4Rec), paper Next-Item reqs exp
Spherical K-means (SKM), paper Collaborative Filtering N/A exp
Visual Bayesian Personalized Ranking (VBPR), paper Content-Based / Image reqs exp
2015 Collaborative Deep Learning (CDL), paper Content-Based / Text reqs exp
Hierarchical Poisson Factorization (HPF), paper Collaborative Filtering N/A exp
TriRank: Review-aware Explainable Recommendation by Modeling Aspects, paper Explainable N/A exp
2014 Explicit Factor Model (EFM), paper Explainable N/A exp
Social Bayesian Personalized Ranking (SBPR), paper Content-Based / Social N/A exp
2013 Hidden Factors and Hidden Topics (HFT), paper Content-Based / Text N/A exp
2012 Weighted Bayesian Personalized Ranking (WBPR), paper Collaborative Filtering N/A exp
2011 Collaborative Topic Regression (CTR), paper Content-Based / Text N/A exp
Earlier Baseline Only, paper Baseline N/A exp
Bayesian Personalized Ranking (BPR), paper Collaborative Filtering N/A exp
Factorization Machines (FM), paper Collaborative Filtering / Content-Based Linux only exp
Global Average (GlobalAvg), paper Baseline N/A exp
Global Personalized Top Frequent (GPTop), paper Next-Basket N/A exp
Item K-Nearest-Neighbors (ItemKNN), paper Neighborhood-Based N/A exp
Matrix Factorization (MF), paper Collaborative Filtering N/A exp1, exp2
Maximum Margin Matrix Factorization (MMMF), paper Collaborative Filtering N/A exp
Most Popular (MostPop), paper Baseline N/A exp
Non-negative Matrix Factorization (NMF), paper Collaborative Filtering N/A exp
Probabilistic Matrix Factorization (PMF), paper Collaborative Filtering N/A exp
Session Popular (SPop), paper Next-Item / Baseline N/A exp
Singular Value Decomposition (SVD), paper Collaborative Filtering N/A exp
Social Recommendation using PMF (SoRec), paper Content-Based / Social N/A exp
User K-Nearest-Neighbors (UserKNN), paper Neighborhood-Based N/A exp
Weighted Matrix Factorization (WMF), paper Collaborative Filtering reqs exp

Contributing

This project welcomes contributions and suggestions. Before contributing, please see our contribution guidelines.

Citation

If you use Cornac in a scientific publication, we would appreciate citations to the following papers:

  • Cornac: A Comparative Framework for Multimodal Recommender Systems, Salah et al., Journal of Machine Learning Research, 21(95):1–5, 2020.

    @article{salah2020cornac,
      title={Cornac: A Comparative Framework for Multimodal Recommender Systems},
      author={Salah, Aghiles and Truong, Quoc-Tuan and Lauw, Hady W},
      journal={Journal of Machine Learning Research},
      volume={21},
      number={95},
      pages={1--5},
      year={2020}
    }
    
  • Exploring Cross-Modality Utilization in Recommender Systems, Truong et al., IEEE Internet Computing, 25(4):50–57, 2021.

    @article{truong2021exploring,
      title={Exploring Cross-Modality Utilization in Recommender Systems},
      author={Truong, Quoc-Tuan and Salah, Aghiles and Tran, Thanh-Binh and Guo, Jingyao and Lauw, Hady W},
      journal={IEEE Internet Computing},
      year={2021},
      publisher={IEEE}
    }
    
  • Multi-Modal Recommender Systems: Hands-On Exploration, Truong et al., ACM Conference on Recommender Systems, 2021.

    @inproceedings{truong2021multi,
      title={Multi-modal recommender systems: Hands-on exploration},
      author={Truong, Quoc-Tuan and Salah, Aghiles and Lauw, Hady},
      booktitle={Fifteenth ACM Conference on Recommender Systems},
      pages={834--837},
      year={2021}
    }
    

License

Apache License 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cornac-2.1.0.tar.gz (5.9 MB view hashes)

Uploaded Source

Built Distributions

cornac-2.1.0-cp311-cp311-win_amd64.whl (3.1 MB view hashes)

Uploaded CPython 3.11 Windows x86-64

cornac-2.1.0-cp311-cp311-manylinux1_x86_64.whl (22.7 MB view hashes)

Uploaded CPython 3.11

cornac-2.1.0-cp311-cp311-macosx_10_9_universal2.whl (6.8 MB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

cornac-2.1.0-cp310-cp310-win_amd64.whl (3.1 MB view hashes)

Uploaded CPython 3.10 Windows x86-64

cornac-2.1.0-cp310-cp310-manylinux1_x86_64.whl (21.4 MB view hashes)

Uploaded CPython 3.10

cornac-2.1.0-cp310-cp310-macosx_11_0_x86_64.whl (3.7 MB view hashes)

Uploaded CPython 3.10 macOS 11.0+ x86-64

cornac-2.1.0-cp39-cp39-win_amd64.whl (3.2 MB view hashes)

Uploaded CPython 3.9 Windows x86-64

cornac-2.1.0-cp39-cp39-manylinux1_x86_64.whl (21.4 MB view hashes)

Uploaded CPython 3.9

cornac-2.1.0-cp39-cp39-macosx_11_0_x86_64.whl (3.7 MB view hashes)

Uploaded CPython 3.9 macOS 11.0+ x86-64

cornac-2.1.0-cp38-cp38-win_amd64.whl (3.2 MB view hashes)

Uploaded CPython 3.8 Windows x86-64

cornac-2.1.0-cp38-cp38-manylinux1_x86_64.whl (23.2 MB view hashes)

Uploaded CPython 3.8

cornac-2.1.0-cp38-cp38-macosx_11_0_x86_64.whl (3.7 MB view hashes)

Uploaded CPython 3.8 macOS 11.0+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page