热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

共享单车C语言开发项目:全面分析与实现

在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。

一、提出问题

在本项目中,参与者被要求将历史使用模式与天气数据相结合,以便预测华盛顿特区的自行车租赁计划中的自行车租赁需求。

二、理解数据

2.1 收集数据

一般而言,数据由甲方提供。若甲方不提供数据,则需要根据相关问题从网络爬取,或者以问卷调查形式收集。本次共享单车数据分析项目数据源于Kaggle。获取数据后需要对数据整体进行分析,从而提炼问题,为后续建模奠定基础。

首先查看Kaggle所提供的数据描述:

(1)    日期时间:年/月/日/时间,例:2011/1/1 0:00

(2)    季节:1=春,2=夏,3=秋天,4=冬天

(3)    假日:是否是节假日(0=否,1=是)

(4)    工作日:是否是工作日(0=否,1=是)

(5)    天气:1=晴天、多云等(良好),2=阴天薄雾等(普通),3=小雪、小雨等(稍差),4=大雨、冰雹等(极差)

(6)    实际温度(℃)

(7)    感觉温度(℃)

(8)    湿度

(9)    风速

(10)未注册用户租借数量

(11)注册用户租借数量

(12)总租借数量

根据官方数据描述,特征为前9项,分别为日期时间(1)、季节(2)、工作日/节假日(3-4)、天气(5-9)四类;标签为后3项:注册/未注册用户租借数量以及租借总数。因为官方规定的提交文件中要求预测的只有租借总数,因此本项目中只关注租借总数的预测。

2.2导入并理解数据

首先导入并查看训练数据和测试数据:import pandas as pd

#导入并查看训练数据和测试数据

train_data = pd.read_csv('data/train.csv')

test_data = pd.read_csv('data/test.csv')

print(train_data.shape)

print(train_data.info())

print(test_data.shape)

print(test_data.info())

训练数据共12列,10886行,测试数据共9列,6493行,且所有数据完整,没有缺失。相比于训练数据,测试数据缺少注册/未注册用户租借数量以及租借总数3个标签,需要我们通过建模进行预测。

三、数据处理与分析

3.1 数据预处理

在数据处理过程中,最好将训练数据与测试数据合并在一起处理,方便特征的转换。通过查看数据,训练和测试数据均无缺失、不一致和非法等问题。值得注意的是,日期时间特征由年、月、日和具体小时组成,还可以根据日期计算其星期,因此可以将日期时间拆分成年、月、日、时和星期5个特征。#第二步:数据预处理

#合并两种数据,使之共同进行数据规范化

data = train_data.append(test_data)

#拆分年、月、日、时

data['year'] = data.datetime.apply(lambda x: x.split()[0].split('-')[0])

data['year'] = data['year'].apply(lambda x: int(x))

data['month'] = data.datetime.apply(lambda x: x.split()[0].split('-')[1])

data['month'] = data['month'].apply(lambda x: int(x))

data['day'] = data.datetime.apply(lambda x: x.split()[0].split('-')[2])

data['day'] = data['day'].apply(lambda x: int(x))

data['hour'] = data.datetime.apply(lambda x: x.split()[1].split(':')[0])

data['hour'] = data['hour'].apply(lambda x: int(x))

data['date'] = data.datetime.apply(lambda x: x.split()[0])

data['weekday'] = pd.to_datetime(data['date']).dt.weekday_name

data['weekday']=data['weekday'].map({'Monday':1,'Tuesday':2,'Wednesday':3, 'Thursday':4,'Friday':5,'Saturday':6,'Sunday':7})

data = data.drop('datetime',axis=1)

#重新安排整体数据的特征

cols =['year','month','day','weekday','hour','season','holiday','workingday','weather','temp','atemp','humidity','windspeed','casual','registered','count']data = data.ix[:,cols]

#分离训练数据与测试数据

train = data.iloc[:10886]

test = data.iloc[10886:]

3.2 数据分析

规范数据后,快速查看各影响因素对租借数的影响:#第三步:特征工程

#1、计算相关系数,并快速查看

correlation = train.corr()

influence_order = correlation['count'].sort_values(ascending=False)

influence_order_abs = abs(correlation['count']).sort_values(ascending=False)

print(influence_order)

print(influence_order_abs)

dadf7f786ee8

从相关系数可以看出,天气(包括温度、湿度)对租借数存在明显影响,其中temp和atemp的意义及其与count的相关系数十分接近,因此可以只取atemp作为温度特征。此外,year、month、season等时间因素对count也存在明显影响,而holiday和weekday与count的相关系数极小。

为了更加直观地展现所有特征之间的影响,作相关系数热力图:#2、作相关性分析的热力图

import matplotlib.pyplot as plt

import seaborn as sn

f,ax = plt.subplots(figsize=(16,16))

cmap = sn.cubehelix_palette(light=1,as_cmap=True)

sn.heatmap(correlation,annot=True,center=1,cmap=cmap,linewidths=1,ax=ax)

sn.heatmap(correlation,vmax=1,square=True,annot=True,linewidths=1)

plt.show()

dadf7f786ee8

接下来,深入分析各特征对租借数的影响规律,对每个特征进行可视化:#3、每个特征对租借量的影响

#(1) 时间维度——年份

sn.boxplot(train['year'],train['count'])

plt.title("The influence of year")

plt.show()

#(2) 时间维度——月份

sn.pointplot(train['month'],train['count'])

plt.title("The influence of month")

plt.show()

#(3) 时间维度——季节

sn.boxplot(train['season'],train['count'])

plt.title("The influence of season")

plt.show()

#(4) 时间维度——时间(小时)

sn.barplot(train['hour'],train['count'])

plt.title("The influence of hour")

plt.show()

(1)年份对租借数的影响

dadf7f786ee8

2012年的租借数明显比2011年高,说明随着时间的推移,共享单车逐渐被更多的人熟悉和认可,使用者越来越多。

(2)月份对租借数的影响

dadf7f786ee8

月份对租借数影响显著,从1月份开始每月的租借数快速增加,到6月份达到顶峰,随后至10月缓慢降低,10月后急剧减少。这明显与季节有关。

(3)季节对租借数的影响

dadf7f786ee8

通过各季度箱型图可以看出季节对租借数的影响符合预期:春季天气仍然寒冷,骑车人少;随着天气转暖,骑车人逐渐增多,并在秋季(天气最适宜时)达到顶峰;随后进入冬季,天气变冷,骑车人减少。因为月份和季节对租借数的影响重合,且月份更加详细,因此在随后的建模过程中选取月份特征,删除季节特征。

(4)时间(小时)对租借数的影响

dadf7f786ee8

从时间的分布上来看,每天有两个高峰期,分别是早上8点左右和下午17点左右,正好是工作日的上下班高峰期。而介于两者之间的白天时间变化规律不明显,可能与节假日有关,因此以此为基础需要考虑节假日和星期的影响。#星期、节假日和工作日的影响

fig, axes = plt.subplots(2,1,figsize=(16, 10))

ax1 = plt.subplot(2,1,1)

sn.pointplot(train['hour'],train['count'],hue=train['weekday'],ax=ax1)

ax1.set_title("The influence of hour (weekday)")

ax2 = plt.subplot(2,2,3)

sn.pointplot(train['hour'],train['count'],hue=train['workingday'],ax=ax2)

ax2.set_title("The influence of hour (workingday)")

ax3 = plt.subplot(2,2,4)

sn.pointplot(train['hour'],train['count'],hue=train['holiday'],ax=ax3)

ax3.set_title("The influence of hour (holiday)")

plt.show()

dadf7f786ee8

可以看出,工作日早晚上班高峰期租借量高,其余时间租借量低;节假日中午及午后租借量较高,符合节假日人们出行用车的规律。

(5)天气对租借数的影响#(5) 天气的影响

sn.boxplot(train['weather'],train['count'])

plt.title("The influence of weather")

plt.show()

dadf7f786ee8

(6)具体天气因素(温度、湿度和风速)的影响#(6) 温度、湿度、风速的影响

cols = ['temp', 'atemp', 'humidity', 'windspeed', 'count']sn.pairplot(train[cols])

plt.show()

dadf7f786ee8

作出多个连续变量之间的相关图,可以比较任意两个连续变量之间的关系。图中可以明显看出temp和atemp大致成线性关系,但也存在一组数据显著偏离线性相关趋势,可能与湿度和风速有关。因此,可以认为temp、humidity和windspeed三者共同决定了atemp,因此在后续建模过程中可以删除atemp特征。

进一步研究温度、湿度和风速对租借数的影响:fig, axes = plt.subplots(1,3,figsize=(24,8))

ax1 = plt.subplot(1,3,1)

ax2 = plt.subplot(1,3,2)

ax3 = plt.subplot(1,3,3)

sn.regplot(train['temp'],train['count'],ax=ax1)

sn.regplot(train['humidity'],train['count'],ax=ax2)

sn.regplot(train['windspeed'],train['count'],ax=ax3)

ax1.set_title("The influence of temperature")

ax2.set_title("The influence of humidity")

ax3.set_title("The influence of windspeed")

plt.show()

dadf7f786ee8

虽然三种天气因素对租借数的影响比较分散,但可以明显看出温度和风速与租借数成正相关,湿度与租借数成负相关。

3.3 特征工程

综上所述,本项目提取特征year、month、hour、workingday、holiday、weather、temp、humidity和windspeed共9个特征预测租借总数。其中year、month、hour、workingday、holiday和weather为离散量,且由于workingday和holiday已经是二元属性,因此其余四个需要进行独热编码(one-hot)方式进行转换。#特征工程

#所选取的特征:year、month、hour、workingday、holiday、weather、temp、humidity和windspeed

#(1) 删除不要的变量

data = data.drop(['day','weekday','season','atemp','casual','registered'],axis=1)

#(2) 离散型变量(year、month、hour、weather)转换

column_trans = ['year','month','hour','weather']

data = pd.get_dummies(data, columns=column_trans)

四、构建模型

接下来,需要对数据进行建模预测,分别采用三种典型集成学习模型(普通随机森林、极端随机森林模型和梯度提升树模型)、XGBoost模型和人工神经网络模型。此处均采用模型的默认参数或简单参数,如人工神经网络选用三层神经网络,每层包含神经元数量相同,且均为特征个数。#机器学习

#1、特征向量化

col_trans = ['holiday', 'workingday', 'temp', 'humidity', 'windspeed', 'year_2011', 'year_2012', 'month_1', 'month_2', 'month_3', 'month_4', 'month_5', 'month_6', 'month_7', 'month_8', 'month_9', 'month_10', 'month_11', 'month_12', 'hour_0', 'hour_1', 'hour_2', 'hour_3', 'hour_4', 'hour_5', 'hour_6', 'hour_7', 'hour_8', 'hour_9', 'hour_10', 'hour_11', 'hour_12', 'hour_13', 'hour_14', 'hour_15', 'hour_16', 'hour_17', 'hour_18', 'hour_19', 'hour_20', 'hour_21', 'hour_22', 'hour_23', 'weather_1', 'weather_2', 'weather_3', 'weather_4']

X_train = data[col_trans].iloc[:10886]

X_test = data[col_trans].iloc[10886:]

Y_train = data['count'].iloc[:10886]

from sklearn.feature_extraction import DictVectorizer

vec = DictVectorizer(sparse=False)

X_train = vec.fit_transform(X_train.to_dict(orient='record'))

X_test = vec.fit_transform(X_test.to_dict(orient='record'))

#分割训练数据

from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, test_size=0.25, random_state=40)

#2、建模预测,分别采用常规集成学习方法、XGBoost和神经网络三大类模型from sklearn.ensemble import RandomForestRegressor

from sklearn.ensemble import ExtraTreesRegressor

from sklearn.ensemble import GradientBoostingRegressor

from xgboost import XGBRegressor

from sklearn.neural_network import MLPRegressor

from sklearn.metrics import r2_score

#(1)集成学习方法——普通随机森林

rfr = RandomForestRegressor()

rfr.fit(x_train,y_train)

#print(rfr.fit(x_train,y_train))

rfr_y_predict = rfr.predict(x_test)

print("集成学习方法——普通随机森林回归模型的R方得分为:",r2_score(y_test,rfr_y_predict))

#(2)集成学习方法——极端随机森林

etr = ExtraTreesRegressor()

etr.fit(x_train,y_train)

#print(etr.fit(x_train,y_train))

etr_y_predict = etr.predict(x_test)

print("集成学习方法——极端随机森林回归模型的R方得分为:",r2_score(y_test,etr_y_predict))

#(3)集成学习方法——梯度提升树

gbr = GradientBoostingRegressor()

gbr.fit(x_train,y_train)

#print(gbr.fit(x_train,y_train))

gbr_y_predict = gbr.predict(x_test)

print("集成学习方法——梯度提升树回归模型的R方得分为:",r2_score(y_test,gbr_y_predict))

#(4) XGBoost回归模型

xgbr = XGBRegressor()

xgbr.fit(x_train,y_train)

#print(xgbr.fit(x_train,y_train))

xgbr_y_predict = xgbr.predict(x_test)

print("XGBoost回归模型的R方得分为:",r2_score(y_test,xgbr_y_predict)) #(5) 神经网络回归模型

mlp = MLPRegressor(hidden_layer_sizes=(47,47,47),max_iter=500)mlp.fit(x_train,y_train)

mlp_y_predict = mlp.predict(x_test)

print("神经网络回归模型的R方得分为:",r2_score(y_test,mlp_y_predict))

最终模型预测能力如下:

dadf7f786ee8

可以看出,默认配置的随机森林模型和简单参数的人工神经网络R方得分较高。分别采用极端随机森林模型和人工神经网络预测测试数据,上传至Kaggle评分,两者结果相似,其中极端随机森林模型的效果略好,结果如下:

dadf7f786ee8

本项目的得分为均方根对数误差(RMSLE),值越小越好。该比赛官方记录最好得分为0.33756。因此,该模型还有待提高,主要是对模型进行调参。每种机器学习模型均有若干参数,需理解每个参数的意义和作用,采用适当方法进行调参,以期获得最佳参数,提高预测准确率。



推荐阅读
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 决策树在鸢尾花数据集上对不同特征组合的分类效果分析及模型性能比较
    本文探讨了决策树算法在鸢尾花数据集上的应用,分析了不同特征组合对分类效果的影响,并对模型性能进行了详细比较。决策树作为一种层次化的分类方法,通过递归地划分特征空间,形成树状结构,每个节点代表一个特征判断,最终达到分类目的。研究结果表明,不同特征组合对模型性能有显著影响,为实际应用提供了重要参考。 ... [详细]
  • 数据科学笔记26:深入解析随机森林分类算法及其在Python和R中的应用
    ### 摘要随机森林是一种在集成学习领域备受推崇的算法,被誉为“集成学习技术的典范”。该方法因其简洁性、易实现性和较低的计算成本而被广泛应用。本文将深入探讨随机森林的工作原理,特别是其在Python和R中的具体应用。随机森林通过结合多个决策树和Bagging技术,有效提高了模型的准确性和鲁棒性。我们将详细解析其核心机制,并通过实际案例展示如何在不同编程环境中高效实现这一强大的分类算法。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 在财务分析与金融数据处理中,利用Python的强大库如NumPy和SciPy可以高效地计算各种财务指标。例如,通过调用这些库中的函数,可以轻松计算货币的时间价值,包括终值(FV)等关键指标。此外,这些库还提供了丰富的统计和数学工具,有助于进行更深入的数据分析和模型构建。 ... [详细]
  • 本文深入分析了Django框架中模型应用与非模型应用的区别与应用场景,详细对比了两者在数据处理、性能表现及开发灵活性等方面的特点。同时,文章还介绍了如何在视图函数中有效利用这些特性,结合PostgreSQL、MySQL、SQLite3和Oracle等不同数据库的配置与使用方法,为开发者提供了全面的参考指南。 ... [详细]
  • 技术分享:线性回归模型的双路径构建——基于sklearn库的实践探索
    技术分享:线性回归模型的双路径构建——基于sklearn库的实践探索 ... [详细]
  • 从 Java 过渡到 Ruby,不仅是一次编程语言的转换,更是一段技术进阶的旅程。本文将深入探讨两种语言在语法、生态系统和开发模式上的差异,帮助开发者顺利实现转型,并在新的环境中高效地编写高质量代码。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 在使用C#编程语言从MySQL数据库中获取最近插入的记录ID时,我遇到了一些问题。具体来说,在执行以下SQL语句时出现了困难:`START TRANSACTION; SET @LASTID = 0; INSERT INTO Accounts (Col1, Col2) VALUES ('value1', 'value2'); SET @LASTID = LAST_INSERT_ID(); COMMIT;` 本文将详细探讨如何正确实现这一功能,并提供解决方案和最佳实践。 ... [详细]
  • Tornado硬件管理平台中的设备信息采集技术深入解析(三)
    深入解析 Tornado 硬件管理平台中的设备信息采集技术,本文聚焦于 `monitor.py` 脚本的关键字段分析。该脚本通过导入 `psutil`、`time` 和 `datetime` 模块,以及使用 `pprint` 进行数据格式化输出,实现对系统资源和设备状态的高效监控与数据采集。 ... [详细]
  • 利用Java开发百度图片爬虫,实现高效下载功能
    为了满足大量图像素材的需求以支持机器学习项目,本文介绍了一种基于Java语言开发的百度图片爬虫工具,该工具能够高效地抓取并下载百度图片中的资源。文章首先展示了爬虫运行的效果图,并详细阐述了其工作原理和技术实现路径,重点解析了如何通过分析百度图片的网页结构来实现精准抓取。此外,还讨论了在实际应用中可能遇到的问题及解决方案。 ... [详细]
author-avatar
沉睡森林
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有