作者|James Loy
编译|VK
博客| https://towardsdatascience.com/deep-learning-based-recommender-systems-3d120201db7e
传统的推荐系统基于聚类、最近邻和矩阵分解等方法。然而,近年来,深度学习在从图像识别到自然语言处理等多个领域取得了巨大的成功。推荐系统也得益于深度学习的成功。事实上,如今最先进的推荐系统,比如Youtube和Amazon的推荐系统,都是由复杂的深度学习系统驱动的,而不是传统方法。
本教程
在阅读了许多有用的教程,这些教程介绍了使用诸如矩阵分解等传统方法的推荐系统的基础知识,但我注意到,缺乏介绍基于深度学习的推荐系统的教程。在本教程中,我们将介绍以下内容:
- 如何使用PyTorch Lightning创建自己的基于深度学习的推荐系统
- 推荐系统中隐式反馈与显式反馈的区别
- 如何在不引入偏差和数据泄漏的情况下训练测试分割数据集以训练推荐系统
- 评估推荐系统的指标(提示:准确度或RMSE不合适!)
数据集
本教程使用MovieLens 20M数据集提供的电影评论,这是一个流行的电影评分数据集,包含1995年至2015年收集的2000万部电影评论。
如果你想查看本教程中的代码,可以查看我的Kaggle Notebook,在这里你可以运行代码,并在本教程中查看输出:https://www.kaggle.com/jamesloy/deep-learning-based-recommender-systems
利用隐式反馈构建推荐系统
在我们建立模型之前,重要的是要理解隐式反馈和显式反馈之间的区别,以及为什么现代推荐系统是建立在隐式反馈的基础上的。
显式反馈
在推荐系统中,显式反馈是从用户那里收集的直接的、定量的数据。例如,亚马逊允许用户对购买的商品进行1-10的评分。这些评分是直接由用户提供的,这个评分标准允许亚马逊量化用户的偏好。另一个明确反馈的例子包括YouTube上的赞/踩按钮,它捕捉用户对特定视频的明确偏好(即喜欢或不喜欢)。
然而,显式反馈的问题是它们很少。如果你仔细想想,你上一次点击YouTube视频上的“喜欢”按钮,或者对你的网上购物进行评级是什么时候?很可能你在YouTube上观看的视频数量远远大于你明确评级的视频数量。
隐性反馈
另一方面,隐式反馈是从用户交互中间接收集的,它们充当用户偏好的代理。例如。你在YouTube上观看的视频被用作隐式反馈,为你量身定做推荐,即使你没有明确地给视频打分。另一个隐含反馈的例子包括你在亚马逊上浏览过的商品,这些商品用来为你推荐其他类似的项目。
隐性反的优点在于它是丰富的。使用隐式反馈构建的推荐系统还允许我们通过每次点击和交互实时定制推荐。今天,在线推荐系统是使用隐式反馈构建的,它允许系统在每次用户交互时实时调整其推荐。
数据预处理
在开始构建和训练我们的模型之前,让我们做一些预处理,以获得所需格式的MovieLens数据。
为了保持30%的数据在用户可管理的范围内使用,我们将只使用30%的数据集。让我们随机选择30%的用户,并且只使用所选用户的数据。
import pandas as pd
import numpy as np
np.random.seed(123)
ratings = pd.read_csv('rating.csv', parse_dates=['timestamp'])
rand_userIds = np.random.choice(ratings['userId'].unique(),
size=int(len(ratings['userId'].unique())*0.3),
replace=False)
ratings = ratings.loc[ratings['userId'].isin(rand_userIds)]
过滤数据集之后,现在有来自41547个用户的6027314行数据(这仍然是大量数据!)。数据帧中的每一行都对应于单个用户的电影评论,如下所示。

训练测试拆分
除了评级之外,还有一个时间戳列,显示提交评审的日期和时间。使用timestamp列,我们将使用留一法实现我们的训练测试分割策略。对于每个用户,最新的评分被用作测试集(即,测试集样本数为1),而其余的将用作训练数据。
为了说明这一点,用户39849审查的电影如下所示。用户评论的最后一部电影是2014年热映的《银河守护者》。我们将使用这部电影作为该用户的测试数据,并将其余已审查的影片用作训练数据。

在训练和评估推荐系统时,经常使用这种训练-测试分割策略。做一个随机的分割