使用LightFM库在Python中构建推荐引擎




使用LightFM库在Python中构建推荐引擎

推荐引擎是机器学习在现实世界中最受欢迎的应用之一。随着电子商务、在线流媒体服务和社交媒体的增长,推荐引擎已成为向用户提供个性化内容和推荐的关键组成部分。在本教程中,我们将学习如何使用LightFM库构建推荐引擎。

LightFM是一个Python库,允许您构建具有显式和隐式反馈的推荐系统,例如评分或用户交互。它是一个混合推荐系统,可以处理基于内容和协同过滤的方法。LightFM是建立在NumPy、SciPy和Cython之上的,并提供对大型数据集的快速和可扩展的训练。

在本教程中,我们将使用Movielens数据集,该数据集包含来自943个用户对1682部电影的10万个电影评分。我们的目标是构建一个推荐引擎,根据用户过去的评分和相似用户的评分来预测用户对电影的评分。



开始

在我们深入使用lightfm库之前,我们首先需要使用pip安装该库。

然而,由于它不是内置的,我们必须先安装lightfm库。这可以使用pip软件包管理器完成。

要安装lightfm库,请打开终端并输入以下命令−

pip install lightfm

这将下载并安装lightfm库及其依赖项。安装完成后,我们可以开始使用lightfm和其模块!

第一步:加载数据

第一步是将Movielens数据集加载到我们的Python环境中。我们将使用LightFM中内置的Movielens数据集,该数据集可在datasets模块中找到。我们可以使用以下代码加载Movielens数据集:

from lightfm.datasets import fetch_movielens
data = fetch_movielens(min_rating=4.0)

fetch_movielens函数用于下载Movielens数据集,并返回包含评分矩阵、用户特征、物品特征和其他信息的字典。在本教程中,我们只对评分矩阵感兴趣。

第二步:构建推荐引擎

下一步是使用LightFM构建推荐引擎。我们将使用WARP(加权逼近-排序成对)算法,这是一种混合推荐系统,结合了内容-基于和协同过滤方法的优点。我们可以使用以下代码构建推荐引擎 −

from lightfm import LightFM
model = LightFM(loss='warp')
model.fit(data['train'], epochs=30, num_threads=2)

LightFM类使用WARP损失函数初始化推荐引擎。然后,我们使用两个线程将模型拟合到训练数据中的30个周期。

第三步:生成推荐

现在我们已经构建了推荐引擎,我们可以使用它为用户生成推荐。我们可以通过调用LightFM模型的recommend方法来实现。recommend方法接受两个参数: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个项目作为推荐。

第四步:评估推荐引擎

构建推荐引擎后,评估其性能非常重要。我们可以使用精确度k和AUC指标来进行评估。精确度k指标测量了前k个推荐中与用户相关的推荐占比。AUC指标测量了接收者操作特性(ROC)曲线下的面积,该曲线显示了真正例率与假正例率之间的关系。

我们可以使用LightFM库来计算这些指标。可以使用precision_at_k方法计算精确度k,并使用auc_score方法计算AUC。以下是如何计算这些指标的示例:



from lightfm.evaluation import precision_at_k, auc_score

# Train the model
model.fit(interactions, epochs=10)

# Evaluate precision at k
print("Train precision at k:", precision_at_k(model, interactions, k=5).mean())
print("Test precision at k:", precision_at_k(model, test_interactions, k=5).mean())

# Evaluate AUC score
print("Train AUC score:", auc_score(model, interactions).mean())
print("Test AUC score:", auc_score(model, test_interactions).mean())

在这个例子中,我们正在使用交互矩阵训练模型,并在训练和测试数据集上评估精确度和AUC指标。我们对k使用了一个值为5的值,这意味着我们只考虑每个用户的前5个推荐。

完整代码

以下是完整的代码 –

import numpy as np
from lightfm.datasets import fetch_movielens
from lightfm import LightFM

# Load the MovieLens dataset.
data = fetch_movielens(min_rating=4.0)

# Define the model and fit it to the data.
model = LightFM(loss='warp')
model.fit(data['train'], epochs=30, num_threads=2)

# Evaluate the model on the training data.
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))

# Evaluate the model on the test data.
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 the evaluation results.
print('Train precision: {:.2f}'.format(train_precision))
print('Train AUC: {:.2f}'.format(train_auc))
print('Test precision: {:.2f}'.format(test_precision))
print('Test AUC: {:.2f}'.format(test_auc))

输出

Train precision: 0.51
Train AUC: 0.94
Test precision: 0.14
Test AUC: 0.86

总结

在本教程中,我们学习了如何使用LightFM库构建推荐引擎。首先,我们准备了数据并创建了交互矩阵。然后,我们训练了LightFM模型并使用它进行了推荐。最后,我们使用准确率在k和AUC指标评估了推荐引擎的性能。

LightFM库提供了一个强大和灵活的方式来构建推荐引擎,支持隐式和显式反馈数据。它能处理大型数据集并融合边信息,非常适合许多现实世界的推荐场景。通过按照本教程中的步骤,你将能够成功构建自己的LightFM推荐引擎。



Python 精选笔记
如何在Python中使用正则表达式匹配非单词字符如何在Python中进行不区分大小写的字符串比较如何在Python中使用正则表达式匹配非数字如何在Python中使用正则表达式匹配开头和结尾如何使用正则表达式在Python中匹配单词如何在Python中使用正则表达式匹配空格如何使用Python获取最大文件名长度限制如何在Python中使用正则表达式的替代方法如何在Python正则表达式中忽略重复后的字符匹配Python中的[ d+]正则表达式如何工作如何在Pandas DataFrame中获取第n行?Python 在列表中进行互相元组的减法使用Python-乘法选择性值使用Python将列表中的交替元素相乘?移除Python中嵌套列表中的所有重复项和排列通过Python Vincent制作柱状图使用Python Matplotlib创建基本甘特图Python Kivy中的相对布局使用Python Tkinter生成随机密码生成器使用Python Tkinter实时货币转换器在循环范围内打印Python列表元素Python - 使用OCR读取PDF内容Python - 使用正则表达式匹配包含g后跟一个或多个e的单词的程序在Python中打印2D列表的对角线Python - 打印字母直到NPython - 列表中的平方乘积Python – 列表中前缀的乘积Python – 前缀和子数组,直到出现false值Python - 字典中的优先键分配Python - 删除给定索引的元素后打印列表Python - 列表中第k列的乘积使用Python删除范围外的所有子列表如何使用Python从字符串列表中删除所有数字?如何使一个Python文件运行另一个文件?如何在Matplotlib中更改X轴和Y轴的范围?如何在Python中获得格式化的日期和时间?Python - PIL 属性Python - 字典中的前缀键匹配Python 列表中最大元素的位置Python - 在字符串中替换多个索引Python - 在字典的每个键上执行操作Python - 特定字符前的前缀提取Python - 根据大小提取前缀通过常数乘以Python字典的值Python 在包含字符串和数字的混合列表中相乘整数Python - 将给定元素移动到列表开头如何相乘Python Tuple的元素?使用Python spacy进行句子分割如何在Python中将元素移动到列表的末尾?Python-将子列表中的每个元素乘以其索引使用Qiskit在Python中的量子电路实现经典的非逻辑门Django中的基于类和基于函数的视图使用'in'和'not in'运算符在Python Pandas中检查DataFrame中是否存在某个值Python - PIL属性Python - 字典中的前缀键匹配Python - 列表中最大元素的位置Python - 在字符串中替换多个索引Python - 对字典中的每个键执行操作Python -指定字符前的前缀提取Python - 根据大小提取前缀通过常数乘以Python字典值Python-在混合字符串和数字列表中相乘整数Python – 将给定元素移动到列表的开头如何乘以Python元组的元素?使用Python spacy执行句子分割如何在Python中将元素移动到列表的末尾?Python-通过索引将子列表中的每个元素相乘使用Qiskit在Python中实现经典非逻辑门的量子电路在Django中的基于类视图和基于函数视图的对比在Python Pandas中使用'in'和'not in'运算符检查DataFrame中是否存在值使用LightFM库在Python中构建推荐引擎使用YOLO算法构建实时物体检测系统使用Python和Scikit-Learn构建客户流失预测的机器学习模型使用Python和WebSocket技术构建实时聊天应用使用Python和BERT构建问答系统使用Python和dlib库构建人脸识别系统使用Python和OpenCV库构建人脸识别系统使用Python和Pandas库构建数据预处理管道使用Pygame模块在Python中构建一个简单的游戏使用Python和ccxt库构建一个加密货币交易机器人使用Python和自然语言工具包(NLTK)构建聊天机器人使用Plan模块在Python中编写crontab文件使用Python和Requests库开发网络爬虫使用Python中的Whoosh库开发文本搜索引擎使用Python和scikit-learn开发机器学习模型使用Python和Plotly Dash创建基于Web的数据可视化仪表板使用Python控制树莓派GPIO引脚使用Python和Pandas库构建股票价格预测模型如何在Python中解析XML并计算特定节点属性的实例?如何在Python中解析本地HTML文件?如何按多列对PySpark DataFrame进行排序?如何在Pygame中移动游戏角色?如何在Python中同时打开两个文件?如何使用Python移动文件夹及其子文件夹的列表?如何使用Python将多个文件夹合并成一个文件夹?如何使用Python将多个Excel文件合并成一个单一文件?如何使用Python Pandas按照共同的键合并多个TSV文件?如何使用PIL将透明的PNG图片与另一张图片合并?Python中嵌套函数是如何工作的?Python中的全局变量和局部变量?在Python函数中如何使用全局变量?如何从Python对象中获取源代码?如何在Python中返回一个函数?如何在Python中安装matplotlib?Python - 分割包含散乱字符的字符串Python - 记录列表XORPython – 向记录的末尾添加数据Python - 键值大于K的记录在Python中垂直打印列表Python - 列表中字符串平均长度Python列表中的交替循环Python程序实现混淆词游戏Python-记录联合Python程序计算列表中元组的重复项Python程序:将字符串的字符转换为相反的大小写Python - 打印给定年份列表中的闰年数量Python - 打印所有子列表中的共同元素Python - 删除嵌套列表中的所有元素如何在Python列表中检查空格?在Python中引发异常到另一个异常Python字符串中的范围复制Python程序计算包含列表的列表中列表的数量修改给定Python列表中的重复值Python - 检查元素是否在指定范围内出现从Python的元组列表中删除所有字符串如何使用Pygame添加颜色呼吸效果?如何在Bokeh中添加颜色条如何在Bokeh中添加颜色选择器?使用Python程序显示带有星边框的数字半菱形图案Python使用ipaddress模块确定给定的IPv4地址是否为保留地址使用ipaddress模块的Python程序来确定给定的IP地址是公网还是私网Python程序通过平方和连接给定数字的奇数位数来创建一个OTPPython程序创建以零为中心的列表Python程序计算字符串中的字符数Python程序将米转换为码,反之亦然Python程序:统计文本文件中的元音、行数和字符数Python程序计算文本文件中的单词数量Python程序,用于计算文本文件中空格的数量将字典的值转换为字符串的Python程序Python程序将浮点数转换为指数Python程序将整数转换为指数