如何使用机器学习构建自己的推荐系统?

一、说明

        在广阔的电子商务领域,众多产品和服务都在争夺我们的注意力,推荐系统的作用变得至关重要。这些智能系统彻底改变了我们在线发现和接触产品的方式,使其成为现代电子商务平台成功的基石。

        推荐系统,通常称为推荐引擎或简称为“推荐”,是一种算法,旨在根据用户过去的行为、偏好和互动来预测和推荐用户可能感兴趣的项目。它们已成为在线购物体验不可或缺的一部分,影响着我们的购买决策并推动了企业的销售。

        在本文中,我们将深入探讨推荐系统的迷人世界,并探讨如何使用 Python 构建一个推荐系统。我们将揭示这些系统的内部工作原理,从数据收集和预处理到算法选择和实现。

        在此旅程结束时,您将拥有创建有效推荐系统的知识和工具,以满足您的电子商务平台的独特需求,最终推动增长和客户满意度。

二、加载数据集 

        我们将从 Kaggke 获取一个数据集来探索该主题,您可以在此处找到该数据集:Book Recommendation Dataset | Kaggle

  • 首先要做的是使用 Pandas 加载数据
import pandas as pd
ratings = pd.read_csv(r'Data/ratings.csv')

三、筛选数据

  • 我们的数据集太大了,我们将过滤掉评分很少的书籍,至少有 6 个评分,我们将为用户做同样的事情。
  • 我们还将删除 0 的评分,假设人们没有投票。
  • 然后我们将所有内容存储在一个新的
#Books
min_book_ratings = 5
filter_books = ratings['ISBN'].value_counts() > min_book_ratings
filter_books = filter_books[filter_books].index.tolist()#Users
min_user_ratings = 5
filter_users = ratings['User-ID'].value_counts() > min_user_ratings
filter_users = filter_users[filter_users].index.tolist()ratings_filtered = ratings[(ratings['ISBN'].isin(filter_books)) & (ratings['User-ID'].isin(filter_users))]ratings_filtered = ratings[ratings['Book-Rating'] > 0] 

 

四、构建模型

        我们将使用“Surprise”,一个 Python scikit,用于构建和分析处理显式评级数据的推荐系统。

        我们需要定义 Reader 并根据 “Surprise” 注解来格式化数据集:

  • Surprise 中的 Reader 类用于分析包含评级的文件或 DataFrame。读取器的主要用途是定义数据集中评级的比例。这很重要,因为它有助于算法了解如何以数字方式解释评级。
  • 数据是指您用于推荐系统的数据集,通常以用户与项目交互的形式(例如用户对书籍、电影等的评分)
from surprise import Reader, Datasetreader = Reader(rating_scale=(0, 10))  
data = Dataset.load_from_df(ratings_filtered[['User-ID', 'ISBN', 'Book-Rating']], reader)

        经典:将数据拆分为训练集和测试集,避免过度拟合

from surprise.model_selection import train_test_split
trainset, testset = train_test_split(data, test_size=0.25)  

        对于模型选择,您可以从 Surprise 中包含的不同模型中进行选择,我将使用 SVD(奇异值分解)并使用网格搜索 CV 来查找最佳参数。

        有关 SVD 👉🏼 Welcome to Surprise’ documentation! — Surprise 1 documentation 的更多信息。

超参数怎么样

  • n_factors :表示从用户-项矩阵派生的潜在因子(或特征)的数量。虽然数据集主要由用户 ID、ISBN 和图书评级组成,但它本质上隐藏着关于不同用户如何评估不同书籍的属性或趋势。这些隐藏的属性被称为潜在因素。
  • n_epochs :这表示整个训练数据集的迭代次数。在每个纪元期间,算法都会更新参数(用户和项目特征)以最大程度地减少预测误差。
  • lr_all(学习率):学习率决定了训练过程中基于预测误差的模型调整程度。更高的学习率意味着更快的学习速度,模型在每次迭代中都会显着更新其参数。但是,这可能会导致诸如超过最佳解决方案或围绕它振荡等问题!
  • reg_all (正则化术语) : 正则化通过对较大的模型参数施加惩罚来防止过度拟合,起着至关重要的作用。

我们将输入各种参数,并根据最低RMSE(均方根误差)结果显示最佳参数。请注意,RMSE 表示预测值与实际值之间的平均平方差。

均方根误差公式。
from surprise import SVD
from surprise.model_selection import GridSearchCVparam_grid = {'n_factors': [1,3,5,10,15],'n_epochs': [20,30,40],'lr_all': [0.005, 0.01],'reg_all': [0.02, 0.1]
}gs = GridSearchCV(SVD, param_grid, measures=['rmse'], cv=3)
gs.fit(data)print("Best RMSE: ", gs.best_score['rmse'])
print("Best parameters: ", gs.best_params['rmse'])

过了一会儿。图片来源 : https://www.pinterest.com/pin/a-few-moments-later--677088125250940487/

我们得到的结果:

  • 最高 RMSE:1.63;虽然该值可能看起来相对较高,但考虑到我们使用的规模,它仍然在可接受的范围内。
  • 最佳参数: {'n_factors': 1, 'n_epochs': 30, 'lr_all': 0.005, 'reg_all': 0.1}

现在👇🏼让我们训练我们的模型

model = SVD(n_factors=1, n_epochs=30, lr_all=0.005, reg_all=0.1)
model.fit(trainset)

五、 构建函数以获得推荐

        我们将开发一个函数来提取不同 ISBN 的列表,识别用户过去评分的项目,并为用户尚未评分的所有 ISBN 生成预测。

        最终,我们将相应地安排这些预测。请记住,变量“n”表示我们在此上下文中要考虑的项目数量。

def get_recommendations(user_id, model, data, n=3):unique_isbns = data.df['ISBN'].unique()rated_isbns = data.df.loc[data.df['User-ID'] == user_id, 'ISBN']predictions = [model.predict(user_id, isbn) for isbn in unique_isbns if isbn not in rated_isbns]top_predictions = sorted(predictions, key=lambda x: x.est, reverse=True)[:n]return top_predictions
  • 让我们以用户 ID “276725” 为例
user_id_example = 276725  
top_predictions = get_recommendations(user_id_example, model, data, n=3)
for pred in top_predictions:print(f'ISBN: {pred.iid}, Predicted Rating: {pred.est}')

 

        但是,我们也想显示书名!为此,我们需要引用 Kaggle 数据集中名为“Books”的补充表,其中包含每个 ISBN 的相应书名。

        首先,让我们阅读数据,将注意力缩小到两列:['ISBN', 'Book-Title']。

books = pd.read_csv(r'Data/Books.csv', usecols=['ISBN', 'Book-Title'])

现在让我们构建函数:

  • 提取每个预测对象的 ISBN 和预测评级。
  • 使用提取的数据创建 DataFrame。
  • 将 DataFrame 与书籍数据集合并以添加标题。
  • 从 DataFrame 中检索书名和预测评级。
def map_isbn_to_titles(top_predictions, books):isbn_ratings = [(pred.iid, pred.est) for pred in top_predictions]top_preds_df = pd.DataFrame(isbn_ratings, columns=['ISBN', 'Predicted_Rating'])recommendations = top_preds_df.merge(books[['ISBN', 'Book-Title']], on='ISBN', how='inner')return recommendations[['Book-Title', 'Predicted_Rating']]

让我们用我们之前使用上述函数的预测示例来说明这一点,这是我们的结果!

top_recommendations_with_titles = map_isbn_to_titles(top_predictions, books)for _, row in top_recommendations_with_titles.iterrows():print(f"Title: {row['Book-Title']}, Predicted Rating: {row['Predicted_Rating']:.2f}")

 

        总之,使用机器学习构建推荐系统为增强用户体验和推动电子商务领域的业务成功开辟了令人兴奋的可能性。

        凭借从此旅程中获得的知识和工具,您已经做好了充分的准备,可以开始自己的推荐系统项目,并根据您的平台和受众的独特需求进行定制。祝您推荐愉快!

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

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

相关文章

谈谈对数据库索引的认识

索引的概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 索引的作用 默认情况下,进行条件查询操作,就是遍历表&a…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻,而同时数据的流动和共享也带来了安全风险,如何确保企业数据在流动过程中的安全性,也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

launchctl及其配置、使用、示例

文章目录 launchctl 是什么Unix / Linux类似的工具有什么哪个更常用配置使用常用子命令示例加载一个 launch agent:卸载一个 launch daemon:列出所有已加载的服务:启动一个服务:停止一个服务:禁用一个服务:启用一个服务: 附com.example.myagent.plist内容有趣的例子参考 launch…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图: 思路:先生成1个单位的二维码,然后再通过像素填充颜色,颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

牛客NC278 删除链表中重复的结点【中等 链表 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef 这题有一次面试某团的第一道题 思考 链表的基本操作参考答案Java import java.util.*; /*public class ListNode {int val;ListNode next null;ListNode(int val) {this.v…

【Linux杂货铺】进程的基本概念

目录 🌈前言🌈 📁进程的概念 📂描述进程-PCB 📂 查看进程 📂 查看正在运行的程序 📂杀死进程 📂通过系统调用获取进程标识符 📂通过系统调用创建进程 &#x1f…

初阶结构体

在这篇文章中我们只讲一些结构体的一些基础的知识,后续会继续补充关于结构体的高阶知识。 1.结构体声明 1.1结构体的基本知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构可以用来描述复杂对象,在…

day10-SpringBootWeb案例-1

一、准备工作 1 需求&环境搭建 步骤: 准备数据库表(dept、emp)创建 springboot 工程,引入对应的起步依赖(web、mybatis、mysql 驱动、lombok)配置文件 application.properties 中引入 mybatis 的配置信息,准备对应…

CI/CD实战-gitlab代码仓库 2

gitlab安装部署 实验虚拟机最小需求:4g内存,4核cpu 下载源:Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 安装依赖性: 安装软件: 修改依赖性配置文件 重新自动化配置 登录…

快速排序(数据结构)

1. 前言: 这两种排序经常使用,且在算法题中经常遇见。 这里我们简单分析讨论一下。 1. 快速排序 平均时间复杂度:O(nlogn) 最坏时间复杂度: O(n^2) 1.1. 左右向中遍历: 取最右侧4…

HarmonyOS NEXT应用开发—发布图片评论

介绍 本示例将通过发布图片评论场景,介绍如何使用startAbilityForResult接口拉起相机拍照,并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机,拍照后获取图片地址。 实现思路 创建CommentData类&#…

腾讯云轻量应用服务器2核4G5M代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么?代表2核CPU、4G内存、5M公网带宽,这是一款轻量应用服务器,系统盘为60GB SSD云硬盘,活动页面 txybk.com/go/txy 活动打开如下图: 腾讯云2核4G5M服务器 如上图所示,这…

HCIA——TCP协议详解

目录 1、TCP概念及协议头部格式 1.1TCP特点 1.2TCP协议协议头部格式 1.3字段进行介绍 1.3.1源端口和目的端口 1.3.2序号(seq) 1.3.3确认序号(ack) 1.3.4数据偏移 1.3.5标志位 1.3.6窗口 1.3.7校验和 1.3.8紧急指针 2、TCP的可靠性 2.1 TCP可靠性的保障 2.2排序机…

Android Studio实现内容丰富的安卓博客发布平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号078 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看博客列表 3.查看博客详情 4.评论博客, 5.…

HBase在表操作--显示中文

启动HBase后,Master和RegionServer两个服务器,分别对应进程为HMaster和HRegionServe。(可通过jps查看) 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据(注:学习期间可用&#…

将FastSAM中的TextPrompt迁移到MobileSAM中

本博文简单介绍了SAM、FastSAM与MobileSAM,主要关注于TextPrompt功能的使用。从性能上看MobileSAM是最实用的,但其没有提供TextPrompt功能,故而参考FastSAM中的实现,在MobileSAM中嵌入TextPrompt类。并将TextPrompt能力嵌入到MobileSAM官方项目提供的gradio.py部署代码中,…

【JVM】生产内存占用异常优化 (一)

记录一次 - 内存占用优化 某个导出,导出数据量过大总是导致OOM,但是根据需求,导出数据大小并没有那么大 按照导出数据的查询来看 SELECTg.inventory_code,g.visit_record_code,g.recovery_price AS transactionAmount FROM crm_goods g ...…

小迪安全41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

#知识点: 1、XML&XXE-原理&发现&利用&修复等 2、XML&XXE-黑盒模式下的发现与利用 3、XML&XXE-白盒模式下的审计与利用 4、XML&XXE-无回显&伪协议&产生层面 #思路点: 参考:https://www.cnblo…

Linux 块设备驱动

Linux 三大驱动分别是:字符设备驱动、块设备驱动、网络设备驱动。 块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备驱…

CentOS 7 编译安装 Git

CentOS 7 编译安装 Git 背景来源删除旧版本 Git安装依赖包下载 Git 源代码检验相关依赖,设置安装路径编译安装添加 Git 环境变量重新加载配置文件查看版本号参考文献 背景来源 为什么要安装新版本呢? 因为无聊,哈哈哈,其实也不是…