推荐系统 - 机器学习

2025年6月24日 | 阅读16分钟

推荐系统是一种机器学习算法,它结合了用户和产品的信息来预测用户潜在的兴趣。这些系统广泛应用于电子商务、社交媒体和娱乐等领域,为用户提供个性化推荐。

推荐系统有多种类型,包括

  1. 基于内容的过滤: 这种类型的系统利用用户过去喜欢的物品的特征来推荐类似的物品。
  2. 协同过滤: 这种类型的系统利用用户过去的喜好行为来推荐类似用户喜欢的物品。
  3. 混合: 为了生成建议,这种系统结合了基于内容的过滤和协同过滤技术。
  4. 矩阵分解: 使用这种方法,用户-物品矩阵被分解成两个低维矩阵,然后用于生成预测。
  5. 深度学习: 这些模型利用神经网络来训练用户和物品表示,然后用于生成推荐。

选择哪种类型的推荐系统取决于具体的应用和可用的数据类型。

值得注意的是,推荐系统被广泛使用,并且可能对企业和用户产生重大影响。然而,重要的是要考虑可能引入系统中的道德考量和偏见。

在本文中,我们将利用Kaggle数据集中的数据:CI&T Deskdrop的文章分享和阅读

为了向客户提供个性化建议,我们将演示如何在Python中开发协同过滤、基于内容的过滤和混合技术。

数据集详情

来自CI&T内部通信平台的Deskdrop数据集,它是为期12个月(2016年3月至2017年2月)日志的实际样本。(DeskDrop)。在超过3k篇公开发布的文章中,记录了大约7.3万次用户互动。该文件由两个CSV文件组成

  • shared_articles.csv
  • Users_interactions.csv

现在,我们将尝试在代码中实现它。

导入库

加载数据集

在这里,我们必须加载数据集以执行机器学习操作。

我们已经知道数据集有两个CSV文件。

1. shared_articles.csv

它包括平台上发布的文章数据。每篇文章都包含共享时间戳、原始URL、标题、纯文本内容、共享语言(葡萄牙语:pt或英语:en)以及共享文章的个人(作者)信息。

  • 共享内容: 用户可以访问平台上共享的文章。
  • 内容已删除: 文章已从网站上删除,不再可用于推荐。

为简单起见,我们在此仅分析“内容共享”事件类型,错误地假设所有文章在整个一年期间都可访问。对于更准确的审查,只应推荐在特定时间可用的出版物,但无论如何我们都会为您进行此练习。

输出

Recommendation System - Machine Learning

2. users_interactions.csv

它包含共享内容的用户交互记录。通过使用contentId字段,它可以与shared_articles.csv连接。

eventType 的值是

  • 查看: 用户已阅读文章。
  • 喜欢: 用户喜欢了这篇文章。
  • 用户创建评论: 用户向文章添加了评论。
  • 关注: 当文章中出现新评论时,用户被选中接收电子邮件。
  • 书签: 用户已保存页面,以便日后轻松访问。

输出

Recommendation System - Machine Learning

数据处理

在这里,我们为每种交互分配一个权重或强度,因为有多种类型。例如,我们认为文章中的评论表示用户对该物品的兴趣比点赞或简单查看更重要。

注意:用户冷启动是推荐系统的一个问题,它使得难以向消费历史很少或没有消费历史的用户提供个性化推荐,因为没有足够的数据来模拟他们的偏好。

因此,我们只保留数据集中至少有五次交互的用户。

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

Desk drop 允许用户多次浏览文章并以各种方式(例如点赞或评论)与文章互动。因此,我们通过交互类型强度的加权总和来组合用户与某个物品的所有交互,然后应用对数变换来平滑分布,并利用此信息来建模用户对特定文章的兴趣。

输出

Recommendation System - Machine Learning

求值

评估对于机器学习项目至关重要,因为它能够客观地比较各种方法和模型超参数选择。

确保训练模型泛化到未使用交叉验证程序训练的数据是评估的关键组成部分。在这里,我们采用一种简单的交叉验证技术,称为留出法,其中随机数据样本(在本例中为20%)在训练过程中被保留,仅用于评估。本文的评估指标都使用测试集计算。

一种更可靠的评估策略涉及根据参考日期划分训练集和测试集,训练集由该日期之前发生的所有交互组成,测试集由该日期之后发生的交互组成。为简单起见,我们决定在此笔记本中使用第一个随机策略,但您可能希望尝试第二种方法,以更准确地模拟rec sys在生产中预测“未来”用户的交互时的行为。

输出

Recommendation System - Machine Learning

推荐系统中经常使用一些评估指标。我们决定采用Top-N准确率指标,它评估向用户提供的顶级推荐与用户实际交互的测试集项目相比的准确性。

根据此评估过程的运作方式

  • 对于每个用户
    • 对于用户在测试集中参与的每个项目
      • 用户尚未与100个其他对象交互。因此选择100个。在这里,我们天真地假设用户不关心未交互的对象,但这个假设可能不准确,因为用户可能只是不知道它们。尽管如此,我们还是坚持这个前提。
      • 应将包含一个已交互项目和100个未交互(“不相关!”)项目的集合发送到推荐模型,以生成建议项目的排名列表。
      • 计算此人及其从排名推荐列表中交互的项目的Top-N准确率指标。
  • 全局汇总Top-N准确率指标。

Recall@N 被选为 Top-N 准确度指标,它评估交互项目是否是用户 101 个建议优先列表中的前 N 个项目之一(命中)。

NDCG@N 和 MAP@N 是另外两个广受欢迎的排名指标,它们的得分计算考虑了相关项目在排名列表中的位置(如果相关项目在第一个位置,则为最大值)。

现在我们将创建一个名为“ModelEvaluator”的类,它将用于我们创建的推荐模型的评估。

流行度模型

流行度模型是一种典型的基线策略,通常很难超越。此策略仅向用户推荐客户尚未消费过的最受欢迎的产品;它不是个性化定制的。由于流行度考虑了“大众智慧”,因此它通常提供对大多数人来说普遍有吸引力的可靠建议。

推荐系统的主要目标远远超出了这种简单方法,即向具有非常特定兴趣的用户应用长尾产品。

输出

Recommendation System - Machine Learning

在这里,我们使用上述方法评估流行度模型。

它的 Recall@5 为 0.2417,这表明流行度模型将测试集中大约 24% 的交互项目排在前 5 个项目(来自包含 100 个随机项目的列表)中。此外,正如预期的那样,Recall@10 显著更高(37%)。

您可能会惊讶于流行模型通常表现得如此出色。

输出

Recommendation System - Machine Learning

基于内容的过滤模型

基于内容的过滤技术利用用户交互过的对象的描述或特征来推荐相关项目。该解决方案在防止冷启动问题方面可靠,因为它仅依赖于用户先前的决策。对于书籍、文章和新闻报道等基于文本的对象,使用原始文本很容易创建项目配置文件和用户配置文件。

在这种情况下,我们采用TF-IDF,这是一种广受欢迎的信息检索(搜索引擎)方法。

使用这种方法,非结构化文本被转换为向量结构,其中每个单词由向量中的一个位置表示,值表示一个单词对于一篇文章的重要性。所有项目将使用相同的向量空间模型表示,从而可以比较文章。

输出

Recommendation System - Machine Learning

我们通过平均用户交互过的所有项目配置文件来建模用户配置文件。最终的用户配置文件将更侧重于用户互动最多的文章(例如,喜欢或评论),平均值将根据交互强度进行加权。

输出

Recommendation System - Machine Learning

我们先来看看配置文件。它是一个长度为 5000 的单位向量。每个位置的值表示一个标记(二元组或单元组)对我来说有多重要。

根据对下方个人资料的查看,最相关的令牌确实反映了对机器学习、深度学习、人工智能和谷歌云平台专业领域的兴趣!因此,我们可以期待一些可靠的建议!

输出

Recommendation System - Machine Learning

使用基于内容的过滤模型的个性化推荐,我们的 Recall@5 为 0.162,这表明该模型将测试集中大约 16% 的交互项目列在前 5 个项目(来自包含 100 个随机项目的列表)中。Recall@10 也为 0.261 (52%)。基于信息的模型表现不如流行度模型的事实表明,消费者可能不像阅读他们已经阅读过的高度相似内容那样致力于阅读内容。

输出

Recommendation System - Machine Learning

协同过滤模型

它有主要的实现方法。

  • 基于内存: 此方法根据用户交互过的项目计算用户相似度(基于用户的方法),或者根据与项目交互过的用户计算项目相似度(基于项目的方法)。

基于用户邻域的协同过滤是这种策略的一个常见示例,其中为用户选择前 N 个具有相似兴趣的用户(通常使用皮尔逊相关性确定),并用于推荐这些具有兴趣的用户喜欢但当前用户尚未交互过的产品。尽管此策略相对容易实现,但它通常无法有效地扩展到大量人员。Crab 提供了此策略的优秀 Python 实现。

  • 基于模型: 在此方法中,通过利用各种机器学习算法创建模型,向客户提供产品推荐。存在许多基于模型的协同过滤技术,包括概率潜在语义分析、神经网络、贝叶斯网络、聚类模型和潜在分量模型,如奇异值分解(SVD)。

矩阵分解

用户-项目矩阵使用潜在分量模型压缩成低维形式。这种方法的优点在于,它在一个低维空间中使用一个非常小的矩阵,而不是一个具有大量缺失值的高维矩阵。

上一节中描述的基于用户和基于项目的邻域算法都可以与简化的表示一起使用。这种范式具有许多优点。与基于内存的算法相比,它更好地处理原始矩阵的稀疏性。此外,在生成的矩阵中比较相似性要容易得多,尤其是在处理大型稀疏数据集时。

在这里,我们采用奇异值分解(SVD),这是一种著名的潜在分量模型。您还可以使用其他更特定于协同过滤的矩阵分解框架,例如 surprise、mrec 或 python-recsys。我们选择 SciPy 实现的 SVD,因为 Kaggle 内核支持它。

在用户-项目矩阵中分解多少个元素的选择至关重要。原始矩阵重构中的分解越精确,因子越多。因此,如果模型被允许保留原始矩阵的太多细节,它可能难以推广到未用于训练的数据。减少组件的数量会增加模型的通用性。

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

我们尝试通过将元素分解后相乘来重建原始矩阵。因此,矩阵不再稀疏。我们将利用对用户尚未交互过的商品的预测来生成推荐。

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

在评估协同过滤模型(SVD矩阵分解)时,Recall@5(33%)和Recall@10(46%)的值都远高于流行度模型和基于内容模型。

输出

Recommendation System - Machine Learning

混合推荐系统

它是协同过滤和基于内容的过滤方法的组合。实际上,多项研究表明,混合方法优于单一方法,并且学者和从业者都经常采用它们。

让我们创建一个简单的混合技术,该技术根据归一化协同过滤和基于内容分数的加权平均值对项目进行排名。在此示例中,协同过滤和基于内容模型的权重分别为 100.0 和 1.0,因为协同过滤模型比基于内容模型准确得多。

输出

Recommendation System - Machine Learning

方法比较

现在,我们将比较recall@5和recall@10的方法。

输出

Recommendation System - Machine Learning

新冠军诞生了!

通过结合协同过滤和基于内容的过滤,我们简单的混合技术优于前者。Recall@5 目前为 34.2%,而 Recall@10 为 47.9%。

现在为了更好地理解,我们还可以绘制模型比较图。

输出

Recommendation System - Machine Learning

测试

现在,我们将测试最佳模型,即其他用户的混合模型。

下面显示了一些我在训练集中与 Deskdrop 互动过的文章。很明显,机器学习、深度学习、人工智能和谷歌云平台是主要兴趣领域。

输出

Recommendation System - Machine Learning

输出

Recommendation System - Machine Learning

当我们比较混合模型的推荐与实际兴趣时,我们发现推荐非常相似。

结论

在本文中,我们研究并比较了 CI&T Deskdrop 数据集上的主要推荐系统方法。结果表明,基于内容的过滤和混合策略在文章推荐方面优于单独的协同过滤。

在这三者中,混合模型在最佳推荐方面具有最高的准确性。