Yelp 数据集进行用户画像, 使用聚类做推荐

使用 Yelp 数据集进行用户画像(User Profiling)是一项有趣的任务,可以理解用户的偏好、行为和特征。以下是总结的一个基本的步骤,帮助构建用户画像

pandas 加载数据:

import pandas as pd# 加载数据
users = pd.read_json('yelp_academic_dataset_user.json', lines=True)
reviews = pd.read_json('yelp_academic_dataset_review.json', lines=True)
business = pd.read_json('yelp_academic_dataset_business.json', lines=True)

yelp_academic_dataset_user.json包含了Yelp平台上用户的基本信息

yelp_academic_dataset_review.json包含了Yelp用户对商家的评论数据

yelp_academic_dataset_business.json包含了Yelp商家信息的数据

特征工程

用户特征

可以从用户数据和评论数据中提取以下特征:

  • 基本信息: 用户 ID、姓名、注册时间、城市等。
  • 行为特征:
    • 评论数量
    • 平均评分
    • 最高评分和最低评分
    • 喜欢的商家类型(通过评论的商家类别)
# 示例:计算用户特征
user_profile = reviews.groupby('user_id').agg({'stars': ['count', 'mean', 'max', 'min'],'business_id': 'nunique'
}).reset_index()user_profile.columns = ['user_id', 'review_count', 'average_stars', 'max_stars', 'min_stars', 'unique_business_count']
商家偏好
  • 用户喜欢的商家类型: 通过评论的商家类别统计用户的偏好。
# 示例:用户偏好商家类型
user_business_types = reviews.merge(business[['business_id', 'categories']], on='business_id')
user_business_types['categories'] = user_business_types['categories'].str.split(', ')
user_business_types = user_business_types.explode('categories')user_preference = user_business_types.groupby('user_id')['categories'].agg(lambda x: x.value_counts().index[0]).reset_index()
user_preference.columns = ['user_id', 'preferred_category']

可视化用户画像

使用 Matplotlib 或 Seaborn 可视化用户特征:

import seaborn as sns
import matplotlib.pyplot as plt# 示例:绘制用户评分分布
sns.histplot(user_profile['average_stars'], bins=5, kde=True)
plt.title('Average Stars Distribution')
plt.xlabel('Average Stars')
plt.ylabel('Frequency')
plt.show()

整理功能,优化代码并运行

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt# 加载数据
users = pd.read_json('yelp_academic_dataset_user.json', lines=True)
reviews = pd.read_json('yelp_academic_dataset_review.json', lines=True)
business = pd.read_json('yelp_academic_dataset_business.json', lines=True)# 选择必要的列以减少内存使用
reviews = reviews[['user_id', 'stars', 'business_id']]
business = business[['business_id', 'categories']]# 数据处理与特征工程
# 计算用户特征
user_profile = reviews.groupby('user_id').agg({'stars': ['count', 'mean', 'max', 'min'],'business_id': 'nunique'
}).reset_index()user_profile.columns = ['user_id', 'review_count', 'average_stars', 'max_stars', 'min_stars', 'unique_business_count']# 用户偏好商家类型
user_business_types = (reviews.merge(business, on='business_id').assign(categories=lambda x: x['categories'].str.split(', ')).explode('categories')
)# 处理可能为空的组
def get_most_common_category(x):if x.empty:return None  # 返回 None 或者一个默认值# 计算类别的最常见值counts = x.value_counts()if counts.empty:return None  # 如果没有值,返回 Nonereturn counts.idxmax()user_preference = user_business_types.groupby('user_id')['categories'].agg(get_most_common_category).reset_index()
user_preference.columns = ['user_id', 'preferred_category']# 可视化用户评分分布
plt.figure(figsize=(10, 6))
sns.histplot(user_profile['average_stars'], bins=5, kde=True)
plt.title('Average Stars Distribution')
plt.xlabel('Average Stars')
plt.ylabel('Frequency')# 保存图像到当前目录
plt.savefig('average_stars_distribution.png')# 显示图像(可选)
plt.show()

结果

进一步分析

  • 聚类分析: 使用 K-means 或其他聚类算法,根据用户特征将用户分为不同群体。根据用户画像,建立推荐系统为用户推荐商家。

使用scikit-learn进行训练

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import joblib# 加载数据
users = pd.read_json('yelp_academic_dataset_user.json', lines=True)
reviews = pd.read_json('yelp_academic_dataset_review.json', lines=True)
business = pd.read_json('yelp_academic_dataset_business.json', lines=True)# 选择必要的列以减少内存使用
reviews = reviews[['user_id', 'stars', 'business_id']]
business = business[['business_id', 'categories']]# 数据处理与特征工程
user_profile = reviews.groupby('user_id').agg({'stars': ['count', 'mean', 'max', 'min'],'business_id': 'nunique'
}).reset_index()user_profile.columns = ['user_id', 'review_count', 'average_stars', 'max_stars', 'min_stars', 'unique_business_count']# 进行 K-means 聚类
features = user_profile[['review_count', 'average_stars', 'max_stars', 'min_stars', 'unique_business_count']]
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)# 应用 K-means
kmeans = KMeans(n_clusters=3, random_state=42)  # 选择3个集群
user_profile['cluster'] = kmeans.fit_predict(scaled_features)# 保存模型和标准化器
joblib.dump(kmeans, 'kmeans_model.pkl')
joblib.dump(scaler, 'scaler.pkl')# 保存用户聚类结果
user_profile.to_csv('user_profile_with_clusters.csv', index=False)

kmeans_model.pkl

  • 作用: 保存训练后的 K-means 聚类模型。
  • 内容: 包含了聚类中心、聚类标签和模型的其他参数。通过这个文件,你可以在不需要重新训练模型的情况下,使用已经训练好的模型进行预测。
  • 使用场景: 当你需要对新的用户数据进行聚类或获取已经聚类的用户群体时,加载这个文件即可。

scaler.pkl

  • 作用: 保存数据标准化器(StandardScaler)。
  • 内容: 包含了用于标准化特征的数据(均值和标准差)。在训练模型时,特征需要被标准化,以确保不同特征的尺度一致。
  • 使用场景: 当你需要对新的用户特征进行预处理时,可以加载这个文件使用相同的标准化参数,以确保新数据的标准化与训练数据一致。

使用模型预测推荐代码

import pandas as pd
import joblib# 加载数据
reviews = pd.read_json('yelp_academic_dataset_review.json', lines=True)
business = pd.read_json('yelp_academic_dataset_business.json', lines=True)# 加载训练好的模型和标准化器
kmeans = joblib.load('kmeans_model.pkl')
scaler = joblib.load('scaler.pkl')
user_profile = pd.read_csv('user_profile_with_clusters.csv')# 基于聚类推荐商家
def recommend_business(user_id):# 获取用户的聚类user_cluster = user_profile[user_profile['user_id'] == user_id]['cluster'].values[0]# 找到同类用户cluster_users = user_profile[user_profile['cluster'] == user_cluster]['user_id']# 推荐该集群内其他用户高频评价的商家recommended_businesses = reviews[reviews['user_id'].isin(cluster_users)]['business_id'].value_counts().head(5)return recommended_businesses.index.tolist()# 示例:为某个用户推荐商家
sample_user_id = user_profile['user_id'].iloc[0]
recommended_businesses = recommend_business(sample_user_id)print(f"Recommended businesses for user {sample_user_id}: {recommended_businesses}")

返回推荐的business

Recommended businesses for user ---1lKK3aKOuomHnwAkAow: ['_ab50qdWOk0DdB6XOrBitw', 'ac1AeYqs8Z4_e2X5M3if2A', 'GXFMD0Z4jEVZBCsbPf4CTQ', 'ytynqOUb3hjKeJfRj5Tshw', 'oBNrLz4EDhiscSlbOl8uAw']
 

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

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

相关文章

JAVA题目笔记(十) 带有继承结构的JavaBean类

一、创建带有继承结构的标准JavaBean类(1) public class Worker {private String name;private int workid;private int salary;public Worker(){}public Worker(String name,int workid,int payment){this.namename;this.salarypayment;this.workidworkid;}public void eat(){…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用,KeepalivedMysql双主来实现MYSQL-HA,我们必须保证两台Mysql数据库的数据完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库…

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1:zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (𝑥,𝑦) ,表示从原点 (0,0)到点 (𝑥,𝑦)的有向线段。 1.1、文本向量 1…

串口屏控制的自动滑轨(未完工)

序言 疫情期间自己制作了一个自动滑轨,基于无线遥控的,但是整体太大了,非常不方便携带,所以重新设计了一个新的,以2020铝型材做导轨的滑轨,目前2020做滑轨已经很成熟了,配件也都非常便宜&#x…

如何使用Get进行状态管理

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 相关组件3. 示例代码4. 内容总结我们在上一章回中介绍了"使用get进行依赖管理"相关的内容,本章回中将介绍如何使用get进行状态管理一.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在Flutter开发中状态管理…

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录…

033_Structure_Static_In_Matlab求解结构静力学问题两套方法

结构静力学问题 静力学问现在是已经很简单的问题,在材料各向同性的情况下,对于弹性固体材料,很容易通过有限元求解。特别是线弹性问题,方程的矩阵形式可以很容易的写出(准确得说是很容易通过有限元表达)&a…

rnn/lstm 项目实战

tip:本项目用到的数据和代码在https://pan.baidu.com/s/1Cw6OSSWJevSv7T1ouk4B6Q?pwdz6w2 1. RNN : 预测股价 任务:基于zgpa_train.csv数据,建立RNN模型,预测股价 1.完成数据预处理,将序列数据转化为可用于RNN输入的数据 2.对新数据zgpa_test.csv进…

jenkins 构建报错 mvn: command not found

首先安装过 maven,并且配置过环境变量 win r ,输入 cmd 键入 mvn -v 出现上图输出,则证明安装成功。 原因 jenkins 没有 maven 配置全局属性, 导致无法找到 mvn 命令。 解决方案 找到全局属性,点击新增,配置 MAVEN_HOME 路…

轮廓图【HTML+CSS+JavaScript】

给大家分享一个很好看的轮播图,这个也是之前看到别人写的效果感觉很好看,所以后面也自己实现了一下,在这里分享给大家,希望大家也可以有所收获 轮播图效果: 视频效果有点浑浊,大家凑合着看,大家…

ChatGPT变AI搜索引擎!以后还需要谷歌吗?

前言 在北京时间11月1日凌晨,正值ChatGPT两岁生日之际,OpenAI宣布推出最新的人工智能搜索体验!具备实时网络功能!与 Google 展开直接竞争。 ChatGPT搜索的推出标志着ChatGPT成功消除了即时信息这一最后的短板。 这项新功能可供 …

Netty 组件介绍 - ByteBuf

直接内存&堆内存 ByteBuf buffer ByteBufAllocator.DEFAULT.heapBuffer(10);ByteBuf byteBuf ByteBufAllocator.DEFAULT.directBuffer(10); 组成 ByteBuf维护了两个不同的索引,一个用于读取,一个用于写入。 写入 内存回收 堆内存使用的是JVM内…

都快2025年了,来看看哪个编程语言才是时下热门吧

早上好啊,大佬们,今天咱们不讲知识,今天我们来看看时下热门的编程语言都是哪些,大佬们又都是在学哪些语言呢。 最近一些朋友和我在讨论哪个编程语言是现在 最好用 最厉害 的编程语言。 有人说,Python简单好用&#xf…

【雷达信号数据集】雷达脉冲活动分段的多级学习算法【附下载链接】

摘要 无线电信号识别是电子战中的一项重要功能。电子战系统需要精确识别和定位雷达脉冲活动,以产生有效的对抗措施。尽管这些任务很重要,但基于深度学习的雷达脉冲活动识别方法在很大程度上仍未得到充分探索。虽然之前已经探索了用于雷达调制识别的深度…

vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例

在vscode中,当我们安装了插件 PHP Debug(xdebug.php-debug)或者 xdebug.php-pack 后 我们通过内置默认的 php xdebug配置启动php项目后,默认情况下我们在vscode中设置断点是不会生效的,因为我们的内置php服务默认启动时…

(二 上)VB 2010 设计初步

目录 一、常用类应用 1.Console类控制台 2.窗体基本控件 二、面向对象程序设计 1.类和对象 2.对象的属性、方法、事件属 1.属性 2.方法 3.事件、事件过程 1.事件 2.事件过程 3.对象浏览器 三、.NET类库与命名空间 1.命名空间 常用命名空间 1.System命名空间 2.…

[CARLA系列--01]CARLA 0.9.15 在Windows下的安装教程(一)

Carla是一款开源的自动驾驶仿真器,它基本可以用来帮助训练自动驾驶的所有模块,包括感知系统,Localization, 规划系统等等.Carla这个产品目前已经更新到了最新的0.9.15版本,目前遇到好多人在windows系统上如何安装可编辑版的Carla遇到了好多问…

禾川HCQ1控制器程序编译报错如何解决

1、第一次打开用户程序 2、提示库未安装 3、安装库文件 4、脉冲轴库未安装 5、没有错误 去禾川自动化官网,把可以安装的包和库都安装下,程序编译就没有错误了。 6、下载相关包文件