使用聚类(K-means)分析方法对骑手进行分类标签定义

news/2024/5/3 8:51:35/文章来源:https://blog.csdn.net/q838458640/article/details/126485476

什么是聚类分析

        聚类分析的目标就是在相似的基础上收集数据来分类,属于无监督学习。就是通过行为数据,通过算法将相似的人群聚集在一起,形成不带标签的人群簇。再人为的对人群簇进行分析,寻找特征标签。

一、数据构建

        根据骑手的行为数据,可以从 日均活跃时长、工作日/非工作日、高峰期/平峰期、白天/夜间、骑手年龄等 可能存在喜好偏差的行为数据,进行数据构建。

#基础包导入(有很多无关的,懒的删除了,哈哈哈

from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
import seaborn as snsimport matplotlib
#指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
from pyhive import hive
import os
def presto_read_sql_df(sql):conn=prestodb.dbapi.connect(host=os.environ['PRESTO_HOST'],port=os.environ['PRESTO_PORT'],user=os.environ['JUPYTER_HADOOP_USER'],password=os.environ['HADOOP_USER_PASSWORD'],catalog='hive')cur = conn.cursor()cur.execute(sql)query_result = cur.fetchall() colnames = [part[0] for part in cur.description]raw = pd.DataFrame(query_result, columns=colnames,dtype=np.float64)return rawdef hive_read_sql_df(sql):conn = hive.connect(host=os.environ['PYHIVE_HOST'], port=os.environ['PYHIVE_PORT'],username=os.environ['JUPYTER_HADOOP_USER'],password=os.environ['HADOOP_USER_PASSWORD'],auth='LDAP',configuration={'mapreduce.job.queuename': os.environ['JUPYTER_HADOOP_QUEUE'],'hive.resultset.use.unique.column.names':'false'})raw = pd.read_sql_query(sql,conn)return raw

#数据读取(可以用hive,也可以直接读取文件 

df = hive_read_sql_df("""select * from XXX """)
df.to_csv('XXXXX.csv',encoding='gbk',sep=',',index = False)

 #从文件读取数据

# 路径调整 
# print(os.getcwd())
# os.chdir('/home/')
# print(os.getcwd())data = pd.read_csv('XXXXXX.csv',encoding='gbk')

 #可能会存在部分缺失值导致后续运行报错,先将缺失值进行剔除 

df = data  
df.describe() #数据预览 
print(df.isnull().any()) #缺失值判断 
df.dropna(inplace=True) #删除缺失值 
print(df.isnull().any()) #缺失值判断 
df.describe() #数据预览 
# df = df.query("main_city_tsh_rate > 0.15") #数据筛选
# df = df.drop('age',axis=1)   #删除无关列_id = df['_id']  #先将dri_id单独存储,在分类后再加回去
td = df.drop('_id',axis=1)   #删除_id列

#数据标准化,避免数据的量纲对分类产生权重影响,对数据进行标准化 

        使用Z分数标准化数据:Z分数_百度百科

#数据标准化处理——z分数: x = (x - x.mean()) /x.std()td.tsh_avg =  (td.tsh_avg -td.tsh_avg.mean()) / td.tsh_avg.std() 

二、超参数K值回归

        K,即K-means聚类产生的结果数,k-means不会自主决定聚类的结果数,需要人为的指定。人为指定通常存在一些误判,可通过手肘法、轮廓系数法进行回归计算,从而选择最优的超参数K。                

2.1手肘法

(由于我的数据量比较大,且有倾向性的希望结果在6-14之间,所以K的范围选择6-14,也可根据自己的需求定义范围) 

# '利用SSE选择k'   选择斜率最小的点作为K 
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# '利用SSE选择k'
SSE = []  # 存放每次结果的误差平方和
for k in range(6, 15):estimator = KMeans(n_clusters = k,max_iter = 10000,random_state = 10) estimator = estimator.fit(x) SSE.append(estimator.inertia_)print(k)
X = range(6, 15)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()

K=10,拐点不是非常显著,但基于我的业务需求,倾向将K定义为10 

2.2轮廓系数法:

# 选择最高点作为K Scores = []  # 存放轮廓系数
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
for k in range(6, 15):estimator = KMeans(n_clusters = k,max_iter = 10000,random_state = 10) estimator = estimator.fit(x)Scores.append(silhouette_score(x, estimator.labels_, metric='euclidean'))print(k )
X = range(6, 15)
plt.xlabel('k')
plt.ylabel('轮廓系数')
plt.plot(X, Scores, 'o-')

 这个方法数据量大时巨慢,结果没跑出来(大家可以自己尝试下,选择方法可以参考下图,选择K=3,即轮廓系数最大值,理论可参考原文

 

2.3Gap Statistic 法:

具体可大家再深入,我内网环境没安装成功

from gap_statistic import OptimalKdef gap_statistic_K(data, range_K, pro_num):K = np.arange(1, range_K)optimalK = OptimalK(n_jobs=1, parallel_backend='joblib')n_clusters = optimalK(data, cluster_array=K)# Gap values plotplt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df.gap_value, linewidth=3)plt.scatter(optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].n_clusters,optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].gap_value, s=250, c='r')plt.grid(True)plt.xlabel('Cluster Count')plt.ylabel('Gap Value')plt.title('Gap Values by Cluster Count')plt.savefig(f'/Users/cecilia/Desktop/K_图片/{pro_num}_gap_values_K.jpg')plt.cla()# plt.show()return n_clusters

三、聚类方法——K-means 

n_clusters = 10 ,即结果为10类

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 10,max_iter = 10000,random_state = 10)    #构建模型
y = kmeans.fit(td)
# y = kmeans.fit(x)
label_pred = y.labels_#获取聚类标签
df['_type'] = label_pred
df.to_csv('result_v4.csv',encoding='gbk',sep=',',index = False)  ##先将结果保存下来
dri_type_cnt = df.groupby('_type').count()._id # 画图,plt.bar()可以画柱状图
for i in range(len(dri_type_cnt)):plt.bar(i, dri_type_cnt[i])
# 设置图片名称
plt.title("各簇人数")
# 设置x轴标签名
plt.xlabel("簇标签")
# 设置y轴标签名
plt.ylabel("人数")
# 显示
plt.show()dri_type_mean  = df.groupby('dri_type').mean()
dri_type_mean.to_csv('group_mean_v5.csv',encoding='gbk',sep=',',index = False) ##根据均值寻找人群簇特征 

 k-means会将人群分为10类,根据每个特征值,可以对人群进行标签定义 

四、聚类结果白盒化

        因为算法实现的可解释性较差理解成本高,且容易受特征波动有较大变化;基于用户显著性特征对类群进行白盒规则化。

        即根据人群的特征,将人群标签的定义规则进行明确,根据明确的规则,对人群进行直接的标签划分,便于数据的产出和标签的稳定。(此处可根据人群簇的特征值作为参考,也可结合业务的体感进行判断,或者数据分布进行去尾、去头等,无绝对准确的规则,更多的是业务体感)

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

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

相关文章

电脑重装系统开机后运行慢怎么办

小编就给大家分享四个电脑运行慢的方法,可以选择适合自己的方法去使用,一般情况都是可以解决掉电脑开机后运行慢的问题,我们接着看看吧。 还有其它的电脑重装系统方法 工具/原料: 系统版本:windows7系统 品牌版本&a…

Leetcode题解——30. 包含min函数的栈(辅助栈思想)

题目地址:剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode) 目录 一.算法思想 二.代码实现 三.拓展思考 首先说结论,这道题虽然难度不大,但是算法思想很重要,是辅助栈应用的生动实例。 所以&#xff…

(10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】

(1)工业界推荐系统-小红书推荐场景及内部实践【业务指标、链路、ItemCF】 (2)工业界推荐系统-小红书推荐场景及内部实践【UserCF、离线特征处理】 (3)工业界推荐系统-小红书推荐场景及内部实践【矩阵补充、…

VSCode 配置 C++ 环境

开学了,后面更新速度会更慢,望周知。 接上回: https://blog.csdn.net/orangebench11/article/details/126111356 先说一下, 这个教程不是给完整json复制粘贴, 是要跟教程配置 (放心, 大部分配置都很简单)。 安装VSCode 官网: Visual Studio Code - C…

2021年研究生数模B题论文记录

2021年研究生数模B题论文记录1.常见数据处理方法:2.相关性系数选择3.聚类算法4.一种数据降维方式5.预测模型文章来源 2021年全国大学生研究生数学建模竞赛优秀论文集合,B题,文章编号:B21100130067 1.常见数据处理方法:…

Golang高性能日志库zap + lumberjack 日志切割组件详解

文章篇幅较长,可以先收藏防止迷路~ 目录zap日志库1. why zap?2. 简单使用3. 自定义logger例子4. Gin项目使用zap6. lumberjack 日志切割组件zap日志库 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中&a…

Java刷题面试系列习题(六)

文章目录前言Java题目练习⭕题目一: 统计一句话中重复单词的个数🌟代码演示💯思路解析⭕题目二: map简单应用🌟代码演示💯思路解析⭕题目三: 集合排序🌟代码演示💯思路解…

分享查题公众号制作过程

分享查题公众号制作过程 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转&#xf…

不要再把数据可视化搞成表面工程,论数据可视化的正确逻辑

日前,我国网民规模达10.51亿的消息上了热搜,点进去看才发现是中国互联网络信息中心(CNNIC)发布了最新的《中国互联网络发展状况统计报告》,其中有很多值得思考的信息,也为未来发展指明了大的方向。就比如网…

Linux内核设计与实现 第一章 Linux内核简介

1.1Unix的历史 1969,贝尔实验室的程序员Dennis Ritchie 和Ken Thompsin等,编写Multics失败,不甘心没有交互式操作系统,设计了一个文件系统原型,这个原型最终演化成了Unix。 Unix系统设计简洁,发布时提供源代码&#x…

AviX Ergo 改善工作条件的视觉人体工程学

随着装配线的要求越来越复杂,人体工程学正成为关注的焦点。AviX Ergo 通过视频评估带来了一种全新的方法来改善工作场所的人体工程学。 AviX Ergo 将 AviX 方法对工作场所的深入分析与公认的 Borg CR-10 量表相结合,以确定工作场所的生理压力水平,同时评估心理压力。 1、BOR…

uniapp一键生成iOS通用链接

第一步:开启Associated Domains服务 登录苹果开发者中心 ,在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID,确保开启Associated Domains服务 开启Associated Domains服务后需要重新生成profile文…

即时零售加速布局,社区团购的优势依旧非常明显

新零售业态不断发展,线上便捷性和个性化推荐优势逐步放大,线下渠道智能化水平持续提升,线上线下渠道趋向深度融合。即时零售、无接触消费和直播带货等新消费场景加快布局并保持发展势头。随着社会环境的变化以及购物需求的旺盛刺激&#xff0…

跨越技术鸿沟,革新存储产业:华瑞指数云重磅发布下一代软件定义存储产品

2022年8月31日,由华瑞指数云(ExponTech)主办的“全自研下一代软件定义存储产品体验沙龙”在北京圆满举办。发布会现场,华瑞指数云重磅推出全自研极速分布式块存储产品WDS 。这是继2021年11月24日该公司在中国数据与存储峰会发布Wi…

Django之路由层

目录 django请求生命周期流程图 路由匹配 分组命名匹配 无名分组 有名分组 传递额外的参数给视图函数 命名URL 和 URL反向解析 命名URL URL反向解析--前端 URL反向解析---后端 无名分组反向解析 有名分组反向解析 路由分发 名称空间 django请求生命周期流程图 dj…

Tomcat的安装与优化

目录 一、安装Tomcat所需javajdk环境 ①安装jdk ②设置jdk环境变量 ③加载生效,查看版本 二、安装Tomcat ①解压 ②改名,移动位置 ③优化管理 ④启动关闭 ⑤浏览器进入本地地址,添加8080端口即可进入tomcat服务器 三、优化tomcat启动…

什么是伪共享?Java8如何使用@sun.misc.Contended避免伪共享?

什么是伪共享 缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无…

网课搜题公众号接口 大学生新手使用必备

网课搜题公众号接口 大学生新手使用必备 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后…

风控模型黑箱可解释,试下这个方法来演示

模型的开发,目前在互金领域场景中因为变量多,开发周期短,目前用得最多的就是XGB、LGB这类的机器学习模型。 比如我们之前跟大家输出的关于个人信贷反欺诈评分卡的开发内容里,我们用的就是lightgbm来建模的,相关的操作细…

设计模式--简单工厂方法

简介 简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式通过定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,这个父类具有共有的属性和方法。因在简单工厂模式中用于创建实例的方法通常是静态方法,因此也称为静态工厂方…