上一篇文章咱们介绍了引荐体系:依据内容的过滤,能够依据产品元数据核算的,供给制定引荐的挑选,引荐与用户过往购买过的产品相关性最类似的产品,今天咱们来聊聊如何通过运用用户和产品之间的类似性供给主张的办法。
协同过滤是一种运用用户和产品之间的类似性供给主张的办法。协同过滤剖析类似的用户或类似评级的产品,并依据此剖析引荐用户。
协同过滤分为3个小标题:
- 依据Item的协同过滤
- 依据用户的协同过滤
- 依据模型的协同过滤
依据Item的协同过滤
这种办法是一种剖析产品类似度或用户对产品的点评,并依据剖析成果提出主张的办法。
下表显现了 m 个用户对 n 部电影的评分。咱们想向看过并喜爱《斯普利特》的用户引荐一部与《斯普利特》收视率类似的电影。
在这种状况下,可认为该用户引荐 Film 4,这是一部与 Split 具有类似取向(一起喜爱和不喜爱)的电影。
示例:
一家在线电影平台想要开发一个依据协同过滤的引荐体系,以满意其用户集体的需求和定见。当用户喜爱一部电影时,该体系将依据类似的喜爱模式,向用户引荐其他类似的电影。这样做旨在供给更符合用户口味的引荐服务。
关于数据集:
电影:
- movieId:电影的id
- title:电影的标题
评分:
- userId:用户的id
- movieId:电影的id
- score:用户对电影的评分
- time:评分的时间戳
您能够在此处找到数据集。关于这个项目,咱们将在“电影”上合并“电影”和“评分”数据集。
在项目开始时,数据集被读取并合并。您能够查看项意图完整代码。
创立用户电影数据框:
在这一步中,咱们将创立用户电影数据框,但咱们不期望其中存在稀少性。例如,假定用户只对一部电影进行了评分。即使对 1 部电影进行了评分,该用户也会在 User-Movie 数据框中的一切其他电影中各占一个单元格。这会推迟要进行的核算并导致性能问题。为了防止这些核算问题并防止极少数用户观看的电影被包括在引荐中,应该做一些减缩进程。
减缩进程完成后,将创立一个数据透视表,行中包括“userId”,列中包括“title”,交会集包括“rating”。
在 User-Movie 数据框中,假如用户没有对电影进行评分,则其交集处的单元格由 NaN 表示。
依据item的电影猜测:
因为已创立用户电影矩阵,因而能够通过查看电影之间的相关性来找到电影与其他电影之间的类似性。
随机挑选电影后,核算这部电影与其他电影的相关性。能够引荐具有高相关性的电影,这意味着已经引荐了表现出与这部电影类似行为的电影。
也能够手动挑选和查看电影。您能够运用下面的代码片段按关键字进行搜索,以获取数据会集电影的全名。
依据用户的协同过滤
协同过滤是一种剖析用户的行为(喜爱-今日头条早期的引荐体系)并依据表现出类似行为的用户的喜爱供给主张的办法。
该表显现了 m 个用户对 n 部电影的评分。用户未观看的电影的评分留空。需求引荐与用户3类似而且他或许喜爱的电影。为此,首要应该找到表现出类似行为的用户。可见,在用户3点评的电影中表现出类似行为的用户为用户2,则挑选用户2喜爱但用户3没有看过的电影3进行引荐。作为这个主张的成果,估量用户 3 会喜爱这部电影。
示例:
在这个项目中,将运用依据item的协同过滤中运用的相同数据集。将对在依据项意图项目中创立的用户电影数据框履行操作。这是项意图完整代码,用于查看数据集的进程并创立数据框。
确认引荐用户观看的电影:
用户是随机挑选的。在这个挑选之后,应该为这个用户削减运用电影数据框。这样就能够确认该用户看过的电影。
通过len(movies_watched),发现random_user观看了33部电影。
访问观看同一部电影的其他用户:
在这一步,咱们首要需求找出其他用户与随机用户一起观看了多少部电影。
在这一点上,咱们需求一个约束,因为只用 random_user 看过 1 或 2 部普通电影的用户不会成为引荐进程的标准。
辨认与要主张的用户具有最类似行为的用户
这将分 3 个进程完成:
第 1 步:聚合 random_user 和其他用户的数据
第 2 步:创立关联数据框
第 3 步:找到最类似的用户(顶级用户)
在前一阶段找到的值是一切用户的相关值。意图是覆盖与 random_user 具有高相关性的用户。因而,挑选相关性高于 0.65 的用户。
核算加权平均引荐分数:
假如依照等级排序,就会疏忽相关性的影响,假如依照相关性排序,就会疏忽等级的影响。为了防止这种状况并一起看到两者的影响,将通过将这两个值相乘得到一个名为“weighted_rating”的新变量,并依据该变量进行排序。
以这种方式,能够向用户做出像上面那样的引荐,一起考虑到相关性和评级。
依据模型的协同过滤(矩阵分解)
在依据模型的协同过滤中,更全面地处理了这个问题。假定有一个问题需求优化。
方针是猜测并填充 m 个用户和 n 部电影矩阵中标记为 BLANK 的单元格。
为了填补空白,假定用户和电影存在的“潜在特征”的权重是在现有数据上找到的,并用这些权重对不存在的调查成果进行猜测。
User-Movie 矩阵被分解为 2 个维数更少的矩阵。假定从 2 矩阵到 User-Movie 矩阵的转化发生在潜在要素下。潜在要素的权重在填充的调查成果中找到,空的调查成果用找到的权重填充。
为了更清楚地理解这个进程,通过一个例子会很有用。
咱们有一个像上面那样的用户电影矩阵,咱们想在这儿估量空值。首要,咱们将其分为 2 个维数较低的矩阵,分别是用户因子和电影因子。
在这一点上,潜在要素对填充调查的权重应该如下所示:
一切 p 和 q 值都是在现有值上迭代找到的,然后运用。最初,它测验猜测随机 p 和 q 值以及评分矩阵中的值。在每次迭代中,都会组织过错的估量,并测验挨近评级矩阵中的值。因而,作为特定迭代的成果,p 和 q 矩阵被填充。
要了解猜测是好是坏,需求一个通用的衡量标准。为此,将一切估量值与实践值之间的差异的平方相加,然后求平方根,然后求平均值(RMSE 和 MSE 值)。这为咱们供给了有关一切数据的信息。通过这种方式,咱们能够获得有关咱们在研讨开始时依据分配给用户和电影矩阵的值所做的猜测的平均差错的信息。更新 p 和 q 值以最小化此过错。
矩阵分解的梯度下降:
找到 p 和 q 权重的一种办法是运用梯度下降法。梯度下降是一种用于函数最小化的优化办法。
参数值在“最速下降”(定义为梯度的负值)的方向上迭代更新,并找到将给出相关函数最小值的参数。
这儿,p 和 q 矩阵中的权重依据导数交换。函数在一点的导数给出了该函数添加的最大方向。当迭代地沿着定义为梯度的负方向,即与添加方向相反时,更新参数值以最小化相关函数。
示例:
在这个协同过滤的终究项目中,将运用在依据项目和依据用户的协同过滤中运用的相同数据集。这是查看数据集进程的项意图完整代码。
资料预备:
在可追溯性方面,我会依据这 4 部电影及其 id 来减缩数据集,并从减缩后的数据会集创立用户电影数据框。
因为本项目要用到surprise库,而且有其特别的数据结构,movie_user_df需求转化成这种特别的结构。
建模:
关于建模进程,首要应将数据分为练习集和测验集,份额为 75% 和 25%。然后应该创立 SVD 的模型目标,并用练习集履行拟合操作。接下来,应该在测验集上测验模型。
RMSE 衡量或许更适合评估猜测的平均差错。
userId为1.0,movieId为541的watch单元的实践评分值如下。
当咱们用咱们为同一个调查单元树立的模型进行猜测时,咱们得到了 4.33 的评分:
模型调整:
在这一步中,会进行模型的优化,也就是咱们会测验添加模型的猜测性能。这将通过超参数优化来完成。
考虑到理论部分评论的公式,超参数是 epoch、潜在因子、学习率和 。关于超参数优化,咱们将定义 epoch 和学习率的参数集如下。然后,通过运用 GridSearchCV 测验这些或许的参数集,核算纪元和学习率组合的平均差错,这将给出或许的最低平均差错。
终究模型和猜测:
模型的默认值和咱们用 GridSearchCV 找到的最佳参数彼此不同。因而,有必要运用这些最佳参数重新创立 SVD 模型目标。
到目前为止,咱们已经将数据划分为练习集和测验集,查看过错并优化超参数。假如模型树立在更大的数据之上,则能够进行更好的学习。因而,模型将树立在一切数据之上。
建模进程中userId-movieId对的猜测进程:
在建模进程中,userId 为 1.0 和 movieId 为 541 的猜测值为 4.33。通过超参数优化后,能够看到新的猜测是 4.23。超参数优化后,猜测进程已履行到更挨近实践值 (4.00),即差错已削减。
由此发生的优化模型供给了对所需的user-movie对进行猜测的或许性。做出相关猜测后,就能够对电影进行筛选了。向这些用户引荐对某些用户具有猜测高收视率的电影。















