【干货】一文教你构建图书推荐系统(附代码)

【导读】推荐系统在电子商务网站中广泛被使用,如何向用户推荐最适合其品味的产品是研究的重点。本文在Book Crossing数据集的基础上进行图书推荐系统的研究,详细讲解了构建推荐系统的步骤:加载数据集(图书、用户、评分表)、检查各个数据集等,并实现了基于流行度的简单推荐系统和基于协同过滤的推荐系统(基于用户和基于item)。通读本文,相信你一定能理解简单推荐系统的构建过程。


作者 | Chhavi Saluja

编译 | 专知

参与 | Yingying, Xiaowen



My Journey to building Book Recommendation System

 

构建图书推荐系统之路



 

在线推荐系统是许多电子商务网站的技术核心。推荐系统向客户推荐最适合他们品味和特点的产品。


Book Crossing数据集由Cai-Nicolas Ziegler于2004年推出,内含三张表,即用户,书籍和评分表。显式评分以1到10的等级表示(较高的值表示较高的分值)并且隐含的分值由0表示。


在构建任何机器学习模型之前,理解数据是什么以及我们想要实现什么是至关重要的。数据探索揭示了隐藏的趋势和见解,并且数据预处理使数据可供机器学习算法使用。


首先,我们加载数据集并检查书籍、用户和评分数据集的格式如下:


书籍




从书籍数据集开始,我们可以看到图像URL栏目似乎不是分析所必需的,因此可以将它们删除。


我们现在检查每个列的数据类型,并更正缺失和不一致的条目。


  • 出版时间

现在我们检查这个属性的值。

出版时间中有一些不正确的条目。由于csv文件中存在一些错误,看起来像出版商名称的'DK Publishing Inc'和'Gallimard'在数据集中被错误地加载为出版日期。此外,其中一些值是字符串,并且在某些地方输入的年份与数字相同。 我们将对这些行进行必要的更正,并将出版日期的数据类型设置为int。

现在可以看到出版时间是int类型的,它的值在0-2050之间。由于这个数据集是在2004年建立的,我假设2006年以后的所有年份都是无效的,保持两年的差值,以防数据集可能已被更新。对于所有无效条目(包括0),我将它们转换为NaN,然后用剩余年份的平均值替换它们。


  • 出版商

在“发布者”专栏中,我已经处理了两个NaN值,将其替换为'other',因为在某些检查后无法推断出版商的名称。


用户数据集




现在我们探索用户数据集,首先检查它的大小,前几列和数据类型。


  • 年龄

在检查值时,userID看起来是正确的。然而,年龄栏有一个NaN和一些非常高的值。在我看来,5岁以下和90岁以上的年龄没有太大意义,因此,这些会被NaN取代。然后所有的NaN都被平均年龄取代,其数据类型被设置为int。

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


评分数据集



 

我们检查评分数据集的大小和前几行。它显示我们的用户-书籍评分矩阵将非常稀疏,因为与评分矩阵的大小(用户数量×书籍数量)相比,实际评分相当低。

现在评分数据集应该具有各自表格中存在的用户ID和ISBN,即,用户和书籍。

很明显,用户对一些书籍进行了评分,这些书籍并不是原始书籍数据集的一部分。数据集的稀疏度可按如下方式计算:

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

一份书评图显示,较高的打分率在用户中更常见,评分为8的次数最多。


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




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


基于协同过滤的推荐系统




为了配合机器的计算能力并减少数据集大小, 我们选择至少对100本书籍进行打分的用户,以及至少有100个评分的书籍。

构建基于CF的推荐系统的下一个关键步骤是从评分表中生成用户-项目评分矩阵。

请注意,评分矩阵中的大部分值都是NaN,表示评分不存在,因此数据稀疏。另外请注意,这里只考虑显式评分。由于大多数机器学习算法不能处理NaN,我们用0代替它们,表明没有评分。


基于用户的CF



 

我将会用到一个之前的分享(https://towardsdatascience.com/collaborative-filtering-based-recommendation-systems-exemplified-ecbffe1c20b1)中提过的函数。函数findksimilarusers输入用户ID和评分矩阵,并返回k个相似用户的相似度和指数。

函数predict_userbased基于用户的方法对特定的user-item组合进行评分。

函数recommendItem使用上述函数为基于用户或基于项目的方法(基于选定的方法和度量标准组合)推荐书籍。如果图书的预测评分大于或等于6,并且图书尚未被打分,则给出推荐。你可以在调用此函数时选择相似性度量(余弦/相关)。

根据基于用户的CF方法检查用户4385的top-10的书籍推荐。


基于item的CF



 

为基于item的CF编写了类似的函数,可以找到k本类似的书籍,并预测每本书的用户评分。相同的函数recommendItem可用于基于item的方法和选定的度量标准推荐图书。如果图书的预测评分大于或等于6,并且图书尚未被评分,则进行推荐。

根据基于item的CF方法检查用户4385的top-10书籍推荐如下所示。这与基于用户的方法有很大的不同。

在这篇文章中,交叉验证、测试训练拆分和推荐系统评估等领域还没有涉及到,这些领域值得探索。


下面是这段代码的相关链接:

https://github.com/csaluja/JupyterNotebooks-Medium/blob/master/Book%20Recommendation%20System.ipynb


参考文献:

https://towardsdatascience.com/how-did-we-build-book-recommender-systems-in-an-hour-the-fundamentals-dfee054f978e


https://cambridgespark.com/content/tutorials/implementing-your-own-recommender-systems-in-Python/index.html


参考链接:

https://towardsdatascience.com/my-journey-to-building-book-recommendation-system-5ec959c41847

-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!加入专知主题群(请备注主题类型:AI、NLP、CV、 KG等)交流~


点击“阅读原文”,使用专知

展开全文
Top
微信扫码咨询专知VIP会员