使用协作过滤构建推荐引擎

本文概述

协作过滤是构建智能推荐器系统时最常用的技术, 随着收集有关用户的更多信息, 该系统可以学习提供更好的推荐。

大多数网站(例如Amazon, YouTube和Netflix)都使用协作过滤作为其复杂推荐系统的一部分。你可以使用此技术构建推荐器, 以根据相似用户的喜好向用户提供建议。

在本文中, 你将了解:

  • 协同过滤及其类型
  • 建立推荐人所需的数据
  • Python中可用的库可构建推荐程序
  • 协作过滤的用例和挑战

免费奖金:单击此处可访问Python技巧的一章:该书通过简单的示例向你展示了Python的最佳实践, 你可以立即应用这些示例编写更精美的Pythonic代码。

移除广告

什么是协作过滤?

协作过滤是一种可以根据相似用户的反应过滤出用户可能喜欢的项目的技术。

它的工作原理是搜索一大群人, 并找到口味与特定用户相似的较小用户。它查看他们喜欢的项目, 并将其组合以创建建议的排名列表。

有很多方法可以确定哪些用户相似, 并结合他们的选择来创建推荐列表。本文将向你展示如何使用Python做到这一点。

数据集

要尝试使用推荐算法, 你将需要包含一组项目和一组对某些项目做出反应的用户的数据。

反应可以是显性的(按1到5, 喜欢或不喜欢的等级), 也可以是隐性的(查看项目, 将其添加到愿望清单, 花费在文章上的时间)。

处理此类数据时, 你通常会以矩阵的形式查看数据, 该矩阵由一组用户对一组项目中的某些项目给出的反应组成。每行将包含用户给出的评分, 每列将包含项目收到的评分。包含五个用户和五个项目的矩阵如下所示:

推荐系统中使用的用户项目评分矩阵

评分表

矩阵显示五个用户, 他们以1到5的等级对某些项进行了评分。例如, 第一个用户对第三项给出了4级。

在大多数情况下, 矩阵中的单元格为空, 因为用户仅对几项进行评分。每个用户对每个可用项目进行评分或做出反应的可能性很小。单元格大部分为空的矩阵称为稀疏矩阵, 与此相反的矩阵(大部分为填充矩阵)称为密集矩阵。

已经收集了许多数据集, 这些数据集可供公众进行研究和基准测试。这是你可以选择的高质量数据源的列表。

最好的入门方法是GroupLens Research收集的MovieLens数据集。特别是, MovieLens 100k数据集是一个稳定的基准数据集, 其中943个用户对1682个电影给出了100, 000个分级, 每个用户对至少20个电影进行了分级。

该数据集由许多文件组成, 这些文件包含有关电影, 用户以及用户对所观看电影的评级的信息。感兴趣的是以下内容:

  • u.item:电影列表
  • u.data:用户给出的评分列表

包含等级的文件u.data是一个由选项卡分隔的用户ID, 项目ID, 等级和时间戳的列表。文件的前几行如下所示:

movielens 100k数据集的前五行

MovieLens前5行100k数据

如上所示, 该文件告诉用户对特定电影的评价。该文件包含100, 000个此类分级, 这些分级将用于预测用户看不到的电影的分级。

协同过滤涉及的步骤

要构建一个可以根据其他用户的偏好自动向用户推荐商品的系统, 第一步是查找相似的用户或商品。第二步是预测用户尚未评分的项目的评分。因此, 你将需要以下问题的答案:

  • 你如何确定哪些用户或项目彼此相似?
  • 假设你知道哪些用户相似, 你如何根据相似用户的评分来确定用户对该商品的评分?
  • 你如何衡量所计算的评分的准确性?

前两个问题没有一个答案。协作过滤是一类算法, 其中有多种查找相似用户或项目的方法, 以及多种基于相似用户的评分来计算评分的方法。根据你做出的选择, 最终会得到一种协作过滤方法。你将在本文中看到发现相似性和预测收视率的各种方法。

要记住的重要一件事是, 在一种完全基于协作过滤的方法中, 不使用用户年龄, 电影类型或有关用户或物品的任何其他数据等因素来计算相似度。它仅根据用户对项目的评分(显式或隐式)来计算。例如, 尽管年龄相差很大, 但如果两个用户对十部电影给予相同的评分, 就可以视为相似。

关于如何衡量预测准确性的第三个问题也有多个答案, 其中包括可以在许多地方使用的误差计算技术, 而不仅仅是基于协作过滤的推荐器。

衡量结果准确性的方法之一是均方根误差(RMSE), 你可以在其中预测其等级值已知的用户项目对的测试数据集的等级。已知值和预测值之间的差异将是误差。对测试集的所有误差值求平方, 找到平均值(或均值), 然后取该平均值的平方根即可得到RMSE。

衡量准确性的另一个指标是平均绝对误差(MAE), 你可以通过找到误差的绝对值, 然后取所有误差值的平均值来找到误差的大小。

你现在不必担心RMSE或MAE的详细信息, 因为它们可以作为Python各种程序包的一部分轻松获得, 你将在本文的后面看到它们。

现在, 让我们看一下协作过滤系列中不同类型的算法。

移除广告

基于内存

第一类包括基于内存的算法, 其中将统计技术应用于整个数据集以计算预测。

为了找到用户U将给项目I的评级R, 该方法包括:

  • 查找与U类似的用户, 他们对项目I进行了评分
  • 根据上一步中找到的用户的评分来计算评分R

你将在以下各节中详细了解它们。

如何基于等级查找相似用户

要了解相似性的概念, 我们首先创建一个简单的数据集。

数据包括对两个电影进行评级的四个用户A, B, C和D。评级存储在列表中, 每个列表包含两个数字, 指示每个电影的评级:

  • A的评分为[1.0, 2.0]。
  • B的评分为[2.0, 4.0]。
  • C的评分为[2.5, 4.0]。
  • D的评分为[4.5, 5.0]。

要从视觉线索开始, 请在图表上绘制用户给出的两部电影的等级, 然后寻找图案。该图如下所示:

在图形上绘制的点用于可视化欧几里得距离

在上图中, 每个点代表一个用户, 并根据他们对两部电影的评分进行绘制。

看点之间的距离似乎是估计相似性的好方法, 对吗?你可以使用两点之间的欧几里德距离公式来找到距离。你可以使用scipy中可用的功能, 如以下程序所示:

>>>

>>> from scipy import spatial

>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.euclidean(c, a)
2.5
>>> spatial.distance.euclidean(c, b)
0.5
>>> spatial.distance.euclidean(c, d)
2.23606797749979

如上所示, 你可以使用scipy.spatial.distance.euclidean计算两个点之间的距离。用它来计算A, B和D的等级与C的等级之间的距离, 向我们表明, 就距离而言, C的等级最接近B的等级。

你甚至可以通过查看图表来看到用户C与B最接近。但是, 仅在A和D中, C更接近谁?

你可以说C在距离上更接近D。但是从排名来看, 似乎C的选择会比A的选择更符合A, 因为A和C都喜欢第二部电影, 几乎是第一部电影的两倍, 但D都喜欢第二部电影一样。

那么, 你可以用什么来识别欧几里得距离无法做到的模式呢?将点连接到原点的线之间的角度可以用来做出决定吗?你可以查看将图形原点连接到各个点的直线之间的角度, 如下所示:

绘制在图形上的二维矢量将角度解释为距离度量

该图显示了将每个点连接到原点的四条线。 A和B的线是重合的, 使它们之间的角度为零。

你可以考虑, 如果线之间的角度增加, 则相似度减小;如果角度为零, 则用户非常相似。

要使用角度计算相似度, 你需要一个函数, 该函数针对较小的角度返回较高的相似度或较小的距离, 对于较大的角度返回较低的相似度或较大的距离。角度的余弦是随着角度从0增大到180而从1减小到-1的函数。

你可以使用角度的余弦值来查找两个用户之间的相似度。角度越高, 余弦越小, 因此用户的相似度越低。你还可以将角度的余弦值取反, 以通过减去1来获得用户之间的余弦距离。

scipy具有计算向量的余弦距离的功能。对于较大的角度, 它返回较高的值:

>>>

>>> from scipy import spatial
>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.cosine(c, a)
0.004504527406047898

>>> spatial.distance.cosine(c, b)
0.004504527406047898

>>> spatial.distance.cosine(c, d)
0.015137225946083022

>>> spatial.distance.cosine(a, b)
0.0

C和A的向量之间的较小角度会产生较小的余弦距离值。如果要以这种方式对用户相似度进行排名, 请使用余弦距离。

注意:在上述示例中, 仅考虑了两部电影, 这使得在二维中可视化评级向量变得更加容易。这样做只是为了使说明更容易。

具有多个项目的实际用例将在评级向量中涉及更多维度。你可能还想研究余弦相似度的数学。

请注意, 尽管评级不同, 但用户A和B在余弦相似性度量中被视为绝对相似。这实际上是现实世界中的普遍现象, 你可以将像用户A这样的用户称为强评分者。一个例子是电影评论家, 他总是给出低于平均水平的评分, 但其列表中项目的排名将类似于“平均评分者”(如B)。

要考虑这些个人用户的偏好, 你需要通过消除他们的偏见将所有用户提升到同一水平。你可以通过从该用户评分的每个项目中减去该用户对所有项目给出的平均评分来做到这一点。看起来像这样:

  • 对于用户A, 评级向量[1、2]的平均值为1.5。从每个等级中减去1.5, 将得出向量[-0.5, 0.5]。
  • 对于用户B, 评级向量[2, 4]的平均值为3。从每个评级中减去3将得到向量[-1, 1]。

这样, 你已将每个用户给定的平均评分值更改为0。尝试对用户C和D进行同样的评分, 你会发现现在已将评分调整为所有用户的平均评分为0 , 这使他们都处于同一水平, 并消除了他们的偏见。

调整后的向量之间的角度的余弦称为居中余弦。当向量中有很多缺失值, 并且你需要放置一个公共值来填充缺失值时, 通常使用这种方法。

用随机值填充评分矩阵中的缺失值可能会导致不准确。填充缺失值的一个不错的选择是每个用户的平均评分, 但是用户A和B的原始平均值分别为1.5和3, 并用1.5填充A的所有空白值, 用3填充B的所有空白值使他们成为不同的用户。

但是在调整值之后, 两个用户的居中平均值为0, 这使你可以更准确地捕获两个用户的项目高于或低于平均水平的想法, 并且两个用户向量中的所有缺失值都具有相同的值0。

欧几里得距离和余弦相似度是可以用来查找彼此相似的用户甚至彼此相似的项的一些方法。 (上面使用的函数计算余弦距离。要计算余弦相似度, 请从1中减去该距离。)

注意:居中余弦的公式与Pearson相关系数的公式相同。你会发现, 推荐程序上的许多资源和库都将中心余弦的实现称为Pearson Correlation。

移除广告

如何计算评分

确定与用户U相似的用户列表后, 需要计算U赋予特定项目I的等级R。同样, 就像相似度一样, 你可以通过多种方式进行。

你可以预测, 用户对某项I的评级R将接近最接近U的前5名或前10名用户对I的平均评级。由n个用户给出的平均评级的数学公式如下:像这样:

平均评分公式

该公式表明, n个相似用户给出的平均评分等于他们给出的评分之和除以相似用户的数量n。

在某些情况下, 你找到的n个相似用户与目标用户U不相同。前3个用户可能非常相似, 而其余用户可能不像前3个用户那样与U类似。 , 你可以考虑采用一种方法, 让最相似的用户的评分比第二最相似的用户重要得多, 依此类推。加权平均值可以帮助我们实现这一目标。

在加权平均法中, 你将每个评分乘以相似度因子(这表明用户的相似度)。通过与相似因子相乘, 可以将权重添加到评级中。重量越重, 评级就越重要。

用作权重的相似性因子应该是上述距离的倒数, 因为距离越短意味着相似性越高。例如, 你可以从1中减去余弦距离以获得余弦相似度。

在每个用户与目标用户U相似的相似因子S下, 你可以使用以下公式计算加权平均值:

加权平均评分的公式

在上面的公式中, 每个评分都乘以给出评分的用户的相似度。用户U的最终预测收视率将等于加权收视率之和除以权重之和。

注意:如果你想知道为什么将加权评级的总和除以权重之和而不是n, 请考虑以下问题:在平均值的上一个公式中, 用n除以权重的值是1。

在求平均值时, 分母始终是权重之和, 对于正常平均值, 权重为1表示分母等于n。

使用加权平均值, 你可以按照相似度的顺序来更多考虑相似用户的等级。

现在, 你知道了如何找到相似的用户, 以及如何根据他们的评分来计算评分。协作式过滤也有多种形式, 你可以通过查找彼此相似的项目(而不是用户)并计算评分来预测评分。你将在下一部分中了解这种变化。

基于用户的基于项目的协同过滤

上面说明的示例中的技术(其中评分矩阵用于根据相似用户给出的评分来查找相似用户)称为基于用户或用户-用户协作过滤。如果你使用评分矩阵根据用户给它们的评分来查找相似的项目, 则该方法称为基于项目或项目-项目协同过滤。

两种方法在数学上非常相似, 但是两者之间在概念上有所不同。这是两者的比较方式:

  • 基于用户:对于用户U, 根据一组由给定项目评分组成的评分向量确定的相似用户, 则通过从相似度中选择N个用户来找到未评分的项目I的评分列出对项目I进行评分并根据这N个评分计算评分的人。
  • 基于项目:对于一个项目I, 根据一组由接收到的用户评分组成的评分向量确定的相似项目, 通过从相似度中选择N个项目来找到未对其评分的用户U的评分列出已被U评分的列表, 并根据这N个评分来计算评分。

基于项目的协作过滤由亚马逊开发。在用户比项目多的系统中, 基于项目的筛选比基于用户的筛选更快, 更稳定。之所以有效, 是因为通常, 商品获得的平均评分不会像用户对不同商品的平均评分一样快地变化。当评分矩阵稀疏时, 与基于用户的方法相比, 它的效果也更好。

虽然基于项目的方法对于包含浏览​​或娱乐相关项目的数据集(例如MovieLens)的效果不佳, 但它给出的建议对于目标用户而言却非常明显。这样的数据集可以通过矩阵分解技术(在下一部分中看到)或混合推荐器(通过基于内容的过滤也考虑到类型等类型的数据)来获得更好的结果。

你可以使用Surprise库来快速尝试不同的推荐算法。 (你将在本文后面看到更多有关此内容的信息。)

移除广告

基于模型

第二类涵盖基于模型的方法, 其中涉及减少或压缩大型但稀疏的用户项矩阵的步骤。为了理解此步骤, 对降维的基本理解可能会很有帮助。

降维

在用户项目矩阵中, 有两个维度:

  1. 用户数
  2. 项目数

如果矩阵大部分是空的, 则减小维数可以在空间和时间方面提高算法的性能。你可以使用矩阵分解或自动编码器等各种方法来执行此操作。

矩阵分解可以看作是将大矩阵分解为较小矩阵的乘积。这类似于整数的因式分解, 其中12可以写为6 x 2或4 x3。在矩阵的情况下, 维数为mxn的矩阵A可以简化为维数为mxp的两个矩阵X和Y的乘积。和pxn。

注意:在矩阵乘法中, 仅当X中的列数等于Y中的行数时, 才可以将矩阵X乘以Y。因此, 两个归约矩阵的维数相同。

取决于用于降维的算法, 缩小矩阵的数量也可以大于两个。

简化后的矩阵实际上代表了用户和项目。第一个矩阵中的m行代表m个用户, p列告诉你用户的特征或特征。具有n个项目和p个特征的项目矩阵也是如此。这是矩阵分解的外观示例:

使用降维将矩阵分解为两个矩阵

矩阵分解

在上图中, 矩阵被简化为两个矩阵。左边的一个是具有m个用户的用户矩阵, 顶部的一个是具有n个项目的项目矩阵。等级4被降低或分解为:

  1. 用户向量(2, -1)
  2. An item vector (2.5, 1)

用户矩阵中的两列和项目矩阵中的两行称为潜在因子, 它们表示有关用户或项目的隐藏特征。分解的可能解释如下:

  • 假设在用户向量(u, v)中, u表示用户喜欢恐怖类型的程度, v表示他们喜欢浪漫类型的程度。
  • 用户矢量(2, -1)因此表示喜欢恐怖电影并对其进行正面评价并且不喜欢具有浪漫情节而对它们进行负面评价的用户。
  • 假设在项向量(i, j)中, i代表电影属于恐怖片的类别, j代表电影属于浪漫片的类别。
  • 电影(2.5, 1)的恐怖等级为2.5, 浪漫等级为1。使用矩阵乘法规则将其乘以用户向量可得到(2 * 2.5)+(-1 * 1)= 4。
  • 因此, 该电影属于恐怖类型, 用户本可以将其评级为5, 但浪漫的轻微收录导致最终评级降至4。

因子矩阵可以提供有关用户和项目的洞察力, 但实际上, 它们通常比上面给出的解释要复杂得多。这些因素的数量可以从一到数百甚至数千。这个数字是模型训练期间需要优化的事情之一。

在示例中, 你具有两个电影体裁的潜在因素, 但在实际场景中, 无需过多分析这些潜在因素。这些是数据中的模式, 无论你是否理解其基本含义, 它们都会自动发挥作用。

潜在因素的数量以某种方式影响建议, 其中因素的数量越大, 建议变得越个性化。但是太多的因素可能导致模型过度拟合。

注意:模型训练得很好以适合训练数据, 以至于新数据无法很好地发挥作用时, 就会发生过度拟合。

矩阵分解算法

分解矩阵的一种流行算法是奇异值分解(SVD)算法。当在Netflix奖项竞赛中看到矩阵分解表现出色时, SVD备受关注。其他算法包括PCA及其变体, NMF等。如果你要使用神经网络, 也可以将自动编码器用于降维。

你可以在各种适用于Python的库中找到这些算法的实现, 因此此时无需担心细节。但是, 如果你想了解更多信息, 则值得阅读《大规模数据集的挖掘》一书中的降维章节。

移除广告

使用Python构建推荐器

Python中有很多库和工具包, 它们提供了可用于构建推荐程序的各种算法的实现。但是, 你在理解推荐系统时应该尝试的方法是“惊喜”。

Surprise是一个Python SciKit, 具有各种推荐程序算法和相似性度量标准, 可轻松构建和分析推荐程序。

以下是使用pip进行安装的方法:

$ pip install numpy
$ pip install scikit-surprise

以下是使用conda进行安装的方法:

$ conda install -c conda-forge scikit-surprise

注意:如果你希望遵循示例, 也建议安装Pandas。

要使用Surprise, 你首先应该了解其中的一些基本模块和类:

数据集模块用于从文件, Pandas数据框甚至可用于实验的内置数据集中加载数据。 (MovieLens 100k是Surprise中的内置数据集之一。)要加载数据集, 一些可用的方法是:

  • 数据集.load_builtin()
  • 数据集.load_from_file()
  • 数据集.load_from_df()

Reader类用于解析包含等级的文件。接受数据的默认格式是, 每个定额都存储在订单用户项目定额中的单独行中。可以使用以下参数配置此顺序和分隔符:

line_format

是一个

存储字段名称用空格分隔的数据顺序, 如

“项目用户评分”

.

九月

用于指定字段之间的分隔符, 例如

‘, ‘

.

rating_scale

用于指定评分等级。默认是

(1, 5)

.

skip_lines

用于指示文件开头要跳过的行数。默认是

0

.

这是一个程序, 可用于从Pandas数据框或内置的MovieLens 100k数据集中加载数据:

# load_data.py

import pandas as pd
from surprise import Dataset
from surprise import Reader

# This is the same data that was plotted for similarity earlier
# with one new user "E" who has rated only movie 1
ratings_dict = {
    "item": [1, 2, 1, 2, 1, 2, 1, 2, 1], "user": ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E'], "rating": [1, 2, 2, 4, 2.5, 4, 4.5, 5, 3], }

df = pd.DataFrame(ratings_dict)
reader = Reader(rating_scale=(1, 5))

# Loads Pandas dataframe
data = Dataset.load_from_df(df[["user", "item", "rating"]], reader)
# Loads the builtin Movielens-100k data
movielens = Dataset.load_builtin('ml-100k')

在上面的程序中, 数据存储在字典中, 该字典先加载到Pandas数据框中, 然后再从Surprise中加载到Dataset对象中。

基于K最近邻(k-NN)的算法

推荐功能的算法选择取决于你要使用的技术。对于上面讨论的基于内存的方法, 适合该账单的算法是居中的k-NN, 因为该算法非常接近上述居中的余弦相似度公式。在Surprise中可以使用KNNWithMeans的形式。

为了找到相似之处, 你只需通过将字典作为参数传递给推荐函数来配置函数。字典应具有所需的键, 例如:

name

包含要使用的相似性指标。选项是

余弦

,

MSD

,

皮尔逊

, 要么

pearson_baseline

。默认是

MSD

.

基于用户

是一个

布尔值

告诉该方法是基于用户还是基于项目。默认是

真正

, 这意味着将使用基于用户的方法。

min_support

是用户之间考虑相似性所需的最少公共项目数。对于基于项目的方法, 这对应于两个项目的最小公共用户数。

以下程序配置KNNWithMeans函数:

# recommender.py

from surprise import KNNWithMeans

# To use item-based cosine similarity
sim_options = {
    "name": "cosine", "user_based": False, # Compute  similarities between items
}
algo = KNNWithMeans(sim_options=sim_options)

上面程序中的推荐器功能配置为使用余弦相似度, 并使用基于项目的方法查找相似项目。

要试用此推荐程序, 你需要根据数据创建一个Trainset。 Trainset是使用相同的数据构建的, 但包含有关数据的更多信息, 例如算法使用的用户和项目数(n_users, n_items)。你可以使用全部数据或部分数据来创建它。你还可以将数据划分为折叠, 其中一些数据将用于训练, 而另一些数据将用于测试。

注意:仅使用一对训练和测试数据通常是不够的。当你将原始数据集拆分为训练和测试数据时, 你应该创建多个对, 以允许在测试数据的训练中进行多种观察。

算法应使用多重折叠进行交叉验证。通过使用不同的配对, 你将看到推荐人给出的不同结果。 MovieLens 100k提供了五种不同的训练和测试数据:u1.base, u1.test, u2.base, u2.test…u5.base, u5.test, 进行5倍交叉验证

这是一个示例, 以了解用户E如何评价电影2:

>>>

>>> from load_data import data
>>> from recommender import algo

>>> trainingSet = data.build_full_trainset()

>>> algo.fit(trainingSet)
Computing the cosine similarity matrix...
Done computing similarity matrix.
<surprise.prediction_algorithms.knns.KNNWithMeans object at 0x7f04fec56898>

>>> prediction = algo.predict('E', 2)
>>> prediction.est
4.15

该算法预测用户E将对电影4.15进行评分, 该电影可能足够高, 可以作为推荐显示。

你应该尝试使用基于k-NN的不同算法以及Surprise库中可用的不同相似性选项和矩阵分解算法。在MovieLens数据集上尝试使用它们, 看看是否可以击败一些基准测试。下一节将介绍如何使用Surprise来检查哪些参数最适合你的数据。

调整算法参数

Surprise提供了一个类似于scikit-learn的GridSearchCV的GridSearchCV类。

借助所有参数的决定, GridSearchCV尝试所有参数组合并报告任何精度测量的最佳参数

例如, 你可以使用基于内存的方法来检查哪种相似性指标最适合你的数据:

from surprise import KNNWithMeans
from surprise import Dataset
from surprise.model_selection import GridSearchCV

data = Dataset.load_builtin("ml-100k")
sim_options = {
    "name": ["msd", "cosine"], "min_support": [3, 4, 5], "user_based": [False, True], }

param_grid = {"sim_options": sim_options}

gs = GridSearchCV(KNNWithMeans, param_grid, measures=["rmse", "mae"], cv=3)
gs.fit(data)

print(gs.best_score["rmse"])
print(gs.best_params["rmse"])

上面程序的输出如下:

0.9434791128171457
{'sim_options': {'name': 'msd', 'min_support': 3, 'user_based': False}}

因此, 对于MovieLens 100k数据集, 如果你采用基于项目的方法, 并使用msd作为最少支持3的相似性度量标准, 则Centered-KNN算法效果最佳。

同样, 对于基于模型的方法, 我们可以使用Surprise来检查以下因素中哪个值最有效:

  • n_epochs是SGD的迭代次数, 它基本上是统计信息中用于最小化函数的迭代方法。
  • lr_all是所有参数的学习率, 这是一个决定每次迭代中调整多少参数的参数。
  • reg_all是所有参数的正则项, 这是为防止过度拟合而增加的惩罚项。

注意:请记住, 矩阵因素分解算法中不会包含任何相似性指标, 因为潜在因素会影响用户或项目之间的相似性。

以下程序将检查SVD算法(矩阵分解算法)的最佳值:

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import GridSearchCV

data = Dataset.load_builtin("ml-100k")

param_grid = {
    "n_epochs": [5, 10], "lr_all": [0.002, 0.005], "reg_all": [0.4, 0.6]
}
gs = GridSearchCV(SVD, param_grid, measures=["rmse", "mae"], cv=3)

gs.fit(data)

print(gs.best_score["rmse"])
print(gs.best_params["rmse"])

上面程序的输出如下:

0.9642278631521038
{'n_epochs': 10, 'lr_all': 0.005, 'reg_all': 0.4}

因此, 对于MovieLens 100k数据集, 如果你使用10个时期并使用0.005的学习率和0.4的正则化, 则SVD算法最有效。

Surprise中可用的其他基于矩阵分解的算法是SVD ++和NMF。

在这些示例之后, 你可以深入研究这些算法中可以使用的所有参数。你绝对应该检查一下它们背后的数学。由于你一开始就不必担心算法的实现, 因此推荐程序可以成为探索机器学习领域并基于此构建应用程序的好方法。

什么时候可以使用协作过滤?

协作筛选围绕用户与项目的交互进行工作。这些互动可以帮助你找到商品或用户本身无法获得的模式。以下几点可以帮助你确定是否可以使用协作过滤:

  • 协作过滤不需要了解有关项目或用户的功能。它适用于一组不同类型的项目, 例如, 超市的库存中可以添加各种类别的项目。但是, 在诸如书店这样的一组类似项目中, 诸如作家和流派之类的已知功能可能会有用, 并且可能会受益于基于内容的方法或混合方法。
  • 协作过滤可以帮助推荐者不要在用户的个人资料中过分专业化, 并且推荐与他们之前所见完全不同的项目。如果你不希望推荐人向刚购买另一双类似运动鞋的人推荐一双运动鞋, 那么请尝试在推荐人法术中添加协作式过滤。

尽管协作式过滤在推荐者中非常常用, 但是在使用协作式过滤时面临的一些挑战如下:

  • 协作过滤可能会导致一些问题, 例如添加到列表中的新项目的冷启动。除非有人给他们评分, 否则他们不会被推荐。
  • 数据稀疏性可能会影响基于用户的推荐者的质量, 并且还会增加上述冷启动问题。
  • 由于复杂性可能变得太大, 因此缩放对于成长数据集可能是一个挑战。当数据集很大时, 基于项目的推荐器比基于用户的推荐器快。
  • 通过简单的实现, 你可能会发现建议已经很流行, 长尾部分中的内容可能会被忽略。

每种类型的推荐器算法都有自己的优缺点列表, 通常是一种混合型推荐器, 可助你一臂之力。多种算法一起工作或在管道中的好处可以帮助你设置更准确的推荐程序。实际上, Netflix奖获得者的解决方案也是多种算法的复杂组合。

结论

现在, 你知道什么计算将进入协作过滤类型推荐器, 以及如何在数据集中快速尝试各种类型的算法, 以查看协作过滤是否可行。即使它似乎不能高精度地适合你的数据, 所讨论的一些用例也可能会帮助你长期以混合方式计划事情。

这是一些资源, 可用于更多实现, 并进一步阅读协作过滤和其他推荐算法。

库:

  • LightFM:Python中的混合推荐算法
  • Python-recsys:用于实现推荐系统的Python库

调查报告:

  • 基于项目的协作过滤推荐算法:关于基于项目的推荐者的第一篇论文
  • 使用协作过滤来编织信息挂毯:协作过滤一词的首次使用
微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?