Press "Enter" to skip to content

系统设计:使用Scala、Spark和Hadoop构建推荐系统

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

推荐系统是一种广泛使用的机器学习技术,在电子商务(亚马逊、阿里巴巴)、视频流(Netflix、Disney+)、社交网络(Facebook、Linkedin)和许多其他领域都有很多应用。由于这些服务中的数据量很大,现在大多数行业级推荐系统都是建立在 Spark 和 Hadoop 等大数据框架中的。因此,在这篇博客中,我想向您展示我是如何使用 Scala、Spark 和 Hadoop 构建电影推荐系统的。

 

目录

目录
一、推荐系统介绍

1.1 不同的推荐系统算法
1.2 协同过滤和 Spark ALS

2.系统设置
3. 数据集
4. 在 Spark 中运行

4.1 从 Github 克隆代码
4.2 准备HDFS中的数据
4.3 Spark中训练推荐模型
4.4 在 Spark 中生成推荐

5. 在 Databricks 中运行 PySpark 版本
6.推荐系统设计
7. 实施

7.1 训练 ALS 模型 -RecommenderTrain.scala

7.1.1prepareData
7.1.2ALS.train
7.1.3saveModel

7.2 生成推荐 -Recommend.scala

7.2.1prepareData
7.2.2MatrixFactorizationModel.load
7.2.3model.recommendProducts
7.2.4model.recommendUsers

推荐系统介绍

 

推荐系统算法可以分为两大类:基于内容的推荐和协同过滤。

基于内容的推荐

利用产品特征向用户推荐与之前喜欢的产品相似的产品。

 

如果人 P1 和人 P2 对产品 D1 有相同的看法,那幺 P1 对产品 D2 的看法与 P2 的看法相同的可能性比与随机选择的人 Px 的看法相同。

 

适合新闻/文章推荐

 

好处:

 

 

    1. – 该模型不需要任何用户数据输入,因此更容易扩展。- 能够通过特征工程捕捉小众物品。

 

 

缺点:

 

 

    1. – 需要领域知识。

 

    1. – 扩展用户兴趣的能力有限。

 

协同过滤

通过收集许多其他用户的偏好信息来预测用户的兴趣。

 

如果一个人喜欢具有一系列属性的产品D1,他/她更有可能喜欢具有这些属性的产品D2,而不是没有这些属性的产品D3。

 

应用:电影推荐,亚马逊产品推荐

 

优点:

 

 

    1. – 不需要领域知识,高度可转移的模式。

 

    1. – 能够帮助用户发现新的兴趣。

 

 

缺点:

 

 

    1. – 冷启动问题:需要用现有的数据工作,不能处理新的项目/用户。

 

    1. – 难以扩展项目的功能。

 

 

协同过滤和Spark ALS

 

在这篇文章中,我们将使用协同过滤作为推荐算法。

 

协同过滤的工作原理是这样的。

 

首先,我们把所有用户对所有物品的评分看作是一个矩阵,

 

这个矩阵可以被因子化为两个独立的矩阵,一个是用户矩阵,行代表用户,列代表潜在因素;

 

另一个是物品矩阵,行是潜在因素,列代表物品。

 

在这个因式分解过程中,评分矩阵中的缺失值可以被填补,作为用户对物品评分的预测,然后我们可以用它们来给用户推荐。

 

ALS(交替最小二乘法) 是协同过滤的数学优化实现,它使用带有加权拉姆达正则化 (ALS-WR) 的交替最小二乘法 (ALS) 来找到最小二乘预测和实际评级之间的最小二乘的最佳因子权重。 Spark 的 MLLib 包 有一个 内置的 ALS 功能 ,我们将在这篇文章中使用它。

 

系统设置

Ubuntu 20.04.3
JDK 11.0.13
Scala 2.12.11
Spark 3.2.0
Hadoop 3.2.2
IntelliJ IDEA (2021.3.1)

数据集

 

在这个项目中,我们将使用来自明尼苏达大学双城分校的 MovieLens 数据集。 您可以通过运行以下命令下载ml-100k (4.7M):

 

wget https://files.grouplens.org/datasets/movielens/ml-100k.zip

 

运行以下命令解压缩 zip 文件:

 

unzip ml-100k.zip

 

您将看到解压缩ml-100k的文件夹包含多个文件。

 

我们主要使用两个数据文件:

u.data:用户评分数据,包括用户id、物品id、评分、时间戳。
u.item:电影数据,包括项目id、电影名称、上映日期、imdb url等。

在 Spark 中运行

 

在 Spark 中运行之前,请使用以下命令将代码从我的 Github 存储 库克隆到您的本地目录:

 

git clone https://github.com/haocai1992/MovieRecommender.git

 

准备HDFS中的数据

 

在我们开始之前,我们需要在终端中启动 hadoop HDFS 和 YARN 服务)。

 

$ hadoop namenode -format $ start-all.sh

 

然后我们需要将 ml-100k 数据集上传到 Hadoop HDFS:

 

$ hadoop fs -put ~/Downloads/ml-100k /user/caihao/movie

 

Spark中训练推荐模型

 

使用以下方法在 Spark 中训练推荐模型:

 

$ spark-submit --driver-memory 512m --executor-cores 2 --class RecommenderTrain --master yarn --deploy-mode client ~/Desktop/spark_test/MovieRecommender/out/artifacts/MovieRecommender_jar/MovieRecommender.jar

 

使用以下命令检查您在 HDFS 中训练的模型:

 

$ hadoop fs -ls -h /user/caihao/movie

 

在 Spark 中生成推荐

 

使用以下方法在 Spark 中推荐电影:

 

$ spark-submit --driver-memory 512m --executor-cores 2 --class Recommend --master yarn --deploy-mode client ~/Desktop/spark_test/MovieRecommender/out/artifacts/MovieRecommender_jar2/MovieRecommender.jar --U 100

 

在 Databricks 中运行 PySpark 版本

 

如果你不了解 Scala,我还创建了一个 Python 版本的推荐系统!它使用 PySpark 并在 Databricks 上运行。

 

在此处检查我的代码: 我的 Databricks 笔记本

 

推荐系统设计

 

我们的系统设计如下。

 

 

有两个 Scala 对象:

RecommenderTrain.scala:读取评级文件(u.data),准备数据,训练 ALS 模型并保存模型。
Recommender.scala:读取电影文件(u.item),加载 ALS 模型,生成电影推荐。

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。