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  # 如果没有值,返回 None
    return 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']
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程,包括设计环境的建立,布图规划包括模块尺寸的确定,IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要, 影响芯片的布线资…

前端路由如何从0开始配置?vue-router 的使用

在 Web 开发中,路由是指根据 URL 的不同部分将请求分发到不同的处理函数或页面的过程。路由是单页应用(SPA, Single Page Application)和服务器端渲染(SSR, Server-Side Rendering)应用中的一个重要概念。 在开发中如何…

强化学习的数学原理-06随即近似理论和随机梯度下降

文章目录 Robbins-Monro algorithmStochastic gradient descentBGD、MBGD、 and SGDSummary Robbins-Monro algorithm 迭代式求平均数的算法 S t o c h a s t i c a p p r o x i m a t i o n ( S A ) Stochastic \; approximation \;(SA) Stochasticapproximation(SA)&#xf…

Apache Hive 通过Docker快速入门

QuickStarted 介绍 在伪分布式模式下在 docker 容器内运行 Apache Hive,以便为 Hive 提供以下快速启动/调试/准备测试环境 快速入门 步骤 1:拉取镜像 从 DockerHub 拉取镜像:https://hub.docker.com/r/apache/hive/tags。以下是最新的镜像…

【K8S系列】Kubernetes 中 NodePort 类型的 Service 无法访问的问题【已解决】

在 Kubernetes 中,NodePort 类型的 Service 允许用户通过每个节点的 IP 地址和指定的端口访问应用程序。如果 NodePort 类型的 Service 无法通过节点的 IP 地址和指定端口进行访问,可能会导致用户无法访问应用。本文将详细分析该问题的常见原因及其解决方…

逻辑卷动态扩容与缩容-----

一、创建逻辑卷 需求:创建一个2.5G大小的逻辑卷 思路: 1. 物理的设备 2. 将物理设备做成物理卷 pv 3. 创建卷组并将物理卷加入其中 vg 4. 创建逻辑卷 lv 5. 格式化逻辑卷 mkfs.ext4 6. 挂载使用 mount 步骤: 1. 物理设备【如何来分区】…

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

论文 | Ignore Previous Prompt: Attack Techniques For Language Models

这篇论文探讨了针对大型语言模型&#xff08;LLM&#xff09;的“提示注入”攻击&#xff0c;并提出了一种名为 PROMPTINJECT 的框架来研究这类攻击。 论文的主要内容包括&#xff1a;1. 提示注入攻击&#xff1a; 论文定义了“提示注入”的概念&#xff0c;即通过在用…

Django-中间件

定义&#xff1a; 编写中间件&#xff1a; 注册中间件&#xff1a; 添加中间件&#xff1a; 1.在项目目录下添加一个文件夹&#xff08;名字随意&#xff09;&#xff0c;然后文件夹下创建.py文件 2.将中间件添加到setting文件中 MIDDLEWARE [django.middleware.security.Se…

MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT

编辑&#xff1a;ll MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT 型号&#xff1a;MBR20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

操作数据表

创建表 创建表语法&#xff1a; CREATE TABLE table_name ( field1 datatype [COMMENT 注释内容], field2 datatype [COMMENT 注释内容], field3 datatype ); 注意&#xff1a; 1. 蓝色字体为关键字 2. CREATE TABLE 是创建数据表的固定关键字&#xff0c;表…

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的&#xff0c;为了更好的学习&#xff0c;可以划分为以下几大类&#xff1a; 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

【Docker】构建Linux云桌面环境

目录 一、说明 二、离线安装Docker 1&#xff09;将下载的包上传到服务器上去 2&#xff09;安装docker 3) 启动docker 4&#xff09;配置加速器 三、安装云桌面镜像 四、启动云桌面 方式一&#xff1a;docker命令直接运行 方式二&#xff1a;docker-compose方式 五…

Easysearch 与 LLM 融合打造知识库系统

文章目录 一、LangChain 简介二、RAG 产生的背景及其局限性三、RAG 工作流程四、 Easysearch 结合 LLM 实现 RAG&#xff08;1&#xff09;Easysearch 简介&#xff08;2&#xff09;结合实现RAG 五、 Easysearch 结合 LLM 实现 RAG 的优势&#xff08;1&#xff09;提高检索准…

驱动-----adc

在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

FileLink跨网文件传输与传统文件传输对比

在数字化时代&#xff0c;文件传输已成为企业日常运营不可或缺的一部分。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;传统的文件传输方式逐渐暴露出诸多不足。本文将对比FileLink跨网文件传输与传统文件传输方式&#xff0c;揭示FileLink在高效性、安全性和…