点击上方关注,All in AI中国

surprise怎么记好(手把手教你用Surprise建立)(1)

在Python和Surprise Library,Collaborative Filtering的帮助下学习如何构建自己的推荐引擎

推荐系统是数据科学中最常用和易于理解的应用之一。由于互联网的快速发展和信息过载问题,我们已经在这一领域已经做了大量的工作,对这方面的兴趣和需求也仍然很高。帮助用户处理信息过载并向他们提供个性化的推荐、内容和服务,已经成为网上商务的一部分。

接近推荐系统的两种最流行的方法是协同过滤和基于内容的推荐。在这篇文章中,我们将重点关注协同过滤方法,即:用户是具有相似品味和喜好的人在过去喜欢的推荐项目。换句话说,该方法通过使用用户之间的相似性来预测未知评级。

我们将使用Book-Crossing,一个用于开发推荐系统算法的书籍评级数据集,以及由Nicolas Hug建立的Surprise库。

数据

Book-Crossing数据包括三个表,我们将使用其中两个:users表和book rating表。

surprise怎么记好(手把手教你用Surprise建立)(2)

surprise怎么记好(手把手教你用Surprise建立)(3)

图1

EDA

评级分布

surprise怎么记好(手把手教你用Surprise建立)(4)

ratings_distribution.py

surprise怎么记好(手把手教你用Surprise建立)(5)

图2

我们可以看到,数据中超过62%的评级为0,很少有评级为1或2或3,低评级书籍意味着它们通常非常糟糕。

按书进行评级分布

surprise怎么记好(手把手教你用Surprise建立)(6)

ratings_distribution_by_book.py

surprise怎么记好(手把手教你用Surprise建立)(7)

图3

surprise怎么记好(手把手教你用Surprise建立)(8)

surprise怎么记好(手把手教你用Surprise建立)(9)

图4

数据中的大多数图书收到的评分不到5个,很少有图书有很多评分,尽管评分最高的图书已收到2,502个评分。

用户评分分布

surprise怎么记好(手把手教你用Surprise建立)(10)

ratings_distribution_by_user.py

surprise怎么记好(手把手教你用Surprise建立)(11)

图5

surprise怎么记好(手把手教你用Surprise建立)(12)

surprise怎么记好(手把手教你用Surprise建立)(13)

图6

数据中的大多数用户给出的评分都在5分以下,并不是很多用户给出了很多评分,尽管最多产的用户给出了13602分。

我相信你已经注意到上面两个图的分布是相同的。每部电影的收视率和每个用户的收视率都成指数衰减。

为了降低数据集的维度,避免出现“内存错误”,我们将过滤掉很少评分的电影和用户。

surprise怎么记好(手把手教你用Surprise建立)(14)

surprise怎么记好(手把手教你用Surprise建立)(15)

图7

Surprise

要从上面的pandas数据框加载数据集,我们将使用load_from_df()方法,还需要一个Reader对象,并且必须指定rating_scale参数。数据框必须有三列,对应于用户ID、条目ID和按此顺序排列的评级。因此,每行对应于给定的评级。

surprise怎么记好(手把手教你用Surprise建立)(16)

使用Surprise库,我们将对以下算法进行基准测试:

基本算法

NormalPredictor

  • NormalPredictor算法根据训练集的分布预测随机评级,这被认为是正常的。这是最基本的算法之一,不需要太多工作。

BaselineOnly

  • BaselineOnly算法预测给定用户和项目的基线估计。

k-NN算法

KNNBasic

  • KNNBasic是一种基本的协同过滤算法。

KNNWithMeans

  • KNNWithMeans是基本的协同过滤算法,它考虑了每个用户的平均评分。

KNNWithZScore

  • KNNWithZScore是一种基本的协同过滤算法,考虑了每个用户的z分数标准化。

KNNBaseline

  • KNNBaseline是一种基本的基于基线评分的协同过滤算法。

基于矩阵分解的算法

SVD

  • SVD算法等效于概率矩阵分解

SVDpp

  • SVDpp算法是SVD的扩展,其考虑了隐式评级。

NMF

  • NMF是一种基于非负矩阵分解的协同过滤算法。它与SVD非常相似。

SlopeOne

  • SlopeOne是SlopeOne算法的一个直接实现。

联合集群

  • Coclustering是一种基于协同聚类的协同过滤算法。

我们使用“rmse”作为预测的准确度量。

surprise怎么记好(手把手教你用Surprise建立)(17)

benchmark.py

surprise怎么记好(手把手教你用Surprise建立)(18)

图8

训练和预测

BaselineOnly算法给了我们最好的rmse,因此,我们将使用BaselineOnly训练和预测并使用交替最小二乘法(ALS)。

surprise怎么记好(手把手教你用Surprise建立)(19)

surprise怎么记好(手把手教你用Surprise建立)(20)

图9

我们使用train_test_split()对具有给定大小的训练集和测试集进行采样,并使用rmse的精度度量。然后我们将使用fit()方法来训练训练集上的算法,然后使用test()方法返回测试集的预测。

surprise怎么记好(手把手教你用Surprise建立)(21)

surprise怎么记好(手把手教你用Surprise建立)(22)

图10

为了详细检查预测,我们将构建一个包含所有预测的pandas数据框。以下代码主要来自这款笔记本。(nbviewer.jupyter/github/NicolasHug/Surprise/blob/master/examples/notebooks/KNNBasic_analysis.ipynb)

surprise怎么记好(手把手教你用Surprise建立)(23)

predictions_details.py

最佳预测:

surprise怎么记好(手把手教你用Surprise建立)(24)

图11

以上是最好的预测,并不是幸运的猜测。因为Ui在25到146之间,所以它们并不是很小,这意味着大量用户已经对目标书进行了评分。

最糟糕的预测:

surprise怎么记好(手把手教你用Surprise建立)(25)

图12

最糟糕的预测看起来也相当出人意料。让我们看看最后一个ISBN“055358264X”的更多细节。该书被47个用户评价,用户“26544”评分为10,我们的BaselineOnly算法却预测该用户的评分为0。

surprise怎么记好(手把手教你用Surprise建立)(26)

surprise怎么记好(手把手教你用Surprise建立)(27)

图13

事实证明,本书收到的大多数评分为0,换句话说,数据中的大多数用户将本书评为0,只有极少数用户评为10.与“最差预测”列表中的其他预测相同。似乎对于每个预测,用户都是某种局外人。

surprise怎么记好(手把手教你用Surprise建立)(28)

,