点击上方关注,All in AI中国
在Python和Surprise Library,Collaborative Filtering的帮助下学习如何构建自己的推荐引擎推荐系统是数据科学中最常用和易于理解的应用之一。由于互联网的快速发展和信息过载问题,我们已经在这一领域已经做了大量的工作,对这方面的兴趣和需求也仍然很高。帮助用户处理信息过载并向他们提供个性化的推荐、内容和服务,已经成为网上商务的一部分。
接近推荐系统的两种最流行的方法是协同过滤和基于内容的推荐。在这篇文章中,我们将重点关注协同过滤方法,即:用户是具有相似品味和喜好的人在过去喜欢的推荐项目。换句话说,该方法通过使用用户之间的相似性来预测未知评级。
我们将使用Book-Crossing,一个用于开发推荐系统算法的书籍评级数据集,以及由Nicolas Hug建立的Surprise库。
数据
Book-Crossing数据包括三个表,我们将使用其中两个:users表和book rating表。
图1
EDA
评级分布
ratings_distribution.py
图2
我们可以看到,数据中超过62%的评级为0,很少有评级为1或2或3,低评级书籍意味着它们通常非常糟糕。
按书进行评级分布
ratings_distribution_by_book.py
图3
图4
数据中的大多数图书收到的评分不到5个,很少有图书有很多评分,尽管评分最高的图书已收到2,502个评分。
用户评分分布
ratings_distribution_by_user.py
图5
图6
数据中的大多数用户给出的评分都在5分以下,并不是很多用户给出了很多评分,尽管最多产的用户给出了13602分。
我相信你已经注意到上面两个图的分布是相同的。每部电影的收视率和每个用户的收视率都成指数衰减。
为了降低数据集的维度,避免出现“内存错误”,我们将过滤掉很少评分的电影和用户。
图7
Surprise
要从上面的pandas数据框加载数据集,我们将使用load_from_df()方法,还需要一个Reader对象,并且必须指定rating_scale参数。数据框必须有三列,对应于用户ID、条目ID和按此顺序排列的评级。因此,每行对应于给定的评级。
使用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”作为预测的准确度量。
benchmark.py
图8
训练和预测
BaselineOnly算法给了我们最好的rmse,因此,我们将使用BaselineOnly训练和预测并使用交替最小二乘法(ALS)。
图9
我们使用train_test_split()对具有给定大小的训练集和测试集进行采样,并使用rmse的精度度量。然后我们将使用fit()方法来训练训练集上的算法,然后使用test()方法返回测试集的预测。
图10
为了详细检查预测,我们将构建一个包含所有预测的pandas数据框。以下代码主要来自这款笔记本。(nbviewer.jupyter/github/NicolasHug/Surprise/blob/master/examples/notebooks/KNNBasic_analysis.ipynb)
predictions_details.py
最佳预测:
图11
以上是最好的预测,并不是幸运的猜测。因为Ui在25到146之间,所以它们并不是很小,这意味着大量用户已经对目标书进行了评分。
最糟糕的预测:
图12
最糟糕的预测看起来也相当出人意料。让我们看看最后一个ISBN“055358264X”的更多细节。该书被47个用户评价,用户“26544”评分为10,我们的BaselineOnly算法却预测该用户的评分为0。
图13
事实证明,本书收到的大多数评分为0,换句话说,数据中的大多数用户将本书评为0,只有极少数用户评为10.与“最差预测”列表中的其他预测相同。似乎对于每个预测,用户都是某种局外人。
,