使用 Python 中的矩阵分解从头开始构建推荐系统

Building a Recommender System From Scratch with Matrix Factorization in Python

使用 Python 中的矩阵分解从头开始构建推荐系统
作者 | Ideogram 提供图片

引言

在本文中,我们将一步一步地使用矩阵分解在 Python 中构建一个电影推荐系统。在许多用于构建推荐系统的技术中,这些技术根据用户偏好和过去互动情况向用户推荐产品、服务或内容,其中矩阵分解作为协同过滤的强大技术脱颖而出,能够有效地从大规模用户和项目数据库中捕捉用户-项目互动中的隐藏模式。

具体来说,本教程将介绍一个名为 **surprise** 的 Python 库,其中包含用于构建推荐系统的便捷的矩阵分解算法实现。我们还将考虑 MovieLens 100K 数据集:一个流行的电影推荐数据集,非常适合从实践角度熟悉推荐系统。

注意:建议您在开始本教程之前,对推荐系统的概念和基础知识有一定的了解。

分步流程

第一步是导入必要的库和包。您可能需要在导入 `surprise` 库之前手动安装它。

我们将从定义一个函数开始编码,该函数从官方数据集的外部网站加载 **MovieLens 100K** 数据集。此过程包括解压下载的 `.zip` 文件。

接下来,我们通过调用新定义的函数来加载数据,将数据放入 Pandas DataFrame,并获取一些关于它的基本信息。

打印出的输出描述了数据集的重要方面

正如我们所看到的,这个数据集的大小对于本教程的说明性目的来说是相当容易管理的,尽管矩阵分解的实际应用通常会涉及更大的用户和项目(例如电影)集。

现在,借助从 surprise 库导入的两个类,即 `Dataset` 和 `Reader`,我们将数据集打包成库的矩阵分解技术实现易于管理的形式。我们这样做如下,并且还为了模型评估将数据分割成训练集和测试集。请注意,在初始化 `Reader` 对象时指定数据集中正确的数值评分范围的重要性。

现在我们进入实际操作,初始化、训练和评估矩阵分解模型。具体来说,我们将使用奇异值分解(SVD),这是一种流行的矩阵分解方法,其实现通过 surprise 的 `SVD` 类提供。如果您熟悉使用 scikit-learn 训练机器学习模型,您会发现这个过程非常相似。

在上面的 SVD 模型实例化中,`n_factors` 是一个重要的超参数,我们在其中定义了所需的维度(在本例中为 20),用于我们用来构建紧凑的用户和项目向量表示的潜在特征空间,这些表示基于以庞大但稀疏的用户-项目评分矩阵形式提供的原始数据。要更好地理解矩阵分解中的这一关键过程,请务必查看本文。其他使用的参数是学习率(`lr_all`,0.01)、防止过拟合的正则化参数(`reg_all`,0.01)以及训练周期数(`n_epochs`),设置为 20。

更改上述任何参数的值都可能影响模型在测试数据上的最终性能,该性能通过 RMSE 和 MAE 等预测误差指标进行衡量。在我们的特定设置中,我们得到

为了进行更稳健的评估,我们可以选择应用交叉验证

尝试一下

现在,让我们通过一些示例推荐来让我们的推荐系统运行起来。为此,我们将首先定义另外两个自定义函数:一个用于加载电影标题集,另一个函数(给定用户 ID 和所需的推荐数量 N)将使用训练好的模型为该用户获取推荐电影列表,基于她在原始评分数据中反映出的偏好。后一个函数也许是整个代码中最有见地的一部分,因此我们添加了一些内联注释以便更好地理解所涉及的过程。

现在所要做的就是尝试这些函数来获取实际的推荐!

输出

总结

就是这样!通过这些步骤,我们构建了第一个基于矩阵分解的电影推荐系统并进行了实际演示。要进一步深入了解此类推荐系统模型的错综复杂和奇妙之处,接下来的步骤可以是可视化有趣的 data patterns,例如每个用户或电影的评分分布,根据潜在因子表示查找相似电影,或者可视化潜在因子本身。

暂无评论。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。