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

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

  • 前言
  • 一、数据预处理
    • 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,一经查实,立即删除!

相关文章

GPU和CPU的架构分别是怎样的,有什么本质区别?GPU及CPU的架构在AI上的不同,和他们的技术体系区别

GPU 和 CPU 的架构及其在 AI 上的不同 引言 CPU&#xff08;中央处理器&#xff09;和 GPU&#xff08;图形处理单元&#xff09;是计算机系统中最重要的两种处理器。它们各自的架构设计和技术体系决定了其在不同应用领域中的性能和效率。本文将详细分析 CPU 和 GPU 的架构&a…

【代码随想录算法训练营第五十一天|115.不同的子序列、583. 两个字符串的删除操作、72.编辑距离】

文章目录 115.不同的子序列[583. 两个字符串的删除操作](https://leetcode.cn/problems/delete-operation-for-two-strings/description/)72.编辑距离 115.不同的子序列 dp数组表示s和t中前i-1和j-1项中s中出现过的t的次数&#xff0c;递推公式中当选择到s的第i-1的元素和t[j-…

java.io.Closeable接口介绍

java.io.Closeable 是 Java 标准库中的一个接口,位于 java.io 包中。它用于表示可以关闭的资源,例如文件流、网络连接等。实现了 Closeable 接口的类可以通过调用 close() 方法来释放资源。这对于确保资源不被泄漏非常重要。 使用 Closeable 接口主要是为了确保在使用完某些…

雅思词汇及发音积累 2024.6.27

monument /ˈmɒnjumənt/ n.纪念碑&#xff0c;纪念馆&#xff0c;纪念物&#xff1b;遗址&#xff0c;名胜古迹&#xff1b;典范&#xff1b;塑像&#xff0c;墓碑&#xff1b;有永久价值的作品 描述人的外表、衣着 gender 性别 medium build 中等身材 average height 不高不…

elasticsearch运维系列_用户及角色权限相关SQL及脚本整理

这篇文章介绍ES运维过程中一些常用查询权限和角色的命令和脚本&#xff0c;以及如何查询某个索引可被系统中哪些用户访问。 Part1 查询用户及权限 1 查询所有用户 首先&#xff0c;获取所有用户的列表&#xff1a; -- 命令如下 curl -u elastic:esuser -X GET "http:/…

git rebase的使用

没有排版&#xff0c;但是干货 因为项目要求&#xff0c;所以使用rebase指令 我使用的是rebase 的分支变基的功能 情景描述&#xff1a; 一共有两个分支&#xff1a;master owner 我在owner分枝上开发&#xff0c;有好多次commit master上也有同事在正常commit&#xff0c; …

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;我发现了一本特别适合孩子们的书…

Linux Vim最全面的教程如下

Linux Vim最全面的教程如下&#xff1a; 一、Vim简介 Vim&#xff08;Vi Improved&#xff09;是Linux系统下的一款强大的文本编辑器&#xff0c;具有多模式、高效、可配置等特点。Vim是Vi编辑器的进阶版&#xff0c;提供了更多的功能和更友好的用户界面。 二、Vim的基本模式…

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;发现工具呈灰色不可用。这是由于扩展模块中没有将该模块做勾选设置导致的。下面介绍一下如何解决地统计分析工具不可用…