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

news2024/11/24 15:44:56

一、说明

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

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

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

reader = 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 GridSearchCV

param_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.coloradmin.cn/o/1523302.html

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

相关文章

The service already exists!怎么解决,Windows怎么安装/卸载服务?

问题描述 有时候,我们在Windows系统上安装服务时会遇到报错,The service already exists! 问题分析 这个报错说明此服务已经存在了,所以我们不能再次安装,但有时候我们明明是第一次安装,为什么也会报这个错误呢? 在Windows上注册服务通常需要使用命令行工具或者特定的…

如何降低node.js版本(nvm下载安装与使用)

一、问题场景 项目打包时提示以下错误 error js/chunk-f9fc6130.f14f870a.js from Terser Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)at Object.createHash (node:crypto:133:10) 这个错误提示表明在执行Ter…

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型 注册算力平台(驱动云平台)1.平台注册2.查看算力3.进入平台中心 部署ChatGLM3-6B模型1.创建项目2.配置环境设置镜像源、克隆项目修改requirements 3.修改w…

leetcode刷题日记之串联所有单词

题目描述 解题思路 一开始考虑的就是暴力破解,每次切片切words中字母的个数,然后根据每个词语的长度进行进一步的切片,将切出来的单词放入列表,然后每次对比一次,如果存在,就从原来的列表中,删…

AcWingP1101. 献给阿尔吉侬的花束-bfs(宽度优先搜索)

题目链接 搜宽&#xff1a;每次取出队头元素&#xff0c;然后将该队头元素扩展出的所有元素放到队尾 需要的数组&#xff1a; 判重数组&#xff1a;st[] 一般是入队时判重&#xff08;这样可以保证每一个点入队一次&#xff09;queue 队列 宽搜一般模板 queue <- 初始…

webots的安装和体验

刚知道webots是一个机器人仿真软件&#xff0c;好像离开硬件可以自己玩玩&#xff0c;而且有人形机器人的源代码&#xff0c;试试看吧。 Cyberbotics: Robotics simulation with Webotshttps://www.cyberbotics.com/ 官网下载&#xff0c;有windows版本&#xff0c;看上去好简…

java小型人事管理系统

开发工具&#xff1a; MyEclipseJdkTomcatSQLServer数据库 运行效果视频&#xff1a; https://pan.baidu.com/s/1hshFjiG 定制论文&#xff0c;联系下面的客服人员

微服务网关Spring Cloud Gateway有什么作用?

一、背景 现在的spring cloud生态中&#xff0c;spring cloud gateway是一个非常重要的组件。它是一款API网关服务&#xff0c;在微服务架构中扮演了关键角色&#xff0c;它为微服务架构中的请求提供了路由、转发和过滤的功能。此外&#xff0c;还提供了负载均衡、限流和鉴权的…

ARCGIS PRO SDK 图层唯一值渲染

一、如果【地块回退】为面, 按"DKMC"字段&#xff0c;在面中心配置符号Pushpin Await QueuedTask.Run(Sub()pFeaturelayer pmap.FindLayers("地块回退").First()-----------------唯一值渲染Dim Fields New List(Of String) From {"DKMC"} …

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用&#xff0c;比如在和美术同事合作开发一个背包UI业务系统时&#xff0c;美术做好效果图后&#xff0c;程序在UGUI中制作好界面&#xff0c;美术说这个图差了2像素&#xff0c;那个图位置不对差了1像素&#xff0c;另外一个图大小不对等等一系列零碎的…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

AI - 支持向量机算法

&#x1f9e8;概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的机器学习算法&#xff0c;主要用于解决二分类问题。 SVM的核心思想是找到一个超平面&#xff0c;这个超平面能够最好地将数据分为两类&#xff0c;即在保证分类准确的情况下&am…

LGB2028 反向输出一个三位数

&#xff08;LG是洛谷&#xff08;洛谷&#xff09;的意思&#xff09; 题目链接&#xff1a;B2028 题目描述 将一个三位数反向输出&#xff0c;例如输入 358&#xff0c;反向输出 853。 输入格式 一个三位数 n。 输出格式 反向输出 n。 输入输出样例 输入 #1 100 输…

MySQL语法分类 DQL(3)排序查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

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

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

Windows kafka 简单集群搭建

Windows kafka 简单集群搭建 文章目录 Windows kafka 简单集群搭建1.环境说明2.Zookeeper集群搭建2.1 ZooKeeper下载2.2 ZooKeeper安装2.2.1 解压zookeeper-3.4.8.tar.gz2.2.2 进入conf目录下&#xff0c;复制zoo_sample.cfg为zoo.cfg2.2.3 修改zoo.cfg文件2.2.4 生成myid文件2…

Spring MVC 如何接收请求

1. 请求 浏览器访问不同的路径就是发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带有一些参数&#xff0c;所以我们就需要在后端接受参数。 2. 传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接使用方法中的参数即可&#xff1a; RequestMapping(&qu…

C++中的struct与class详解

在C中&#xff0c;struct和class都是用户定义类型&#xff08;UDT&#xff09;的关键字&#xff0c;用于封装数据和函数。尽管它们在许多方面都非常相似&#xff0c;但也存在一些关键差异。 1. 默认访问权限 • **struct**&#xff1a;默认的成员访问权限是public。• **clas…

jvm的垃圾回收器以及触发full gc的场景

JVM&#xff08;Java虚拟机&#xff09;的垃圾回收器有很多种&#xff0c;主要包括以下几种&#xff1a; Serial收集器&#xff1a;串行收集器是最古老、最稳定的收集器。它使用单个线程进行垃圾收集工作&#xff0c;在进行垃圾回收时会暂停所有用户线程。 ParNew收集器&#…

nginx实时流量拷贝ngx_http_mirror_module

参考&#xff1a; Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口&#xff0c;想实时拷贝这个请求转发到自己的服务上&#xff0c;可以使用ngx_http_mirror_module模块。 官网好像…