使用TensorFlow和Keras构建推荐系统
这是一个使用TensorFlow Recommenders和Keras开发实用推荐系统(检索
和排序
任务)并使用TensorFlow Serving部署的分步教程。
在这里,你可以找到关于信息检索和推荐系统的介绍,然后你可以探索Jupyter笔记本并在Google Colab中运行它以学习代码。
在笔记本中,我们使用TesorFlow Datasets加载MovieLens数据集,使用Keras预处理层预处理其特征,使用TensorFlow Recommenders构建检索
和排序
任务,并使用Spotify Annoy对相似项目进行索引和搜索。
本教程推荐给学术和行业爱好者。
简介
什么是推荐系统?
在线服务通常提供数千、数百万甚至数十亿的项目,如产品、视频片段、电影、音乐、新闻、文章、博客帖子、广告等。例如,Google Play商店提供数百万的应用程序,而YouTube提供数十亿的视频。[1]
然而,用户更喜欢看到一个简短的可能感兴趣的项目列表,而不是在完整的语料库中挣扎。他们通常可以搜索或过滤列表以找到最佳的几个项目,但有时他们甚至不知道自己真正想要什么(例如生日礼物)。在实体店中,专业销售员会通过有用的推荐来帮助解决这种情况。那么,为什么在在线商店中不这样做呢?
推荐系统可以检索、过滤并推荐最适合用户的个性化结果——用户可能会购买的结果。因此,它是现代企业提高转化率
的主要要求之一。2009年9月21日,Netflix向一个团队颁发了100万美元的大奖,该团队的算法在预测评分方面比Netflix自己的算法提高了10.06%。[2]
推荐系统是一个根据查询(上下文)
(即我们所知道的喜好列表)来过滤语料库(完整的项目目录)并生成候选项
(项目、文档)简短列表的系统。查询(上下文)可以是用户ID、用户的地理位置或用户的历史购买记录,而生成的候选项可以是我们猜测用户可能感兴趣的一些新项目。
查询也可以是项目ID、其图像或其文本描述,而候选项可以是语料库中的一些相似或相关项目。
推荐阶段(任务)
在实践中,处理大型语料库并将其过滤成简短列表是一项难以处理且效率低下的任务。因此,实际的推荐系统通常有两个(或三个)过滤阶段:
- 检索(候选生成)
- 排序(评分)
- 重新排序或优化等
基于内容的过滤与协同过滤
过滤项目是基于相似性的。我们可以基于相似的候选项(基于内容的过滤
)或基于查询和候选项之间的相似性(协同过滤
)来过滤列表。协同过滤算法通常比基于内容的方法表现更好。
### 查询或候选项的表示
查询或候选项有许多不同的特征。例如,查询可以由以下特征构成:
- 用户ID
- 用户历史记录
- 用户职业
- 等等
而候选项可以具有如下特征:
- 项目描述
- 项目图片
- 项目价格
- 发布时间
- 等等
这些明显的特征可以是"数值变量"、"分类变量"、"位图"或"原始文本"。然而,这些低级特征还不够,我们应该从这些明显特征中提取一些更抽象的"潜在特征",以将查询或候选项表示为数值型高维向量 - 即"嵌入向量"。
"矩阵分解"(MF)是一种经典的协同过滤方法,用于从"用户ID"、"项目ID"和"评分"特征中学习一些"潜在因子"(潜在特征),并用潜在(嵌入)向量表示用户和项目。
矩阵分解方法只使用"用户ID"和"候选项ID"特征协同学习"潜在特征"。事实上,它并不关心其他侧面特征,如"候选项描述"、"价格"、"用户评论"等。
为了在学习潜在特征(嵌入)时同时涉及侧面特征和ID,我们可以使用深度神经网络(DNN)架构,如"softmax"或"双塔"神经模型。
YouTube的双塔神经模型使用侧面特征将查询和候选项表示为抽象的高维嵌入向量。
Movielens数据集
"Movielens"数据集是推荐系统研究领域的一个基准数据集,包含一组用户对电影的评分,这些数据收集自MovieLens网站 - 一个电影推荐服务。
Movielens有5个不同版本可用于不同目的:"25m"、"latest-small"、"100k"、"1m"和"20m"。在本教程中,我们将使用"100k"版本。有关不同版本的更多信息,请访问官方网站。
movielens/100k-ratings
MovieLens数据集的最早版本,包含943名用户对1,682部电影的100,000条评分。每个用户至少对20部电影进行了评分。评分以整星增量给出。除了电影和评分数据外,该数据集还包含用户的人口统计数据。
movielens/100k-movies
这个数据集包含movielens/100k-ratings数据集中被评分的1,682部电影的数据。
探索Jupyter笔记本
捐赠
如果这个项目对你有帮助,请给个⭐!