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

一、说明

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

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

        在本文中,我们将深入探讨推荐系统的迷人世界,并探讨如何使用 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…

清理ubuntu空间

最近ubuntu空间告急,急需清理一下。 首先是apt的清理,apt中会留存很多的下载和安装文件,此时就需要: 先查看: du -sh /var/cache/apt/archives然后清理: sudo apt-get clean清理不需要的内核:…

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

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

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…

MongoDB聚合运算符:$first

文章目录 语法使用定义文档顺序数组操作缺失值的处理 举例数据缺失的情况在$setWindowFields阶段中使用 $first聚合运算符返回分组中第一个文档指定表达式的结果,只有分组文档是有序的情况下才有意义。 $first可用于下列阶段: $bucket$bucketAuto$grou…

初阶结构体

在这篇文章中我们只讲一些结构体的一些基础的知识,后续会继续补充关于结构体的高阶知识。 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 安装依赖性: 安装软件: 修改依赖性配置文件 重新自动化配置 登录…

如何在 iPhone 上使用蓝牙鼠标

iPhone 不支持使用传统的鼠标指针。 然而,有一个名为“AssistiveTouch”的功能可以在屏幕上模拟类似光标的指针。 启用它的方法如下: 打开 iPhone 上的“设置”应用程序。转到“辅助功能”。向下滚动并选择“触摸”。点击“辅助触控”。切换开关以打开 …

Rust 01.变量、类型、函数

转义输出: fn main() {let a 12;println!("a {{{}}}", a); } //a {12}type let is_true: bool true;println!("is_true {}", is_true);let is_false false;println!("is_false {}, {}", is_false, is_true);//char 在rust里面…

快速排序(数据结构)

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

MiniGPT-5: 通过生成性视觉标记实现交错式视觉与语言生成

MiniGPT-5: Interleaved Vision-And-Language Generation via Generative Vokens 摘要 近年来,大型语言模型(LLM)在自然语言处理(NLP)领域的突破性进展引起了全球AI开发者的关注。这些模型在文本生成和理解方面设定了新的基准。然而,尽管在文本生成方面…

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

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

Linux TCP参数——tcp_abort_on_overflow

tcp_abort_on_overflow 英文翻译理解:溢出中止 所以,溢出指的是什么溢出? Linux中会维护socket全连接队列,所以这里的溢出指的是全连接队列的溢出。 全连接队列是什么? 全连接队列指的就是TCP三次握手中的第三次握手…

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

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

sqllab第29-33通关笔记

29关知识点: 单引号闭合绕过联合注入 payload:id0%27unionselect1,2,database()%271报错注入 id1%27andextractvalue(1,concat(0x7e,database(),0x7e))%271下面就不演示了,上面给出了payload,感觉没有任何过滤信息,那个waf应该是…