【机器学习实战中阶】书籍推荐系统

在这里插入图片描述

图书推荐系统机器学习项目

通过这个机器学习项目,我们将构建一个图书推荐系统。对于这个项目,我们将使用 K 最近邻(K-Nearest Neighbor, KNN)算法。

让我们开始构建这个系统。

数据集说明

关于数据集

背景

在过去的几十年中,随着 YouTube、Amazon、Netflix 等众多网络服务的兴起,推荐系统在我们的生活中占据了越来越重要的地位。从电子商务(向买家推荐可能感兴趣的商品)到在线广告(向用户推荐与他们的偏好匹配的内容),推荐系统已经成为我们日常在线活动中的不可或缺的一部分。

在某些行业中,推荐系统特别关键,因为当它们高效运作时,可以产生巨大的收入,或者帮助企业在竞争中脱颖而出。为了证明推荐系统的重要性,几年前 Netflix 举办了“Netflix 奖”挑战赛,目标是开发出比其现有算法更优秀的推荐系统,奖金高达 100 万美元。

图片

斯图加特市图书馆 | 德国斯图加特,图片来源:DIETER WEINELT,FLICKR
在这里插入图片描述

内容

Book-Crossing 数据集包含 3 个文件:

  1. 用户(Users)

    • 包含用户信息。需要注意的是,用户 ID(User-ID)已匿名化并映射为整数。如果可用,会提供人口统计数据(地点、年龄)。否则,这些字段将包含 NULL 值。
  2. 书籍(Books)

    • 书籍通过各自的 ISBN 进行标识。无效的 ISBN 已从数据集中移除。此外,还提供了基于内容的信息(书名、作者、出版年份、出版社),这些信息来自 Amazon Web Services。需要注意的是,如果有多位作者,只提供第一位作者的名字。还提供了指向封面图片的 URL,分为三种尺寸(Image-URL-S、Image-URL-M、Image-URL-L),即小、中、大。这些 URL 都指向 Amazon 网站。
  3. 评分(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)算法是一种用于解决分类问题的最简单的方法之一,通常可以与其他数据挖掘技术产生竞争性的结果。

  1. 使用相似度或距离来更快速、准确地分类推荐。
  2. 为了更快地为客户提供一些建议,我们的推荐引擎会收集活跃用户的点击流数据,并将其与特定用户群体匹配。通常情况下,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 文件包含了不同书籍的名称和每本书的评分。请从以下链接下载图书推荐系统数据:图书推荐项目

实现步骤

  1. 导入本项目所需的模块和所有库。我们在这个项目中将使用 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 文件,删除多余列,并打印数据集的前几行,以确保数据读取无误。

  1. 这里我们对数据进行一些预处理。我们根据评分选择前十本书,并按评分数量降序排列。我们还根据作者数量和平均评分对数据集进行排序,并将结果存储在数据集中。
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)  # 将页数转换为浮点数

这段代码的目的是对数据集进行预处理。首先,根据评分数量选择前十本书并按评分数量降序排列。然后根据平均评分对数据集进行排序,并删除一些不相关的行,将平均评分和页数转换为浮点数。

  1. 这里我们将数据集复制到另一个变量中,提取数据集中的重要特征。我们取评分和语言代码,并将这两个特征进行拼接,然后存储在另一个变量中。最后,我们绘制一个条形图,显示销售量最高的前十位作者。
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)  # 拼接特征

这段代码的目的是对数据集进行进一步处理。首先,根据平均评分区间对数据进行分组。然后,将评分区间和语言代码转换为虚拟变量,并将所有特征拼接在一起以形成最终的特征数据集。

  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 Systemhttps://www.amazon-science.com/personalized-recommendation-system
Collaborative Filtering Based on KNNhttps://www.sciencedirect.com/science/article/pii/S095070511930182X
Building a Book Recommendation Enginehttps://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 Pythonhttps://www.datacamp.com/community/tutorials/k-nearest-neighbor-python
Matrix Factorization for Recommendation Systemshttps://www.kaggle.com/code/columbia2131/matrix-factorization-for-recommendation-systems
Evaluating Recommendation Systemshttps://mxnet.apache.org/versions/1.9.0/api/python/docs/tutorials/recsys/evaluation.html
Personalized Recommendations in E-commercehttps://www.datasciencecentral.com/profiles/blogs/personalized-recommendations-in-e-commerce-a-comprehensive-guide
A Comprehensive Guide to Collaborative Filteringhttps://www.researchgate.net/publication/334340544_A_Comprehensive_Guide_to_Collaborative_Filtering
Building a Recommendation System with Pythonhttps://www.manning.com/books/building-recommendation-systems-with-python-and-tensorflow
Item-Based Collaborative Filteringhttps://www.sciencedirect.com/science/article/pii/S1524070301902788
Using K-NN for Movie Recommendationhttps://www.analyticsvidhya.com/blog/2020/07/recommendation-system-knn/
K-NN for Recommender Systemshttps://www.journalofbigdata.com/content/6/1/29
Personalized Book Recommendation System using Machine Learninghttps://www.mdpi.com/2076-3417/10/18/6549
Nearest Neighbors in High Dimensionshttps://www.semanticscholar.org/paper/Nearest-Neighbors-in-High-Dimensions-Indyk-Motwani/7d4a5e49a0f8a80b3e1a06f6d1e4ad8e2c4db157
K-NN Algorithm in Machine Learninghttps://www MACHINELEARNINGPLUS COM/ml/k-nn-algorithm-in-machine-learning/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…

【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

文本摘要研究:从统计方法到大型语言模型

论文地址&#xff1a;https://arxiv.org/pdf/2406.11289 &#x1f4d6; 文本摘要研究&#xff1a;从统计方法到大型语言模型 近年来&#xff0c;文本摘要研究经历了多次重大变革&#xff0c;从深度神经网络的出现到预训练语言模型&#xff08;PLMs&#xff09;&#xff0c;再到…

MYSQL 5.7数据库,关于1067报错 invalid default value for,解决方法!

???作者&#xff1a; 米罗学长 ???个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 ???各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot&#xff0c;mysql等项目&#xff0c;源码丰富&#xff0c;欢迎咨询。 ???…

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS&#xff1f; CppCMS 是一个高性能的 C Web 开发框架&#xff0c;专为构建快速、动态的网页应用而设计&#xff0c;特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails&#xff0c;但针对 C 提供了更细粒度的控制和更高效的性能。…

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇&#xff1a;一文大白话讲清楚啥是个webpack第二篇&#xff1a;一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建然后看本篇&#xff0c;Loader的配置…

Kafka 日志存储 — 日志索引

每个日志分段文件对应两个索引文件&#xff1a;偏移量索引文件用来建立消息偏移量到物理地址之间的映射&#xff1b;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…

空调可视化监控与管理系统

随着智能化技术的不断发展&#xff0c;空调系统作为现代建筑、工业和商业场所的核心设备&#xff0c;正在从传统管理模式向智能化管理迈进。无论是大型商业楼宇、工业厂房&#xff0c;还是数据中心的精密空调&#xff0c;如何通过智能监控和高效管理降低能耗、提升运行效率&…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…

Flask:后端框架使用

文章目录 1、介绍2、demo演示3、Flask请求和响应 3.1 演示demo3.2 request获取请求体数据3.3 requests发送请求3.4 响应返回和接收 4、特殊路由 4.1 路由重定向4.2 路由拦截器 1、介绍 Flask是由python语言编写的轻量级Web应用框架&#xff0c;主要应用于后端框架&#xff…

递归算法学习v2.3

目标和 设置全局变量&#xff1a; class Solution {int ret,path,aim;public int findTargetSumWays(int[] nums, int target) {aim target;dfs(nums,0);return ret;}public void dfs(int[] nums,int pos){if(pos nums.length){if(path aim){ret ;}return;}path nums[pos…

ui设计公司分享:浅色 UI 设计

在数字化产品琳琅满目的今天&#xff0c;用户对于界面的要求早已不止于功能的实现&#xff0c;更追求一种舒适、无压的交互体验。而浅色UI设计&#xff0c;凭借其独特的魅力&#xff0c;正逐渐成为众多设计师营造优质体验的首选。 一、浅色UI设计的视觉优势 &#xff08;一&a…

Nacos:使用PgSQL数据源

数据源插件开源仓库地址&#xff1a;nacos-datasource-extend-plugins 一、PostgreSQL数据库安装 1、本文使用Docker进行数据库的安装&#xff0c;使用docker命令拉取的PG14版本的数据库&#xff1a; docker pull postgres:14.6 2、创建PG容器并启动&#xff0c;映射了5432…

Linux——入门基本指令汇总

目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…

C语言之装甲车库车辆动态监控辅助记录系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 &#xff08;一&#xff09;…

2024年Vue面试题汇总

流程图如下&#xff1a; vue核心知识——语法篇 1.请问 v-if 和 v-show 有什么区别&#xff1f; 相同点&#xff1a; 两者都是在判断DOM节点是否要显示。 不同点&#xff1a; a.实现方式&#xff1a; v-if是根据后面数据的真假值判断直接从Dom树上删除或重建元素节点。 v-…