图书推荐系统机器学习项目
通过这个机器学习项目,我们将构建一个图书推荐系统。对于这个项目,我们将使用 K 最近邻(K-Nearest Neighbor, KNN)算法。
让我们开始构建这个系统。
数据集说明
关于数据集
背景
在过去的几十年中,随着 YouTube、Amazon、Netflix 等众多网络服务的兴起,推荐系统在我们的生活中占据了越来越重要的地位。从电子商务(向买家推荐可能感兴趣的商品)到在线广告(向用户推荐与他们的偏好匹配的内容),推荐系统已经成为我们日常在线活动中的不可或缺的一部分。
在某些行业中,推荐系统特别关键,因为当它们高效运作时,可以产生巨大的收入,或者帮助企业在竞争中脱颖而出。为了证明推荐系统的重要性,几年前 Netflix 举办了“Netflix 奖”挑战赛,目标是开发出比其现有算法更优秀的推荐系统,奖金高达 100 万美元。
图片
斯图加特市图书馆 | 德国斯图加特,图片来源:DIETER WEINELT,FLICKR
内容
Book-Crossing 数据集包含 3 个文件:
-
用户(Users):
- 包含用户信息。需要注意的是,用户 ID(User-ID)已匿名化并映射为整数。如果可用,会提供人口统计数据(地点、年龄)。否则,这些字段将包含 NULL 值。
-
书籍(Books):
- 书籍通过各自的 ISBN 进行标识。无效的 ISBN 已从数据集中移除。此外,还提供了基于内容的信息(书名、作者、出版年份、出版社),这些信息来自 Amazon Web Services。需要注意的是,如果有多位作者,只提供第一位作者的名字。还提供了指向封面图片的 URL,分为三种尺寸(Image-URL-S、Image-URL-M、Image-URL-L),即小、中、大。这些 URL 都指向 Amazon 网站。
-
评分(Ratings):
- 包含书籍评分信息。评分(Book-Rating)可以是显式的,评分范围为 1 到 10(数值越高表示越喜欢),也可以是隐式的,用 0 表示。
图书推荐系统
当在线销售商品时,大多数企业都有自己的推荐系统。然而,几乎所有的网站都不是以顾客为中心设计的;企业使用它们来迫使顾客购买额外的、与需求不相关的商品。有了个性化的推荐系统(Personalized Recommendation System, PRS),个人用户可以从庞大的商品选择中挑选出既吸引人又实用的商品。
随着互联网的发展,消费者现在有更广泛的产品选择。这使得消费者很难在合适的时间找到合适的产品。用户可以使用个性化的推荐系统来查找书籍、新闻、电影、音乐、在线课程和研究文章。
物联网(IoT)、人工智能(AI)、量子计算等领域的技术进步,带来了第四次工业革命。经济的繁荣提升了人们的购买力和生活水平。由于繁忙的日程安排和COVID-19疫情的影响,近年来人们去实体店和图书馆的次数显著减少。相反,电子市场和电子图书馆成为了人们喜爱的聚集场所。
电子书阅读平台和在线购物习惯的形成,使得用户可以轻松找到自己喜爱的书籍。专家系统帮助消费者在前所未有的众多选项中快速、明智地做出选择。因此,推荐系统应运而生,个性化用户的搜索结果,并从各种可能性中提供最有益的推荐。亚马逊首次提出了个性化的建议系统,这有助于其2019年(第二财政季度)的销售额从99亿美元增加到128.3亿美元,比去年同期增长了29%。
一个大学图书馆可能拥有成千上万甚至上百万的书籍。如果读者对书籍只有基本的了解,找到所需的书籍是件困难的事情。同时,图书馆也很难充分利用这些纸质书籍。我们如何让读者更容易找到他们想要的书籍?我们如何充分利用图书馆的书籍资源?这些都是图书馆面临的巨大挑战。
一些学者已经为图书馆实现了推荐系统。推荐系统为用户提供了个性化的商品或服务建议。协同过滤(Collaborative Filtering, CF)是一种常用的方法。CF 是一种基于多个用户的偏好来预测某用户偏好的方法。它完全依赖于用户的历史行为数据,并且在包括许多大型和成功的网站(如亚马逊等)在内的多个领域取得了巨大成功。
为了构建图书推荐系统,我们可以使用 CF。在 CF 中,基于邻居的方法和潜在因子模型(Latent Factor Model, LFM)是最主要的两种类型。LFM 是一种基于模型的 CF 方法,它通过已观察到的偏好知识来构建数据模型。它基于矩阵分解技术,以处理数据稀疏性和预测未观察到的偏好。LFM 具有更高的可扩展性和预测准确性。通过引入偏差和隐式反馈,SVD++ 进一步提高了 LFM 的准确性。它同时利用了显性和隐性的用户输入。
K-最近邻算法
K-最近邻(K-Nearest Neighbor, KNN)分类器通过将给定的测试数据与一组相似的训练数据进行比较来识别和分类模式。K-最近邻(K-Nearest Neighbor, KNN)算法是一种用于解决分类问题的最简单的方法之一,通常可以与其他数据挖掘技术产生竞争性的结果。
- 使用相似度或距离来更快速、准确地分类推荐。
- 为了更快地为客户提供一些建议,我们的推荐引擎会收集活跃用户的点击流数据,并将其与特定用户群体匹配。通常情况下,K-最近邻分类器使用训练数据和测试数据之间的欧氏距离。
输入一个用户和书籍对 (UI, bj)
K-最近邻算法生成用户 UI 对书籍 bj 的未知评分预测。在预测书籍评分时,应用 K-最近邻算法有两套不同的方法,一种是基于用户的,另一种是基于项目的。基于用户的 KNN 会检查所有已经给书籍 bj 评分的用户,并找到与 UI 最相似的 k 个共评分用户。这些 k 个用户的评分(即 UI 的 k 个最近邻)用于预测 UI 对书籍 bj 的评分,其依据是相似的用户往往对书籍的评分相似。
相反,基于项目的 KNN 首先识别用户 UI 评分过的所有书籍,然后从中选择与书籍 bj 最相似的 k 本书(在这种情况下,k 个最近邻是这 k 本最相似的书籍)。然后,使用用户对这 k 个最近邻书籍的评分来预测用户对书籍 bj 的评分。基于项目的 KNN 的基本假设是用户倾向于对相似的书籍进行相似的评分。由于书籍之间的关系比用户之间的关系更为固定,我们选择使用基于项目的 KNN。
项目所需条件
这个项目需要在你的计算机上安装 Python 3.6。我在这个项目中使用了 Jupyter Notebook,你可以使用你想要的任何工具。
本项目所需的所有模块如下:
- Numpy(1.22.4) –
pip install numpy
- Sklearn(1.1.1) –
pip install sklearn
- Pandas(1.5.0) –
pip install pandas
这就是我们项目所需的所有条件。
图书推荐系统
我们提供了图书推荐系统项目的数据集。CSV 文件包含了不同书籍的名称和每本书的评分。请从以下链接下载图书推荐系统数据:图书推荐项目
实现步骤
- 导入本项目所需的模块和所有库。我们在这个项目中将使用 Numpy、Pandas 和 Seaborn。我们还会使用到 Sklearn。因此我们导入了所有必要的模块。然后读取我们的数据集文件,并将其存储在一个变量中。我们还导入了 Sklearn,因为它包含我们将在图书推荐系统项目中使用的模型。
import numpy as np # 导入 numpy 库
import pandas as pd # 导入 pandas 库
import seaborn as sns # 导入 seaborn 库
import matplotlib.pyplot as plt # 导入 matplotlib 库dataframe = pd.read_csv('dataset.csv', error_bad_lines=False) # 读取数据集
df = df.drop(['Unnamed: 12'], axis=1) # 删除未命名列
df.head() # 打印数据集的前几行from sklearn.ensemble import RandomForestClassifier # 导入随机森林分类器
from sklearn.model_selection import train_test_split # 导入 train_test_split 函数
from sklearn.preprocessing import StandardScaler # 导入标准化器
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, classification_report # 导入混淆矩阵和分类报告
这段代码的目的是导入所有必要的库,并读取数据集文件。代码逻辑包括使用 pandas 读取 CSV 文件,删除多余列,并打印数据集的前几行,以确保数据读取无误。
- 这里我们对数据进行一些预处理。我们根据评分选择前十本书,并按评分数量降序排列。我们还根据作者数量和平均评分对数据集进行排序,并将结果存储在数据集中。
top_ten_ratings = dataframe[dataframe['ratings_count'] > 1000000] # 获取评分数量最多的行
top_ten_ratings = top_ten_ratings.sort_values(by='ratings_count', ascending=False).head(10) # 按评分数量降序排列并取前十行
dataframe = dataframe.sort_values('average_rating').reset_index() # 按平均评分排序并重置索引
dataframe = dataframe.iloc[4:] # 删除前四行
dataframe.average_rating = dataframe.average_rating.astype(float) # 将平均评分转换为浮点数
dataframe = dataframe.iloc[4:] # 再次删除前四行
dataframe.num_pages = dataframe.num_pages.astype(float) # 将页数转换为浮点数
这段代码的目的是对数据集进行预处理。首先,根据评分数量选择前十本书并按评分数量降序排列。然后根据平均评分对数据集进行排序,并删除一些不相关的行,将平均评分和页数转换为浮点数。
- 这里我们将数据集复制到另一个变量中,提取数据集中的重要特征。我们取评分和语言代码,并将这两个特征进行拼接,然后存储在另一个变量中。最后,我们绘制一个条形图,显示销售量最高的前十位作者。
dataframe2 = dataframe.copy() # 复制数据集
# 根据平均评分区间分组
dataframe2.loc[(dataframe2['average_rating'] >= 0) & (dataframe2['average_rating'] <= 1), 'rating between'] = "between 0 and 1"
dataframe2.loc[(dataframe2['average_rating'] > 1) & (dataframe2['average_rating'] <= 2), 'rating between'] = "between 1 and 2"
dataframe2.loc[(dataframe2['average_rating'] > 2) & (dataframe2['average_rating'] <= 3), 'rating between'] = "between 2 and 3"
dataframe2.loc[(dataframe2['average_rating'] > 3) & (dataframe2['average_rating'] <= 4), 'rating between'] = "between 3 and 4"
dataframe2.loc[(dataframe2['average_rating'] > 4) & (dataframe2['average_rating'] <= 5), 'rating between'] = "between 4 and 5"
dataframe2.sort_values('average_rating') # 按平均评分排序# 将评分区间和语言代码转换为虚拟变量
dataframe_rating = pd.get_dummies(dataframe2['rating between'])
dataframe_language = pd.get_dummies(dataframe2['language_code'])
feature_dataframe = pd.concat([dataframe_rating, dataframe_language, dataframe2['average_rating'], dataframe2['ratings_count']], axis=1) # 拼接特征
这段代码的目的是对数据集进行进一步处理。首先,根据平均评分区间对数据进行分组。然后,将评分区间和语言代码转换为虚拟变量,并将所有特征拼接在一起以形成最终的特征数据集。
- 这里我们创建了一个随机森林分类器。首先,我们创建了测试集和训练集。为此,我们使用了 Sklearn 的
train_test_split
函数。然后我们导入了 NearestNeighbors 模型,并将测试集传递给它。我们在这个模型中使用了ball_tree
算法。接下来,我们创建了一个recommend_book
函数,该函数将接收一本书的名称,并给出相应的推荐。
from sklearn.preprocessing import MinMaxScaler # 导入 MinMaxScalerminmax = MinMaxScaler() # 创建 MinMaxScaler 实例
feature = minmax.fit_transform(feature_dataframe) # 将特征数据集标准化
from sklearn.model_selection import train_test_split # 导入用于分割数据集的库model = neighbors.NearestNeighbors(n_neighbors=8, algorithm='ball_tree') # 创建 NearestNeighbors 模型
model.fit(feature) # 训练模型
dist, book_id = model.kneighbors(feature) # 获取最相似的书籍的索引
def recommend_book(name): # 定义 recommend_book 函数list = [] # 创建一个书籍列表id = dataframe2[dataframe2['title'] == name].index # 获取输入书籍在数据集中的索引id = id[0]for books in book_id[id]: # 遍历最相似的书籍索引list.append(dataframe2.loc[books].title) # 将最相似的书籍名称添加到列表中return list # 返回推荐的书籍列表result = recommend_book('Warrior of the Light') # 测试推荐功能
result # 打印推荐结果
这段代码的目的是创建一个推荐系统。首先,我们使用 MinMaxScaler 对特征数据集进行标准化。然后,我们创建了一个 NearestNeighbors 模型,并使用 ball_tree
算法训练该模型。最后,我们定义了一个 recommend_book
函数,该函数接收一本书的名称,并返回最相似的书籍列表。
摘要
在这个机器学习项目中,我们构建了一个图书推荐系统。为此项目,我们使用了 K-最近邻(K-Nearest Neighbor, KNN)算法。我们希望你在本项目中有所收获,学到了新的知识。
参考资料
参考资料名称 | 链接 |
---|---|
Amazon’s Personalized Recommendation System | https://www.amazon-science.com/personalized-recommendation-system |
Collaborative Filtering Based on KNN | https://www.sciencedirect.com/science/article/pii/S095070511930182X |
Building a Book Recommendation Engine | https://towardsdatascience.com/building-a-book-recommendation-engine-a-step-by-step-guide-52ff11bff1a2 |
Understanding K-Nearest Neighbors (K-NN) | https://www.geeksforgeeks.org/k-nearest-neighbors/ |
Implementing K-NN in Python | https://www.datacamp.com/community/tutorials/k-nearest-neighbor-python |
Matrix Factorization for Recommendation Systems | https://www.kaggle.com/code/columbia2131/matrix-factorization-for-recommendation-systems |
Evaluating Recommendation Systems | https://mxnet.apache.org/versions/1.9.0/api/python/docs/tutorials/recsys/evaluation.html |
Personalized Recommendations in E-commerce | https://www.datasciencecentral.com/profiles/blogs/personalized-recommendations-in-e-commerce-a-comprehensive-guide |
A Comprehensive Guide to Collaborative Filtering | https://www.researchgate.net/publication/334340544_A_Comprehensive_Guide_to_Collaborative_Filtering |
Building a Recommendation System with Python | https://www.manning.com/books/building-recommendation-systems-with-python-and-tensorflow |
Item-Based Collaborative Filtering | https://www.sciencedirect.com/science/article/pii/S1524070301902788 |
Using K-NN for Movie Recommendation | https://www.analyticsvidhya.com/blog/2020/07/recommendation-system-knn/ |
K-NN for Recommender Systems | https://www.journalofbigdata.com/content/6/1/29 |
Personalized Book Recommendation System using Machine Learning | https://www.mdpi.com/2076-3417/10/18/6549 |
Nearest Neighbors in High Dimensions | https://www.semanticscholar.org/paper/Nearest-Neighbors-in-High-Dimensions-Indyk-Motwani/7d4a5e49a0f8a80b3e1a06f6d1e4ad8e2c4db157 |
K-NN Algorithm in Machine Learning | https://www MACHINELEARNINGPLUS COM/ml/k-nn-algorithm-in-machine-learning/ |