1_Gql-Vlc4BQJz_x8GhJXX2A.jpeg
推荐系统一直让我的思绪占据了一段时间,由于我倾向于阅读书籍,因此探索Book Crossing数据集非常吸引人。
在线推荐系统是许多电子商务网站的事情。推荐系统广泛地向最适合其口味和特征的顾客推荐产品。有关推荐系统的更多详细信息,请阅读我关于推荐系统的介绍性文章使用Python一些插图
当我遇到Book Crossing数据集时,我开始构建图书推荐系统。该数据集由Cai-Nicolas Ziegler于2004年编制,包含三个用户,书籍和评级表。显性评级以1-10的等级表示(较高的值表示较高的评价),隐式评级表示为0。
在构建任何机器学习模型之前,了解数据是什么以及我们要实现的目标至关重要。数据探索揭示了隐藏的趋势和见解,数据预处理使数据可供ML算法使用。
那么,让我们开始吧。。。

首先,我们加载数据集并检查书籍,用户和评级数据集的形状,如下所示:
1_ZTqkKY7GFXRd1t4503dQ3w.png

图书

逐个探索每个数据集并从书籍数据集开始,我们可以看到图像URL列似乎不需要进行分析,因此可以删除这些列。
1_EEEj5e-6qt5fMGJrIjZCug.png
我们现在检查每个列的数据类型,并更正缺失和不一致的条目。我也在调整列宽以显示列的全文。
1_4ad_p3FbZKUj2lnvfC5Ceg.png

yearofpublication介于

现在我们检查此属性的唯一值。
1_CjQEC5bTbONbsxvky3vgVA.png

yearOfPublication中有一些不正确的条目。由于csv文件中的一些错误,发布商名称’DK Publishing Inc’和’Gallimard’在数据集中被错误地加载为yearOfPublication。此外,某些值是字符串,并且在某些地方已将相同年份作为数字输入。我们将对这些行进行必要的更正,并将yearOfPublication的数据类型设置为int。
1_j4J_hojQ7vMD5VL2Qyxjkw.png

1_7YhYmINE12tVKt1WksH8JA.png
现在可以看出yearOfPublication的类型为int,其值为0-2050。由于该数据集建于2004年,我假设2006年之后的所有年份都无效,保留两年的保证金,以防数据集可能已更新。对于所有无效条目(包括0),我将这些条目转换为NaN,然后用剩余年份的平均值替换它们。
1_aGwdY5dyGono0qwNYu8yXA.png

出版者

来到“发布者”专栏,我已经处理了两个NaN值,将其替换为“其他”,因为在进行一些调查后无法推断出版商名称(检查jupyter notebook embed)。

1_imEqkSgU-h-H-rdNgt0FTw.png

用户数据集

现在我们探索用户数据集,首先检查其形状,前几列和数据类型。

1_2yeFf0w3rV9Qp0LeiIWRgw.png

年龄

检查唯一值后,userID看起来正确。但是,Age列具有NaN和一些非常高的值。在我看来,5岁以下和90岁以上的年龄没有多大意义,因此,这些正在被NaN取代。然后将所有NaN替换为Age的平均值,并将其数据类型设置为int。

1_SryOBAoWEhpgP8FSQe3MhA.png

我这里没有对Location列进行任何处理。但是,如果您希望可以进一步将其拆分为城市,州,国家,并使用文本处理模型进行一些处理。

评级数据集

我们检查评级数据集的形状和前几行。它揭示了我们的用户手册评级矩阵将非常稀疏,因为与评级矩阵的大小(用户数量×书籍数量)相比,实际评级非常低。

1_eo2wYWsJFl2euCq-X83q1A.png
现在,评级数据集应该具有存在于各个表中的用户ID和ISBN,即。用户和书籍。

1.png
很明显,用户已经评价了一些书籍,这些书籍不是原始书籍数据集的一部分。数据集的稀疏度可以如下计算:

2.png
由1-10表示的显式评级和由0表示的隐含评级现在必须分开。我们将仅使用明确的评级来构建我们的图书推荐系统。同样,用户也被分为明确评级的人和记录其隐性行为的人。

3.png
bookRating的计数图表示更高的评级在用户中更常见,评级8被评为最高次数。

4.png

基于简单流行度的推荐系统

此时,可以基于不同书籍的用户评级的计数来构建基于简单流行度的推荐系统。很明显,JK罗琳撰写的书很受欢迎。

5.png

6.png

基于协同过滤的推荐系统

为了应对我的机器具有的计算能力并减少数据集大小,我正在考虑已经评价至少100本书籍和书籍至少有100个评级的用户。

1.png
构建基于CF的推荐系统的下一个关键步骤是从评级表生成用户项评级矩阵。

2.png
请注意,评级矩阵中的大多数值都是NaN,表示没有评级,因此数据稀疏。另请注意,此处仅考虑了明确的评级。由于大多数机器学习算法无法处理NaN,我们将其替换为0,现在表示没有评级。

基于用户的CF.

我将重用我的基于CF的推荐系统示例的功能。函数findksimilarusers输入userID和rating矩阵并返回k个类似用户的相似性和索引。(阅读我以前的故事,了解基于用户/项目的CF方法的概念和公式)

3.png
函数predict_userbased基于基于用户的方法预测指定用户 - 项目组合的评级。

4.png
功能recommendedItem使用上述功能来推荐基于用户或基于项目的方法的书籍(基于所选方法和度量组合)。如果图书的预测评级大于或等于6,并且图书尚未评级,则会提出建议。您可以在调用此函数时选择相似性度量(余弦/相关)。

5.png
而且Voila !!! 根据基于用户的CF方法,检查用户4385的前10本书籍建议。

6.png

7.jpeg

基于项目的CF.

已经为基于项目的CF编写了类似的函数来查找类似的书籍并预测用户对每本书的评级。相同的功能recommendedItem可用于根据基于项目的方法和选定的指标推荐书籍。如果图书的预测评级大于或等于6,并且图书尚未评级,则会提出建议。

1.png

2.png
哇!!!根据基于项目的CF方法检查用户4385的前10本书籍建议。这些与基于用户的方法建议的显着不同。

3.png
在这篇文章中,交叉验证,测试列车拆分和推荐系统评估等领域尚未涉及,这些领域值得探讨。这段代码的Jupyter笔记本嵌入在下面。
csaluja / JupyterNotebooks-Medium
_通过在GitHub上创建帐户,为JupyterNotebooks-Medium开发做出贡献。_github.com