机器学习-数据预处理-聚类-回归-分类-单车数据集

机器学习-数据预处理-聚类-回归-分类-单车数据集

  • 前言
  • 一、数据预处理
    • 1. 导入数据集
    • 2. 数据预处理
    • 3. 处理缺失值
    • 4. 生成特征用于后续进一步的分析
  • 二、数据分布可视化
    • 1. 骑行时长分布
    • 2. 起始站和终点站分布可视化
    • 3. 高峰期与非高峰期骑行频次分布
  • 三、聚类分析
    • 1. K-means聚类
  • 四、回归分析
    • 1.线性回归
    • 2. XGBoost回归
  • 五、分类分析
    • 1.使用随机森林进行分类
  • 总结

前言

数据集已经上传到了我的资源里面,对于这个数据集,将进行数据预处理,然后进行k-means聚类、使用线性回归进行回归、使用XGBoost进行回归分析,并且进行分类预测。

一、数据预处理

1. 导入数据集

import pandas as pd
import numpy as np
df = pd.read_csv(r"YourPath\考查-单车.csv")
df.head(10)

2. 数据预处理

# 检查空缺值
print(df.isnull().sum())
# 转换时间格式
df['Start date'] = pd.to_datetime(df['Start date'])
df['End date'] = pd.to_datetime(df['End date'])
# 骑行时长合理性检查(假设合理时长为1分钟到4小时)
df = df[(df['Total duration (ms)'] >= 60000) & (df['Total duration (ms)'] <= 14400000)]

通过检查isnull()判断了是否有空缺值,然后把时间格式转化了一下,同时检查了一下骑行时长的合理性,得到的结果为:
在这里插入图片描述

3. 处理缺失值

从上面的结果可以看到“Start station number”和“End station number”列存在着缺失值,所以需要对这两个数据进行处理,可以直接的删去这一行,但是我这里选择的是用众数来进行填补,因为我觉得这行数据应该错误不是很大,还是有用的,因为他的持续时间啥的都是有的,如果是特别关键的元素值缺失了,就直接去掉这一行是最好的:

# 处理缺失值,使用众数填补
start_station_mode = df['Start station number'].mode()[0]
end_station_mode = df['End station number'].mode()[0]df['Start station number'].fillna(start_station_mode, inplace=True)
df['End station number'].fillna(end_station_mode, inplace=True)
# 再次检查空缺值
print(df.isnull().sum())

通过再次检查这些缺失值,可以发现,确实没了缺失值,所以是正确的处理:
在这里插入图片描述

4. 生成特征用于后续进一步的分析

# 生成新特征:时间段
df['hour'] = df['Start date'].dt.hour
df['is_peak'] = df['hour'].apply(lambda x: 1 if (6 <= x <= 10) or (16 <= x <= 20) else 0)# 生成新特征:工作日/周末
df['is_weekend'] = df['Start date'].dt.weekday.apply(lambda x: 1 if x >= 5 else 0)print(df.head(10))

二、数据分布可视化

1. 骑行时长分布

import matplotlib.pyplot as plt
plt. rcParams [ 'font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt. rcParams [ 'axes.unicode_minus']=False #用来正常显示负号# 骑行时长分布
plt.hist(df['Total duration (ms)'] / 60000, bins=50, color='blue', alpha=0.7)
plt.xlabel('骑行时长(分钟)')
plt.ylabel('频数')
plt.title('骑行时长分布')
plt.show()

直接就是导包然后很常规的解决这个matplotlib的中文的问题,然后统计出每次骑行的交互数据与骑行时长的关系,这样我们就可以很直观的看到每次骑行多久的人是最多的。
在这里插入图片描述

2. 起始站和终点站分布可视化

# 起始站分布
start_station_counts = df['Start station'].value_counts().head(10)
start_station_counts.plot(kind='bar', color='green', alpha=0.7)
plt.xlabel('起始站')
plt.ylabel('频数')
plt.title('前十起始站分布')
plt.show()# 终点站分布
end_station_counts = df['End station'].value_counts().head(10)
end_station_counts.plot(kind='bar', color='red', alpha=0.7)
plt.xlabel('终点站')
plt.ylabel('频数')
plt.title('前十终点站分布')
plt.show()

在这里插入图片描述
在这里插入图片描述

3. 高峰期与非高峰期骑行频次分布

# 高峰期与非高峰期骑行频次分布
peak_counts = df['is_peak'].value_counts()
peak_counts.plot(kind='bar', color=['red', 'blue'], alpha=0.7)
plt.xlabel('是否高峰期')
plt.ylabel('频数')
plt.title('高峰期与非高峰期骑行频次分布')
plt.show()

在这里插入图片描述
上面的代码都比较类似,就是计算出每一类每一种的各种数量,然后作为Y轴然后自己选择的属性作为X轴可视化展示出来就行。

三、聚类分析

1. K-means聚类

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score# 提取相关特征
features = df[['Start station number', 'End station number', 'Total duration (ms)']]
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)# 使用KMeans进行聚类分析
kmeans = KMeans(n_clusters=5, random_state=0)
clusters = kmeans.fit_predict(scaled_features)
df['Cluster'] = clusters# 聚类结果可视化
plt.scatter(df['Start station number'], df['End station number'], c=df['Cluster'], cmap='viridis', alpha=0.5)
plt.xlabel('起始站编号')
plt.ylabel('终点站编号')
plt.title('用户行为聚类分析')
plt.show()# 计算轮廓系数
silhouette_avg = silhouette_score(scaled_features, clusters)
print("轮廓系数:", silhouette_avg)

在这里插入图片描述

也可以选用更多的聚类方法去实现,更多的关于聚类的信息可以看这篇文章:聚类

四、回归分析

1.线性回归

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 特征和目标变量
X = df[['Start station number', 'End station number', 'Bike model']]
y = df['Total duration (ms)']# 将分类变量转化为数值变量
X = pd.get_dummies(X, columns=['Bike model'], drop_first=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 训练线性回归模型
lr = LinearRegression()
lr.fit(X_train, y_train)# 预测并评估模型
y_pred = lr.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'均方误差: {mse}')# 预测结果可视化
plt.scatter(y_test, y_pred, alpha=0.5)
plt.xlabel('实际骑行时长(毫秒)')
plt.ylabel('预测骑行时长(毫秒)')
plt.title('骑行时长预测')
plt.show()

这个就是直接使用线性回归,来预测骑行时长
在这里插入图片描述
均方误差还是比较大的,图形的拟合效果也并不好,说明可能不是很适合去使用线性回归,关于线性回归可以看这里:线性回归

2. XGBoost回归

XGBoost是一种高效的梯度提升树,并且使用了更多特征进行这个XGBoost回归分析:

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 特征和目标变量
X = df[['Start station number', 'End station number', 'Bike model', 'hour', 'is_weekend']]
y = df['Total duration (ms)']# 将分类变量转化为数值变量
X = pd.get_dummies(X, columns=['Bike model'], drop_first=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 训练XGBoost模型
xgb_model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.1)
xgb_model.fit(X_train, y_train)# 预测并评估模型
y_pred = xgb_model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'均方误差: {mse}')# 预测结果可视化
plt.scatter(y_test, y_pred, alpha=0.5)
plt.xlabel('实际骑行时长(秒)')
plt.ylabel('预测骑行时长(秒)')
plt.title('骑行时长预测')
plt.show()

在这里插入图片描述

五、分类分析

其实这个数据集并不是适合或者需要分类,强行分类一下,我这里用的是随机森林,还可以用很多别的分类,可以看看这篇:分类

1.使用随机森林进行分类

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report# 特征和目标变量
X = df[['Start station number', 'End station number', 'Bike model', 'Total duration (ms)', 'is_weekend']]
y = df['is_peak']# 将分类变量转化为数值变量
X = pd.get_dummies(X, columns=['Bike model'], drop_first=True)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 训练随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)# 预测并评估模型
y_pred = rf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy}')
print(classification_report(y_test, y_pred))# 预测结果可视化
plt.scatter(X_test['Total duration (ms)'], y_test, alpha=0.5, label='Actual')
plt.scatter(X_test['Total duration (ms)'], y_pred, alpha=0.5, label='Predicted')
plt.xlabel('骑行时长(秒)')
plt.ylabel('是否高峰期')
plt.title('高峰期骑行预测')
plt.legend()
plt.show()

在这里插入图片描述

总结

这篇主要是完成了数据的预处理、特征工程、可视化分析和多种机器学习模型的应用。对这个单车数据进行了聚类、回归、分类并进行可视化。

如果您觉得这篇文章对您有帮助,希望您能给我点个赞,谢谢!

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

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

相关文章

Vue2 - 首页登录实现随机验证码组件的封装与实现详解(详细的注释及常见问题汇总)

在网站首页等登录时,随机验证码在现代网络应用中扮演着重要的安全角色。为了帮助开发者轻松集成和使用随机验证码功能,本文将介绍如何利用 Vue.js 2 封装一个简单而功能强大的随机验证码组件。让你能够快速理解并应用这一组件到你的项目中。 一、解决方案 本文提供了完美便捷…

HMI 的 UI 风格,精妙无比

HMI 的 UI 风格&#xff0c;精妙无比

【Pillow】module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘问题解决

问题描述 我在使用 SummaryWriter 记录图片数据日志时&#xff0c;遇到了报错&#xff0c;如下图所示&#xff1a; 问题的原因在于&#xff0c;使用的pillow版本已经舍弃了ANTIALIAS&#xff0c;在新版本中已经改为了LANCZOS 问题解决 两种解决方式&#xff1a; 修改源码更…

C#——this关键字详情

this关键字 在 C# 中&#xff0c;可以使用 this 关键字来表示当前对象&#xff0c;日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。 使用this表示当前类的对象 执行结果 使用 this 关键字串联构造函数 执行结果 使用 this 关键字作为类的索引器 执行结果 …

冷门赛道,视频号励志语录赛道详解,新手轻松上手

大家好&#xff0c;我是闷声轻创&#xff0c;在当今数字化时代&#xff0c;社交媒体已成为人们获取信息、分享生活和实现个人价值的重要渠道。视频号&#xff0c;作为新兴的短视频平台&#xff0c;以其独特的优势和巨大的流量潜力&#xff0c;吸引了众多创作者的目光。今天我将…

Ci2451和Ci2454:2.4GHz无线MCU的芯片对比数据资料分析

一、2.4GHz无线MCU芯片的背景介绍 1、开头我们先聊聊&#xff0c;关于南京中科微2.4GHz无线MCU芯片&#xff08;Ci2451、Ci2454、CSM2433)是建立在现有的2.4GHz射频芯片基础上面&#xff0c;它的内部是集成了8位RISC内核&#xff0c;且集成丰富的MCU资源、更小的尺寸可以来满足…

用心选择,用爱呵护《米小圈上学记》和孩子一起热爱校园生活

作为家长&#xff0c;我们时常为孩子的教育和成长担忧&#xff0c;尤其是在选择适合他们阅读的书籍时更是如此。一本好的儿童读物不仅要有趣&#xff0c;还应该能够激发孩子的想象力&#xff0c;培养他们的品格与勇气。在这个过程中&#xff0c;我发现了一本特别适合孩子们的书…

FME实现批量合并shapefile文件数据,并提取原文件名,输出到属性表字段中的解决方法

目录 一、实现效果 二、实现过程 1.读取数据 2.暴露文件名属性 3.设置文件名字段 4.输出成果 5.模板的使用 三、总结 今天来介绍如何使用FME软件来实现对多个shapefile数据进行批量合并&#xff0c;同时提取原文件名并存储到合并后shapefile数据属性表字段中的方法&…

深入剖析Tomcat(十、十一) 详解StandardWrapper

《深入剖析Tomcat》第十章介绍了Tomcat的安全机制&#xff0c;主要就是对servlet的访问做安全验证&#xff0c;如果Tomcat中设置了某些servlet需要指定角色的用户才能访问&#xff0c;则需要客户端进行登录验证&#xff0c;如果用户名密码正确并且该用户拥有该角色的话&#xf…

windows git配置多个账号

window下git多账号配置_百度搜索 (baidu.com) 最重要的是这里生成新的id_rsa文件的时候&#xff0c;bash窗口是在 .ssh路径下 其实就是这个窗口在什么路径下执行的就是生成在什么路径 下面窗口路径不对&#xff0c;不是Desktop&#xff0c;应该是.ssh 如果是Desktop或者任何一…

2024-6-24(沉默Netty,MongoDB)

1.Netty概念 Netty 是一个基于 JAVA NIO 类库的异步通信框架&#xff0c;它的架构特点是&#xff1a;异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。 Dubbo&#xff0c;Kafka&#xff0c;ES等框架都是基于Netty开发的&#xff0c;可以把Netty理解为进行网络编程的…

数据库管理-第209期 HaloDB-Oracle兼容性测试01(20240621)

数据库管理209期 2024-06-21 数据库管理-第209期 HaloDB兼容性测试&#xff08;20240621&#xff09;1 数据类型2 字段默认值3 序列总结 数据库管理-第209期 HaloDB兼容性测试&#xff08;20240621&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Or…

Arcgis地统计分析工具灰色不可用 解决方法

使用Arcmap&#xff0c;调用地统计分析工具&#xff08;Geostatistical Analyst&#xff09;下的探索数据&#xff08;Explore Data&#xff09;&#xff0c;发现工具呈灰色不可用。这是由于扩展模块中没有将该模块做勾选设置导致的。下面介绍一下如何解决地统计分析工具不可用…

小型智能驱鸟器,建筑驱鸟专用

随着城市化进程的加快&#xff0c;鸟类与人类的居住空间逐渐交织重合&#xff0c;鸟类对建筑物的侵扰问题也愈发凸显。家庭庭院、住宅窗前、屋顶&#xff0c;甚至那些承载着历史与文化底蕴的名胜古迹和精美雕像&#xff0c;都时常受到鸟粪的污染。鸟粪具有腐蚀性且很难清理&…

应用监控pinpoint调研

参考 https://blog.csdn.net/Rose_juvenile/article/details/135285508?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-135285508-blog-132330996.235^v43^pc_blog_bottom_relevance_base6&spm1001.2101.3001.4242.1&a…

Windows中配置python3.11环境安装教程

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、软件的下载和安装2.1 下载2.2 安装2.3 验证安装结果 三、最后 开篇说明 应要求为…

DB-GPT Docker部署

感谢阅读 拉取镜像linux判断拉取是否成功的方法windows判断拉取是否成功的方法 模型以及启动容器模型启动容器 界面如下&#xff08;0.56&#xff09;&#xff1a; 拉取镜像 docker pull eosphorosai/dbgpt:latestlinux判断拉取是否成功的方法 docker images | grep "eo…

龙国南方航空滑块acw_v2+cookie+风控处理+type后缀

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁…

中小企业的数字化转型业务场景落地案例

引言&#xff1a;随着商业活动的复杂化和全球化程度的提高&#xff0c;合同作为商业交易的重要组成部分&#xff0c;其数量、条款和复杂性都在不断增加。企业面临着越来越多的合同管理挑战&#xff0c;包括合同数量增多、条款繁琐、文件分散存储等问题。而中小企业由于管理不到…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…