使用 LightFM 库在 Python 中构建推荐引擎
推荐引擎是现实世界中机器学习最流行的应用之一。随着电子商务、在线流媒体服务和社交媒体的发展,推荐引擎已成为向用户提供个性化内容和推荐的关键组成部分。在本教程中,我们将学习如何使用 LightFM 库构建推荐引擎。
LightFM 是一个 Python 库,允许您构建具有显式和隐式反馈(例如评分或用户交互)的推荐系统。它是一个混合推荐系统,可以处理基于内容和协同过滤的方法。LightFM 建立在 NumPy、SciPy 和 Cython 之上,并提供快速且可扩展的大型数据集训练。
在本教程中,我们将使用 Movielens 数据集,其中包含 943 位用户对 1682 部电影的 10 万部电影评分。我们的目标是构建一个推荐引擎,该引擎可以根据用户过去的评分和类似用户的评分来预测用户的电影评分。
入门
在深入使用 lightfm 库之前,我们首先需要使用 pip 安装该库。
但是,由于它不是内置的,我们必须首先安装 lightfm 库。这可以使用 pip 包管理器完成。
要安装 lightfm 库,请打开终端并输入以下命令 -
pip install lightfm
这将下载并安装 lightfm 库及其依赖项。安装后,我们可以开始使用 lightfm 并利用它的模块!
步骤 1:加载数据
第一步是将 Movielens 数据集加载到我们的 Python 环境中。我们将使用 LightFM 中内置的 Movielens 数据集,该数据集可在数据集模块中找到。我们可以使用以下代码加载 Movielens 数据集 -
from lightfm.datasets import fetch_movielens data = fetch_movielens(min_rating=4.0)
fetch_movielens 函数下载 Movielens 数据集并返回一个包含评级矩阵、用户特征、项目特征和其他信息的字典。在本教程中,我们只对评级矩阵感兴趣。
步骤 2:构建推荐引擎
下一步是使用 LightFM 构建推荐引擎。我们将使用 WARP(加权近似排名成对)算法,这是一种混合推荐系统,结合了基于内容和协同过滤方法的优点。我们可以使用以下代码构建推荐引擎 −
from lightfm import LightFM model = LightFM(loss='warp') model.fit(data['train'], epochs=30, num_threads=2)
LightFM 类使用 WARP 损失函数初始化推荐引擎。然后,我们使用两个线程将模型拟合到 30 个时期的训练数据。
步骤 3:生成推荐
现在我们已经构建了推荐引擎,我们可以使用它为用户生成推荐。我们可以通过调用 LightFM 模型的推荐方法来做到这一点。推荐方法采用两个参数:user_ids 和 item_ids。我们可以一次为单个用户或多个用户生成推荐。我们还可以指定要生成的推荐数量。以下代码为用户 3 生成 10 条推荐 -
user_id = 3 n_items = data['train'].shape[1] recommendations = model.predict(user_id, np.arange(n_items)) top_items = np.argsort(-recommendations)[:10]
predict 方法返回给定用户的每个项目的预测评分。然后,我们按降序对预测评分进行排序,并选择前 10 个项目作为推荐。
步骤 4:评估推荐引擎
一旦构建了推荐引擎,评估其性能就很重要。我们可以通过使用 k 精度和 AUC 指标来做到这一点。k 精度指标衡量前 k 个推荐中与用户相关的推荐的百分比。 AUC 指标测量的是受试者工作特征 (ROC) 曲线下的面积,该曲线显示了真阳性率与假阳性率。
我们可以使用 LightFM 库来计算这些指标。可以使用 precision_at_k 方法计算 k 处的精度,可以使用 auc_score 方法计算 AUC。以下是计算这些指标的示例 -
from lightfm.evaluation import precision_at_k, auc_score # 训练模型 model.fit(interactions, epochs=10) # 评估 k 处的精度 print("训练 k 处的精度:", precision_at_k(model, interactions, k=5).mean()) print("测试 k 处的精度:", precision_at_k(model, test_interactions, k=5).mean()) # 评估 AUC 分数 print("训练 AUC 分数:", auc_score(model, interactions).mean()) print("测试 AUC 分数:", auc_score(model, test_interactions).mean())
在此示例中,我们在交互矩阵上训练模型,并在训练和测试中评估 k 处的精度和 AUC 指标测试数据集。我们对 k 使用了 5 的值,这意味着我们只考虑每个用户的前 5 条推荐。
完整代码
以下是完整代码 −
import numpy as np from lightfm.datasets import fetch_movielens from lightfm import LightFM # 加载 MovieLens 数据集。 data = fetch_movielens(min_rating=4.0) # 定义模型并将其与数据拟合。 model = LightFM(loss='warp') model.fit(data['train'], epochs=30, num_threads=2) # 在训练数据上评估模型。 train_precision = np.mean(precision_at_k(model, data['train'], k=10, num_threads=2)) train_auc = np.mean(auc_score(model, data['train'], num_threads=2)) # 在测试数据上评估模型。 test_precision = np.mean(precision_at_k(model, data['test'], k=10, num_threads=2)) test_auc = np.mean(auc_score(model, data['test'], num_threads=2)) # 打印评估结果。 print('训练精度:{:.2f}'.format(train_precision)) print('训练 AUC:{:.2f}'.format(train_auc)) print('测试精度:{:.2f}'.format(test_precision)) print('测试 AUC:{:.2f}'.format(test_auc))
输出
训练精度:0.51 训练 AUC:0.94 测试精度:0.14 测试 AUC:0.86
结论
在本教程中,我们学习了如何使用 LightFM 库构建推荐引擎。我们首先准备数据并创建交互矩阵。然后,我们训练 LightFM 模型并使用它来提出建议。最后,我们使用 k 精度和 AUC 指标评估了推荐引擎的性能。
LightFM 库提供了一种强大而灵活的方法来构建推荐引擎,支持隐式和显式反馈数据。凭借其处理大型数据集和整合辅助信息的能力,它是许多现实世界推荐场景的绝佳选择。按照本教程中的步骤,您将能够顺利使用 LightFM 构建自己的推荐引擎。