案例导读

数据集中包含美国94号州际公路MNDoT ATR301站西行交通量的每小时测量值。该站大致位于明尼阿波利斯和圣保罗之间。数据集还包括每小时的天气和假日属性,以评估它们对交通量的影响。案例将根据此数据集建立机器学习模型预测美国州际公路交通量。

案例使用介绍

对于预测美国州际公路交通量中主要使用了线性回归、回归决策树、AdaBoost和GBDT模型,通过横向对比不同算法的功能效果,选择出较优的预测结果。本案例中主要的过程在于数据的探索性分析及对于特征的修改。

案例主要使用

Python中的pandas、numpy、matplotlib、seaborn和sklearn库进行数据的探索性分析和

案例目录介绍使用

1.数据集简介

2.数据集探索性分析以及数据处理

3.训练集测试集划分

4.回归建模

4.1线性回归

4.2回归决策树

4.3集成模型——AdaBoost

4.4集成模型——GBDT

5.总结性分析

1.数据集简介

字段名称

字段类型

字段说明

holiday

字符型

假期类型

temp

浮点型

平均开尔文温度(绝对温度)

rain_1h

浮点型

每小时的降雨量

snow_1h

浮点型

每小时的降雪量

clouds_all

整型

云量的数值百分比

weather_main

字符型

当前天气的简短文字描述

weather_description

字符型

当前天气的较长文字描述

date_time

字符型

时间

traffic_volume

整型

交通流量

2.数据集探索性分析以及数据处理

2.1导入数据

首先通过,python中的pandas库进行导入数据并且查看数据填充信息、类型信息以及统计学特征。

打开网易新闻 查看更多图片

可以看到,所有的字段的数量都为48204个,说明数据无缺失值,不需要进行填充处理。此外,holiday、weather_main、weather_description、date_time都是object类型,我们需要在建立模型之前对某些字段进行类型转化,方便模型的处理。

通过库函数查看统计学特征:

打开网易新闻 查看更多图片

这张表可以看出,holiday字段有12种取值,weather_main字段有11种取值,weather_description字段有38种取值,我们可以使用可视化的方式对其进行更具体的展示和分析。除此之外,我们能发现rain_1h的最大值为9831.3,不符合常理,所以在后期需要对这些异常值进行处理。

2.2数据清洗与数据探索性分析

首先通过python的matplotlib与seaborn库对于字符串类型holiday、weather_main和weather_description字段进行统计展示,画出分布的柱状图。

Holiday分布:

打开网易新闻 查看更多图片

weather_main分布:

打开网易新闻 查看更多图片

对weather_description绘制条形图,统计各个天气的详细情况出现的次数。

打开网易新闻 查看更多图片

发现的rain_1h出现的异常值进行可视化,首先利用箱线图画出数据分布范围:

打开网易新闻 查看更多图片

绝大部分rain_1h在0附近,在小于1000的数据时,横坐标最大仅为60左右,说明数据中存在明显的离群值,需要对其进行清洗。

打开网易新闻 查看更多图片

对snow_1h列进行可视化分析,查看数据分布,判断有无异常值。

打开网易新闻 查看更多图片

可以看出,snow_1h所反映的降雪量符合日常生活经验,不必对其异常值清洗处理

在查看数据的统计信息时,我们发现,温度(temp)的最小值为0,最大值为310,判断为绝对温度,画出箱线图查看异常值情况:

打开网易新闻 查看更多图片

可以发现一点,有一点严重偏离正常温度分布范围,达到绝对零度,为异常值,及进行清洗。

打开网易新闻 查看更多图片

在去除异常值后可以看到,temp的分布达到了正常范围。

接下来,将clouds_all和traffic_volume绘制小提琴图,小提琴图时是一种箱线图的变种,结合了箱线图和密度图的特点,能够显示数据分布及其概率密度。

Clouds_all小提琴图绘制:

打开网易新闻 查看更多图片

Traffic_volume小提琴图绘制:

打开网易新闻 查看更多图片

云量在偏向两侧中均表现为正常现象。

将data_time转换为日期datetime64类型。

寻找连续型对象间的相关性关系:

打开网易新闻 查看更多图片

通过热力图可以看出,连续型特征之间并没有十分明显的相关性。

接下来,将时间拆解为hour、month、year和day,分别进行统计,计算出每个时间段的数量count以及时间段内的车流量trffic_volume。

根据小时进行统计,计算出每个时间段。

打开网易新闻 查看更多图片

根据月份进行统计,计算出每个时间段。

打开网易新闻 查看更多图片

根据年份进行统计,计算出每个时间段。

打开网易新闻 查看更多图片

根据天数进行统计,计算出每个时间段。

打开网易新闻 查看更多图片

通过折线图可以看到,在白天车流量最多,为高峰时期;在月份上,冬天12月-1月和夏天7月份车流量有明显的下降;在一周内,工作日(周一至周五)车流量保持较高水平,但是周末较低,比较符合日常生活经验。

接下来进行数据的编码处理,方便后续模型的处理使用。

  1. 删除不需要的列date_time和weather_description

(2)将日期列进行编码转换为数字格式

(3)将温度减去绝对零度,转化为摄氏度

(4)将天气类型进行数字编码

(5) holiday列进行处理,假期数量较少,我们考虑将该列转换为布尔类型,即若为假期,我们设置为True,否则为False

(6)清除异常值后,数据的索引仍然存在,我们需要重置索引

(7)因为weather_main为无序性变量,但是我们在进行数字编码后人为引入了大小和顺序,所以我们需要对其进行处理,在这里我们使用OneHotEncoder进行One-Hot编码

3.训练集测试集划分

建模之前对数据集进行划分,比例为训练集:测试集=80%:20%,使用的方法为sklearn.model_selection中的train_test_split方法,在划分之前,我们还需要使用sklearn.preprocessing的StandardScaler将各个特征列标准化。

打开网易新闻 查看更多图片

4.回归建模

在建模之前,我们首先构建评估回归模型的通用方法,我们通过计算训练集得分、测试集得分、均方根误差和决定系数来评估回归模型的准确度。在构建模型训练完成之后,我们只需要调用方法eavluate_model()传入相应的模型就可以实现验证。

4.1线性回归

线性回归模型是最简单的回归模型,通过sklearn.linear_model中的LinearRegression方法构建线性回归模型,并进行训练。

打开网易新闻 查看更多图片

线性回归模型的效果并不好,其训练集测试集得分都较低,均方根误差非常高,决定系数仅为0.153,说明线性回归模型没有实际的参考意义。接下来,我们建立其他的回归模型。

4.2回归决策树

使用回归决策树算法构建模型,设置树的最大深度max_depth为12,用训练的模型在测试集上进行交通量的预测。

打开网易新闻 查看更多图片

回归决策树的预测效果较好,决定系数能够达到0.939,并且能在测试集上得分达到0.94,能够说明回归决策树有较好的性能。

4.3集成模型——AdaBoost

使用AdaBoost算法的回归模型,使用的基模型为我们之前构建的决策树模型dtreg,此外,我们设置基模型数量n_estimators为80,学习率learning_rate为0.01,用训练的模型在测试集上进行交通量的预测。

打开网易新闻 查看更多图片

AdaBoost回归模型的预测效果较好,决定系数能够达到0.949,并且能在测试集上得分达到0.95,能够说明AdaBoost预测性能非常好。

4.4集成模型——GBDT

使用GBDT模型进行回归预测,我们将基模型数量n_estimators设置为500,树的最大深度max_depth设置为10,用训练的模型在测试集上进行交通量的预测。

打开网易新闻 查看更多图片

GBDT回归模型的预测效果较好,决定系数能够达到0.965,并且能在测试集上得分达到0.97,能够说明GBDT预测性能非常好。

5.总结性分析

首先,通过对数据集进行信息查看、数据清洗、数据可视化以及相关性探索,大致描述了数据集的一些特征。

之后,我们建立了五个回归模型对数据进行预测。我们可以发现,线性回归的模型预测效果较差,但是回归决策树和K近邻模型的预测效果都较好,决定系数都超过了0.85。

此外,我们还构建了两个集成模型,AdaBoost和GBDT,这两个模型的效果都非常好,决定系数都在0.95以上,我们也能通过绘制的实际值预测值对比散点图看出来,二者对测试集的预测能力非常好。

BONUS TIME

数学建模资料、视频讲解、历年赛题

后台回复 【校苑】领取

打开网易新闻 查看更多图片

100G MATLAB资料

后台回复 【干货】领取

打开网易新闻 查看更多图片
打开网易新闻 查看更多图片
打开网易新闻 查看更多图片
打开网易新闻 查看更多图片
打开网易新闻 查看更多图片
打开网易新闻 查看更多图片