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

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

  • 前言
  • 一、数据预处理
    • 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.rhkb.cn/news/362263.html

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

相关文章

Android高级面试_2_IPC相关

Android 高级面试-3&#xff1a;语言相关 1、Java 相关 1.1 缓存相关 问题&#xff1a;LruCache 的原理&#xff1f; 问题&#xff1a;DiskLruCache 的原理&#xff1f; LruCache 用来实现基于内存的缓存&#xff0c;LRU 就是最近最少使用的意思&#xff0c;LruCache 基于L…

Vue3 + Element-plus + TS —— 动态表格自由编辑

前期回顾 《 穿越时空的代码、在回首&#xff1a;Evil.js两年后的全新解读 》-CSDN博客 Vue3 TS Element-Plus 封装Tree组件 《亲测可用》_ https://blog.csdn.net/m0_57904695/article/details/131664157?spm1001.2014.3001.5501 态表格 自由编辑 目录 ♻️ 效果图…

深圳技术大学oj B : 所有不含逆序对的组合数

Description 数组中可能包含重复的数字&#xff0c; 求由这些数字组成的不重复字符串&#xff0c; 且字符串中不包含逆序对。 Input 有若干组测试数据&#xff0c;&#xff08;1&#xff5e;20之间&#xff09; 每一组测试数据第一行输入一个整数 n (0 ≤ n ≤ 20)&#xff…

【仿真建模-anylogic】ViewArea解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-27 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 应用场景 view area又叫视图区域&#xff0c;其作用是在presentation中标记一块区域&#xff0c;便于动画演示过程中快速切换可视区…

U盘提示格式化怎么搞定?本文有5种方法(内含教程)

U盘提示格式化是一种常见故障&#xff0c;即&#xff1a;当U盘插入电脑后&#xff0c;电脑上弹出对话框&#xff0c;提示该U盘需要格式化才能使用。 接触不良、文件系统损坏、热插拔、感染病毒、芯片损坏等原因都可能导致U盘出现此故障。这时点击“格式化”&#xff0c;大概率会…

Linux通过expect实现免交互

免交互 Here Document 用于将多行字符串直接传递给命令的方式&#xff0c;不需要人为交互命令界面&#xff0c;实现免交互 当使用Here Document操作文件时&#xff0c;需要借助一个文件结束符 EOF&#xff1a;文件结束符 示例 在脚本文件中写入以下内容 <<&#x…

Android 13 修改系统导航默认值

Android 13 原生系统上&#xff0c;设置-系统-手势-系统导航 菜单&#xff0c;可以修改系统导航方式。 手势导航&#xff1a; 三按钮导航&#xff1a; adb 获取当前导航方式&#xff0c;手势导航 是 2 &#xff0c;三按钮导航是 0 。 settings get secure navigation_mode 修…

《Mybatis-Plus》系列文章目录

什么是 MyBatis-Plus&#xff1f; Mybatis-Plus是一个在MyBatis基础上进行增强和扩展的开源Java持久层框架。 Mybatis-Plus&#xff08;简称MP&#xff09;旨在简化开发、提高效率&#xff0c;通过提供一系列便捷的功能和工具&#xff0c;大幅度减少开发人员编写重复代码的时…

RT-Thread Studio实现静态线程

1创建项目 &#xff08;STM32F03ZET6&#xff09; RT-Thread项目与RT-Thread Nano 项目区别 RT-Thread: 完整版&#xff1a;这是RT-Thread的完整形态&#xff0c;适用于资源较丰富的物联网设备。功能&#xff1a;它提供了全面的中间件组件&#xff0c;如文件系统、网络协议栈、…

Go语言之集合类型

个人网站&#xff1a; http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-6…

swiper轮播 loop:true失效解决

数据是写死的时候&#xff0c;能够loop:true是有效的;数据是动态获取的loop:true就会失效。 方法一&#xff1a;在接收到数据后&#xff0c;使用 setTimeout(() > {this.getSwiper(); //生成swiper方法}, 0); 下面是我项目具体使用的参考例子&#xff1a; 方法二&#xff…

问题:ERROR:ldd outputLine:“libprotobuf.so.28 => not found“

想要在Ubuntu上面运行QT打包程序&#xff0c;出现一些问题报错&#xff1a; ERROR:ldd outputLine:"libprotobuf.so.28 > not found" 首先确定一下libprotobuf.so.28的位置&#xff1a; 然后建立一个软链接&#xff1a; ln -s /xxx/xxx/xx.so /usr/lib/xx.so #…

今天不看文章,明天变垃圾(明天收费)-----字节数据分析发展过程中所遭遇的挑战

字节数据分析发展过程中所遭遇的挑战 三个核心议题&#xff1a; 海量数据分析性能&#xff1a;会议指出Spark分析性能不足成为了一个显著问题&#xff0c;尤其是在需要毫秒级响应的业务场景中。实时导入与查询能力&#xff1a;目前Kylin只能以T1的形式提供分析服务&#xff0…

C# 信号量的使用

学习来源&#xff1a;《.net core 底层入门》 第六章第9节&#xff1a;信号量 案例&#xff1a;主线程负责添加数据&#xff0c;子线程负责获取数据 使用SemaphoreSlim&#xff08;轻信号量&#xff09;实现&#xff1a; using System; using System.Collections.Generic; us…

560.滑动窗口最大值

滑动窗口最大值 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目大意&#xff0c;返回每个窗口内的最大值。 思路-优先队列 优先队列&#xff08;堆&#xff09;&#xff0c;其中的大根堆可以实时维护一系列元素中的最大值。 每当我们向右移动窗口时&#…

vue3+ts <script setup lang=“ts“> element-plus的el-date-picker设置默认日期

效果图&#xff08;单个日期&#xff09;&#xff1a; utils.ts&#xff1a; /*** 格式化时间戳* param {number} timestamp 时间戳* param {string} format 格式* returns {string}*/ export const formatTimeStamp (timestamp: number, format: string) > {if (!timesta…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

Linux-笔记 嵌入式gdb远程调试

目录 前言 实现 1、内核配置 2、GDB移植 3、准备调试程序 4、开始调试 前言 gdb调试器是基于命令行的GNU项目调试器&#xff0c;通过gdb工具我们可以实现许多调试手段&#xff0c;同时gdb支持多种语言&#xff0c;兼容性很强。 在桌面 Linux 系统&#xff08;如 Ubuntu、Cent…

【Java】微博系统设计:怎么应对热点事件的突发访问压力?

一、问题解析 微博&#xff08;microblog&#xff09;是一种允许用户即时更新简短文本&#xff08;比如140个字符&#xff09;&#xff0c;并可以公开发布的微型博客形式。今天我们就来开发一个面向全球用户、可以支持10亿级用户体量的微博系统&#xff0c;系统名称为“Weitte…

2024连云港等保测评机构看这里!

2024连云港等保测评机构看这里&#xff01; 目前连云港暂未有具有等保资质的机构。因此连云港企业可以就近选择江苏省内等保测评机构&#xff0c;或者在网上寻找合适的机构。 连云港城市简单介绍 连云港——江苏省辖地级市&#xff0c;地处沿海中部&#xff0c;东濒黄海&…