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

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

  • 前言
  • 一、数据预处理
    • 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()

在这里插入图片描述

总结

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

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

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

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

相关文章

【绝对有用】yolo系列目标检测 核心技术点 汇总

YOLO (You Only Look Once) 是一种高效的目标检测算法&#xff0c;它以速度和精度著称。YOLO 的工作原理是将目标检测视为一个回归问题&#xff0c;直接从图像的像素空间预测目标的类别和位置。YOLO 目标检测头包括以下几个关键部分&#xff1a; 输入图像处理&#xff1a; YOLO…

原、反、补码之间的相互转换以及计算机硬件实现有符号数、无符号数、定点小数、定点整数的加减法运算

目录 原、反、补码之间的相互转换 无符号整数的加减运算 无符号整数的加法运算 无符号整数的减法运算 有符号整数的加减运算 有符号整数补码的加法运算 有符号整数补码的减法运算 定点小数的加减运算 定点小数补码的加法运算 定点小数补码的减法运算 定点小数VS定点整…

Advantest 93000测试机中CLOCK DOMAIN 详解

爱德万测试&#xff08;Advantest&#xff09;的V93000系列测试系统是一个高度模块化和可扩展的平台&#xff0c;专为复杂和高性能的半导体器件测试而设计&#xff0c;包括系统级芯片&#xff08;SoC&#xff09;、存储器、射频&#xff08;RF&#xff09;和混合信号器件等。在…

Apple Intelligence,我们能得到什么?(上)

苹果公司WWDC 2024发布会&#xff0c;苹果AI成为最吸睛的焦点。不过&#xff0c;苹果的AI不是大家口中的AI&#xff0c;而是苹果独有的概念&#xff1a;Apple Intelligence&#xff0c;苹果智能。 所谓Apple Intelligence&#xff0c;被定义为iPhone、iPad和Mac的个人智能系统…

Android U Settings 应用中 APN 菜单实现的代码逻辑

功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…

Day35:2734. 执行字串操作后的字典序最小字符串

Leetcode 2734. 执行字串操作后的字典序最小字符串 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以完成以下行为&#xff1a; 选择 s 的任一非空子字符串&#xff0c;可能是整个字符串&#xff0c;接着将字符串中的每一个字符替换为英文字母表中的前…

摒弃反模式:使用Kotlin委托优化Android BaseActivity

摒弃反模式&#xff1a;使用Kotlin委托优化Android BaseActivity 在Android开发中&#xff0c;许多开发者习惯于创建名为“BaseActivity”或“BaseFragment”的基类&#xff0c;以便在所有Activity或Fragment中共享一些通用行为。这种方法乍一看似乎是个好主意&#xff0c;但实…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错&#xff1a;Key exchange failed 原因&#xff1a; ssh客户端与服务器的公钥协商失败&#xff0c;SecureCRT客户端所指定的秘钥交换算法&#xff08;KexAlgorithms &#xff09;&#xff0c;不在服务端支持范围内。可能是服务端的sshd版…

预警与校准并行:可燃气体报警器在矿区井下甲烷泄露防控中的应用

在矿区井下作业中&#xff0c;甲烷泄露是一个严重威胁工人生命安全和矿区生产安全的隐患。因此&#xff0c;及时、准确地预警甲烷泄露并采取相应的处理措施显得尤为重要。 可燃气体报警器作为一种有效的监测工具&#xff0c;在预防甲烷泄露事故中发挥着不可替代的作用。 在这…

Linux通过expect实现免交互

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

5. PyTorch+NCCL源码编译

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包第5章 PyTorchNCCL源码编译 目录 系列文章前言一、本地环境二、安装cudnn三、使用pytorch自带NCCL库进行编译安装1. 源码编译2. 查看版本和all_reduce测…

Nature推荐的三种ChatGPT论文写作指令(含PDF下载)

1. 润色学术论文 ChatGPT学术润色指令&#xff1a; “I’m writing a paper on [topic]for a leading [discipline] academic journal. WhatItried to say in the following section is [specific point]. Please rephrase itfor clarity, coherence and conciseness, ensuri…

电脑系统重装怎么操作?分享四个win10重装系统方法

“我遇到了一些笔记本电脑的问题&#xff0c;别人告诉我解决这个问题需要重新安装Win10电脑系统。但我不记得我把光盘放在哪里了&#xff0c;我能否在不丢失文件的情况下重新安装操作系统&#xff1f;电脑系统重装怎么操作&#xff1f;”虽然电脑自带系统中有多种方法可供选择&…

嵌入式工程师从0开始,到底该学什么,怎么学

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;嵌入式是个大筐&#xff0…

C++之STL(十二)

1、容器适配器 #include <iostream> #include <stack> #include <list> #include <queue> #include <functional> #include <iterator>using namespace std;int main() {// 栈&#xff08;先进后出filo&#xff09;stack<int, list<…

boss直聘招聘数据爬取及可视化分析2.0

boss直聘招聘数据爬取及可视化分析2.0 一、需求介绍二、完整代码2.1 爬虫代码2.2 数据可视化模块一、需求介绍 笔者在前两篇介绍boss直聘招聘数据爬取和可视化分析的博客的基础上,对代码和功能进行了完善。在数据爬取的模块,代码更加简洁易懂,且性能更加稳定;在数据可视化…

【AI大模型】Transformers大模型库(十四):Datasets Viewer

目录 一、引言 二、Datasets Viewer数据查看器 2.1 概述 2.2 示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transformers 提供了数以千计的预训练…

linux的安全技术和防火墙

一、安全技术 1.入侵检测系统&#xff1a;特点式不阻断网络访问&#xff0c;主要式提供报警和事后监督&#xff0c;不主动介入&#xff0c;默默的看着你&#xff08;相当于360安全卫士&#xff09; 2.入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包&#xff0c;网…

音频——性能测试中的基本概念

文章目录 频率响应平均电平增益ADC 路径增益DAC 路径增益底噪信噪比总谐波失真+噪声(THD+N)延迟频率响应 对于音频设备,频率响应可以理解为音频设备对不同频率信号的处理或重现。对于音频信号频率,一般关注20Hz~20kHz范围。理想情况下,输入幅度相同的不同频率信号,过音频…

springboot社区维修平台

设计技术&#xff1a; springboot、mysql、maven、前端vue 主要功能&#xff1a; 住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理等功能模块。 管理员功能模块 管理员通过后台登录页面…