跳转到主要内容

category

LightFM是许多流行的推荐算法的Python实现,用于隐式和显式反馈。

它还可以将项目和用户元数据合并到传统的矩阵分解算法中。它将每个用户和项目表示为其特征的潜在表示的总和,从而允许推荐泛化到新项目(通过项目特征)和新用户(通过用户特征)。

该方法的细节在arXiv上提供的LightFM论文中进行了描述。

快速入门


如果你不耐烦,直接跳到Movielens快速入门。

安装


PyPI


使用pip从pypi安装:pip安装lightfm。在Linux、使用Homebrew Python的OSX和使用Miniconda的Windows上,一切都应该开箱即用。

OSX和Windows用户注意:默认情况下,LightFM在OSX和窗口上不使用OpenMP,因此所有型号配件都是单线程的。这是由于Clang(和Miniconda)不支持OpenMP,安装启用OpenMP的gcc版本既复杂又劳动密集。如果你想在这些平台上使用LightFM的多线程功能,你应该尝试通过Docker使用它,如下一节所述。

也不支持使用OSX中包含的默认Python发行版进行构建;请尝试Homebrew或Anaconda的版本。

使用Docker


在许多系统中,在Docker容器中尝试LightFM可能更方便。此存储库提供了一个足以运行LightFM及其示例的小型Dockerfile。要运行它:

  • 安装Docker并启动Docker deamon/虚拟机。
  • 克隆此存储库并导航到它:git clone git@github.com:lyst/lightfm.git && cd lightfm
  • 运行docker-compose build lightfm来构建容器。

容器现在应该可以使用了。然后,您可以:

  • 通过运行docker-compose run lightfm py.test -x lightfm/tests/ 来运行测试/
  • 通过运行docker-compose run --service-ports lightfm jupyter notebook lightfm/examples/movielens/example.ipynb --allow-root --ip="0.0.0.0" --port=8888 --no-browser 来运行movilens示例。笔记本电脑将在容器IP地址的8888端口访问。

使用方法


使用主LightFM类进行模型拟合非常简单。

创建具有所需潜在维度的模型实例:

from lightfm import LightFM

model = LightFM(no_components=30)


假设train是一个(无用户,无项目)稀疏矩阵(1表示正交互,-1表示负交互),你可以通过调用来拟合传统的矩阵因式分解模型:

model.fit(train, epochs=20)


这将训练传统的MF模型,因为没有提供用户或项目功能。

要获取预测,请调用model.predict:

predictions = model.predict(test_user_ids, test_item_ids)


用户和项目特征可以通过将其传递到拟合方法中来纳入培训。假设user_feature是一个(no_users,no_user_feature)稀疏矩阵(item_feature也是如此),您可以调用:

model.fit(train,
          user_features=user_features,
          item_features=item_features,
          epochs=20)
predictions = model.predict(test_user_ids,
                            test_item_ids,
                            user_features=user_features,
                            item_features=item_features)


以训练模型并获得预测。

训练和预测都可以使用多个核心来提高速度:

model.fit(train, epochs=20, num_threads=4)
predictions = model.predict(test_user_ids, test_item_ids, num_threads=4)


该实现使用异步随机梯度下降[6]进行训练。当交互矩阵(或特征矩阵)非常密集并且使用大量线程时,这可能会导致精度降低。然而,在实践中,在具有20个线程的稀疏数据集上进行训练不会导致可测量的准确性损失。

在隐式反馈设置中,可以使用BPR、WARP或k-OS WARP损失函数。如果训练是一个稀疏矩阵,其中正条目表示正交互,则模型可以按如下方式训练:

model = LightFM(no_components=30, loss='warp')
model.fit(train, epochs=20)


示例


查看示例目录以获取更多示例。

Movielens示例展示了如何在Movielens数据集上使用LightFM,包括使用和不使用电影元数据。另一个例子比较了adagrad和adadelta学习计划的性能。

Kaggle优惠券购买预测示例将LightFM应用于预测优惠券购买。

关于使用LightFM的文章和教程

  1. Learning to Rank Sketchfab Models with LightFM
  2. Metadata Embeddings for User and Item Cold-start Recommendations

  3. Recommendation Systems - Learn Python for Data Science

 

在更改.pyx扩展名文件时,您需要运行python setup.py cythonize,以便在运行pip install-e之前生成扩展名.c文件。。