Python数据分析与机器学习在电子商务推荐系统中的应用

news2024/12/25 9:20:15

文章目录

  • 📑引言
  • 一、推荐系统的类型
  • 二、数据收集与预处理
    • 2.1 数据收集
    • 2.2 数据预处理
  • 三、基于内容的推荐
    • 3.1 特征提取
    • 3.2 计算相似度
    • 3.3 推荐物品
  • 四、协同过滤推荐
    • 4.1 基于用户的协同过滤
    • 4.2 基于物品的协同过滤
  • 五、混合推荐与评估推荐系统
    • 5.1 结合推荐结果
    • 5.2 评估推荐系统
  • 六、小结

📑引言

在现代电子商务平台上,推荐系统是提升用户体验和增加销售额的关键工具。推荐系统能够根据用户的行为和偏好,推荐个性化的产品,帮助用户发现他们可能感兴趣的商品。Python作为一种强大的编程语言,结合其丰富的数据分析和机器学习库,成为构建推荐系统的理想选择。本文将探讨Python数据分析与机器学习在电子商务推荐系统中的应用,详细介绍构建推荐系统的步骤和技术。

一、推荐系统的类型

推荐系统主要分为三类:基于内容的推荐、协同过滤推荐和混合推荐。

  1. 基于内容的推荐:根据用户过去喜欢的物品的特征,推荐具有类似特征的物品。例如,如果用户喜欢某本书,系统会推荐内容类似的书籍。
  2. 协同过滤推荐:根据用户的行为数据(例如评分、点击等),推荐其他用户喜欢的物品。这种方法又分为基于用户的协同过滤和基于物品的协同过滤。
  3. 混合推荐:结合多种推荐方法,以提高推荐的准确性和覆盖率。

image.png

二、数据收集与预处理

在构建推荐系统之前,需要收集并预处理数据。电子商务平台上可以收集的数据包括用户行为数据(点击、浏览、购买等)、用户属性数据(年龄、性别等)和物品属性数据(类别、价格等)。

2.1 数据收集

数据收集可以通过日志系统、数据库查询和第三方API等方式实现。以下是一个简单的示例,展示如何从数据库中收集用户行为数据:

import pandas as pd
import sqlite3

# 连接到SQLite数据库
conn = sqlite3.connect('ecommerce.db')

# 查询用户行为数据
query = '''
SELECT user_id, item_id, rating, timestamp
FROM user_behaviors
'''
df = pd.read_sql_query(query, conn)

# 关闭数据库连接
conn.close()

# 查看数据
print(df.head())

2.2 数据预处理

数据预处理是数据分析和机器学习的关键步骤。它包括数据清洗、处理缺失值、特征工程等。

# 数据清洗:去除重复记录
df = df.drop_duplicates()

# 处理缺失值:填充或删除缺失值
df = df.dropna()

# 特征工程:提取时间特征
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['hour'] = df['timestamp'].dt.hour
df['dayofweek'] = df['timestamp'].dt.dayofweek

# 查看预处理后的数据
print(df.head())

三、基于内容的推荐

基于内容的推荐系统通过分析物品的特征来进行推荐。例如,假设有用户A喜欢某本书,我们可以推荐其他内容相似的书籍给用户A。

3.1 特征提取

首先,需要从物品描述中提取特征。可以使用TF-IDF(词频-逆文档频率)方法将文本描述转换为特征向量。

from sklearn.feature_extraction.text import TfidfVectorizer

# 示例物品描述数据
descriptions = [
    "Python for data analysis",
    "Machine learning with Python",
    "Data science and big data",
    "Advanced Python programming"
]

# 使用TF-IDF提取特征
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(descriptions)

# 查看特征向量
print(tfidf_matrix.toarray())

3.2 计算相似度

接下来,使用余弦相似度计算物品之间的相似度。

from sklearn.metrics.pairwise import cosine_similarity

# 计算余弦相似度
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

# 查看相似度矩阵
print(cosine_sim)

3.3 推荐物品

根据相似度矩阵,可以为每个物品推荐相似的物品。

# 推荐函数
def recommend(item_index, cosine_sim=cosine_sim):
    # 获取相似度分数
    sim_scores = list(enumerate(cosine_sim[item_index]))
    
    # 按相似度排序
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    
    # 返回相似度最高的前5个物品
    sim_scores = sim_scores[1:6]
    item_indices = [i[0] for i in sim_scores]
    return item_indices

# 示例推荐
recommended_items = recommend(0)
print("Recommended items:", recommended_items)

image.png

四、协同过滤推荐

协同过滤推荐系统通过用户行为数据(如评分)来推荐物品。它包括基于用户的协同过滤和基于物品的协同过滤。

4.1 基于用户的协同过滤

基于用户的协同过滤通过找到相似用户来推荐物品。

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split
from scipy.sparse import csr_matrix

# 示例用户评分数据
ratings = {
    'user_id': [1, 1, 1, 2, 2, 3, 3, 4],
    'item_id': [1, 2, 3, 1, 4, 2, 3, 4],
    'rating': [5, 3, 4, 4, 2, 5, 3, 4]
}
df_ratings = pd.DataFrame(ratings)

# 创建用户-物品评分矩阵
user_item_matrix = df_ratings.pivot(index='user_id', columns='item_id', values='rating').fillna(0)
user_item_sparse = csr_matrix(user_item_matrix.values)

# 计算用户相似度
user_sim = cosine_similarity(user_item_sparse)

# 查看用户相似度矩阵
print(user_sim)

根据用户相似度矩阵,可以为每个用户推荐相似用户喜欢的物品。

# 推荐函数
def user_based_recommend(user_id, user_sim=user_sim, user_item_matrix=user_item_matrix, top_k=5):
    user_index = user_id - 1
    sim_scores = user_sim[user_index]
    sim_users = list(enumerate(sim_scores))
    sim_users = sorted(sim_users, key=lambda x: x[1], reverse=True)
    sim_users = sim_users[1:top_k+1]
    
    recommended_items = set()
    for sim_user, _ in sim_users:
        sim_user_id = sim_user + 1
        sim_user_items = set(user_item_matrix.columns[user_item_matrix.loc[sim_user_id] > 0])
        recommended_items.update(sim_user_items)
    
    user_items = set(user_item_matrix.columns[user_item_matrix.loc[user_id] > 0])
    recommended_items.difference_update(user_items)
    
    return list(recommended_items)

# 示例推荐
recommended_items = user_based_recommend(1)
print("Recommended items for user 1:", recommended_items)

4.2 基于物品的协同过滤

基于物品的协同过滤通过找到相似物品来推荐物品。

# 计算物品相似度
item_sim = cosine_similarity(user_item_sparse.T)

# 查看物品相似度矩阵
print(item_sim)

根据物品相似度矩阵,可以为每个物品推荐相似物品。

# 推荐函数
def item_based_recommend(user_id, item_sim=item_sim, user_item_matrix=user_item_matrix, top_k=5):
    user_items = user_item_matrix.loc[user_id]
    sim_scores = item_sim.dot(user_items)
    sim_scores = list(enumerate(sim_scores))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    recommended_items = [i[0] + 1 for i in sim_scores if user_items[i[0]] == 0][:top_k]
    return recommended_items

# 示例推荐
recommended_items = item_based_recommend(1)
print("Recommended items for user 1:", recommended_items)

五、混合推荐与评估推荐系统

混合推荐结合了基于内容的推荐和协同过滤推荐,以提高推荐系统的性能。

5.1 结合推荐结果

通过结合基于内容的推荐和协同过滤推荐的结果,可以得到更为精准的推荐。

def hybrid_recommend(user_id, item_index, content_weight=0.5, user_weight=0.25, item_weight=0.25):
    content_recs = recommend(item_index)
    user_recs = user_based_recommend(user_id)
    item_recs = item_based_recommend(user_id)
    
    all_recs = content_recs + user_recs + item_recs
    recs_counts = pd.Series(all_recs).value_counts()
    weighted_recs = recs_counts * [content_weight] * len(content_recs) + recs_counts * [user_weight] * len(user_recs) + recs_counts * [item_weight] * len(item_recs)
    weighted_recs = weighted_recs.sort_values(

ascending=False)
    
    return list(weighted_recs.index[:5])

# 示例推荐
recommended_items = hybrid_recommend(1, 0)
print("Hybrid recommended items for user 1:", recommended_items)

5.2 评估推荐系统

推荐系统的评估是确保其有效性的关键。常用的评估指标包括准确率、召回率、F1值和平均准确率(MAP)。

from sklearn.metrics import precision_score, recall_score, f1_score, average_precision_score

# 示例真实值和预测值
true_labels = [1, 1, 0, 0, 1, 0, 1, 0]
pred_labels = [1, 0, 0, 1, 1, 0, 1, 1]

# 计算评估指标
precision = precision_score(true_labels, pred_labels)
recall = recall_score(true_labels, pred_labels)
f1 = f1_score(true_labels, pred_labels)
map_score = average_precision_score(true_labels, pred_labels)

# 输出评估结果
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"F1 Score: {f1:.2f}")
print(f"MAP: {map_score:.2f}")

六、小结

本篇,我们了解了Python在电子商务推荐系统中的应用,从数据收集、预处理到推荐算法的实现,再到系统的评估。基于内容的推荐、协同过滤推荐和混合推荐各有优劣,具体应用中可以根据需求选择合适的方法。利用Python丰富的数据分析和机器学习库,可以快速构建高效的推荐系统,提升电子商务平台的用户体验和销售额。
推荐系统是一个不断迭代和优化的过程,需要根据实际情况进行调整和改进。希望本文的内容能够为大家在构建推荐系统时提供一些参考和帮助。

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

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

相关文章

抓包工具 HttpAnalyzerFull_V7.6.4 的下载、安装、使用

目录 一、简介二、下载和安装三、如何注册四、使用介绍4.1 开始、停止、清空监控内容4.2 筛选监控内容4.3 监控内容显示 一、简介 Http Analyzer 是一款功能强大的数据包分析工具,它可以实时监控服务器返回的消息,支持64位Windows系统,可以同…

go语言后端开发学习(三)——基于validator包实现接口校验

前言 在我们开发模块的时候,有一个问题是我们必须要去考虑的,它就是如何进行入参校验,在gin框架的博客中我就介绍过一些常见的参数校验,大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证,而这个其实也不是能够完全应对我…

MYSQL 索引下推 45讲

刘老师群里,看到一位小友 问<MYSQL 45讲>林晓斌的回答 大意是一个组合索引 (a,b,c) 条件 a > 5 and a <10 and b123, 这样的情况下是如何? 林老师给的回答是 A>5 ,然后下推B123 小友 问 "为什么不是先 进行范围查询,然后在索引下推 b123?" 然后就…

python数据分析-Matplotlib绘图实例以及金融数据分析应用

通过学习扩展库matplotlib及背后的理论知识进行数据分析和可视化&#xff0c;重点以案例分析为主&#xff0c;通过实际案例演示相关理论和Python语言的应用。 读取文件countries-aggregated.csv数据&#xff0c;其中Date&#xff1a;日期, Country&#xff1a;国家, Confirmed…

格式化后硬盘数据能恢复吗?硬盘数据恢复这样做!

硬盘是电脑中必备的数据存储设备&#xff0c;另外还有移动硬盘。移动硬盘存储空间非常大、性价比高、便于携带&#xff0c;给我们带来和很多便利。但是和其他存储设备一样&#xff0c;各种硬盘也会出现各种问题&#xff0c;比如常见的格式化硬盘导致数据丢失的问题。 怎么样恢复…

【Linux系统化学习】网络层——IP协议

目录 IP协议 协议头格式 两个问题 网段划分 IP地址的分类 CIDR网段划分&#xff08;无分类编址&#xff09; 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 路由表的查询 IP协议 应用层、运输层上两层协议我们只考虑的是通信的双方对应层&#xff0c;…

MQ解决的问题

系统中MQ能解决哪些问题&#xff1f; 1.不同语言的程序使用MQ通信 2.分布式&#xff0c;微服务&#xff0c;之间的通信&#xff0c;实现服务质检解耦 3.高并发实现销峰作用 4.实现异步&#xff0c;提高用户体验。

Java的自动装箱和自动拆箱

自动装箱和拆箱在Java开发中的应用与注意事项 在Java开发中&#xff0c;自动装箱&#xff08;Autoboxing&#xff09;和自动拆箱&#xff08;Unboxing&#xff09;是指基本数据类型与其对应的包装类之间的自动转换。这些特性可以使代码更加简洁和易读&#xff0c;但在实际项目…

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的&#xff0c;关注过程&#xff08;分析求解问题的步骤&#xff09; 例如&#xff1a;外卖&#xff0c;关注点菜&#xff0c;接单&#xff0c;送单等 C是面向对象的&#xff0c;关注对象&#xff0c;把一件事拆分成不同的对象&…

机器学习笔记——支持向量机

支持向量机 参数模型对分布需要假设&#xff08;这也是与非参数模型的区别之一&#xff09;间隔最大化&#xff0c;形式转化为凸二次规划问题 最大化间隔 间隔最大化是意思&#xff1a;对训练集有着充分大的确信度来分类训练数据&#xff0c;最难以分的点也有足够大的信度将…

-31-()

在终端运行时消除输入空格对程序的影响可以使用{在scanf后加“getchar()”或者在scanf&#xff08;“空格%d”,&a&#xff09;} 按位与和移位操作符只能用于整数且都要转位二进制后进行相应操作 不创建临时变量&#xff0c;实现两个数的交换&#xff1a;1——使用加减法&…

插卡式仪器模块:数据记录模块(插卡式)

• 32 位分辨率 • 250 KSPS 采样率 • 可以同时并且连续地记录两个通道的电压输入 • 实时上传原始数据至 PC 端 通道22输入阻抗电压22 kΩ10 MΩ电流0.2 Ω输入范围电压 250 mV 4.5 V电流1.5 A耦合DCDC带宽450 Hz385 HzADC 分辨率32 Bits24 Bits采样率10 kSPS250 kSPS测量…

【最新鸿蒙应用开发】——类Web开发范式1——生命周期

兼容JS的类Web开发范式 类Web命令式开发的生命周期 1. 应用生命周期 1.1. app.js 每个应用可以在app.js自定义应用级生命周期的实现逻辑&#xff0c;包括&#xff1a; onCreate&#xff1a;在应用生成时被调用的生命周期函数。 onDestroy&#xff1a;在应用销毁时被调用的生…

高德地图简单实现点标,和区域绘制

高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart 百度搜索高德地图开发平台 注册高德地图开发账号 在应用管理中 我的应用中 添加一个Key 点击提交 进入高德地图开发文档:https://lbs.amap.com/api/javascript-api/guide/abc/quickstart …

详解FedProx:FedAvg的改进版 Federated optimization in heterogeneous networks

FedProx&#xff1a;2020 FedAvg的改进 论文&#xff1a;《Federated Optimization in Heterogeneous Networks》 引用量&#xff1a;4445 源码地址&#xff1a; 官方实现&#xff08;tensorflow&#xff09;https://github.com/litian96/FedProx 几个pytorch实现&#xff1a;…

【激光雷达】

激光雷达 机械式360扫描雷达半固态激光雷达二维扫描一维扫描 固态激光雷达OPA固态激光雷达&#xff08; 光学相控阵技术&#xff09;Flash激光雷达 FMCW 激光雷达 激光雷达技术在近几年可以说是蓬勃发展&#xff0c;新能源汽车的大量使用&#xff0c;给雷达技术的发展提供了肥沃…

C++系统编程篇——linux编译器 gcc/g++(链接动静态库)

linux编译器-gcc/g &#xff08;1&#xff09;g安装&#xff08;gcc一般自带&#xff0c;g需要下载&#xff09; sudo yum install -y gcc-c g --version gcc用于编译C语言代码&#xff0c;g用于编译C代码 &#xff08;2&#xff09;程序翻译过程 选项“-o”是指目标文件…

Python的else子句7个妙用,原来还能这样用,整挺好!

## 1、条件语句else基础 &#x1f504; 1.1 简单else的常规操作 在Python中&#xff0c;else子句通常跟在if或一系列if-elif之后&#xff0c;提供一个“否则”的情况处理路径。如果前面的所有条件都不满足 &#xff0c;程序就会执行这里的代码块。例如 &#xff0c;检查一个数…

目标检测(R-CNN)系列(Pytorch 26)

一 R-CNN 除了之前描述的单发多框检测之外&#xff0c;区域卷积神经网络&#xff08;region‐based CNN或regions with CNN features&#xff0c; R‐CNN&#xff09;(Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。下面介绍R‐CNN及其一 系列改进方法…

【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置. 1.基本概念 MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis. 2013年11月迁移到Github.持久层…