推荐系统在电子商务网站中广泛被使用,如何向用户推荐最适合其品味的产品是研究的重点。本文在Book Crossing数据集的基础上进行图书推荐系统的研究,详细讲解了构建推荐系统的步骤:加载数据集(图书、用户、评分表)、检查各个数据集等,并实现了基于流行度的简单推荐系统和基于协同过滤的推荐系统(基于用户和基于item)。通读本文,相信你一定能理解简单推荐系统的构建过程。
作者 | Chhavi Saluja
编译 | 专知
参与 | Yingying, Xiaowen
构建图书推荐系统之路
在线推荐系统是许多电子商务网站的技术核心。推荐系统向客户推荐最适合他们品味和特点的产品。
Book Crossing数据集由Cai-Nicolas Ziegler于2004年推出,内含三张表,即用户,书籍和评分表。显式评分以1到10的等级表示(较高的值表示较高的分值)并且隐含的分值由0表示。
在构建任何机器学习模型之前,理解数据是什么以及我们想要实现什么是至关重要的。数据探索揭示了隐藏的趋势和见解,并且数据预处理使数据可供机器学习算法使用。
首先,我们加载数据集并检查书籍、用户和评分数据集的格式如下:
书籍
我们现在检查每个列的数据类型,并更正缺失和不一致的条目。
- 出版时间
现在我们检查这个属性的值。
出版时间中有一些不正确的条目。由于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的次数最多。
基于流行度的简单推荐系统
基于协同过滤的推荐系统
构建基于CF的推荐系统的下一个关键步骤是从评分表中生成用户-项目评分矩阵。
请注意,评分矩阵中的大部分值都是NaN,表示评分不存在,因此数据稀疏。另外请注意,这里只考虑显式评分。由于大多数机器学习算法不能处理NaN,我们用0代替它们,表明没有评分。
基于用户的CF
函数predict_userbased基于用户的方法对特定的user-item组合进行评分。
函数recommendItem使用上述函数为基于用户或基于项目的方法(基于选定的方法和度量标准组合)推荐书籍。如果图书的预测评分大于或等于6,并且图书尚未被打分,则给出推荐。你可以在调用此函数时选择相似性度量(余弦/相关)。
根据基于用户的CF方法检查用户4385的top-10的书籍推荐。
基于item的CF
根据基于item的CF方法检查用户4385的top-10书籍推荐如下所示。这与基于用户的方法有很大的不同。
在这篇文章中,交叉验证、测试训练拆分和推荐系统评估等领域还没有涉及到,这些领域值得探索。
参考文献:
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