案例导读
数据集中包含美国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月份车流量有明显的下降;在一周内,工作日(周一至周五)车流量保持较高水平,但是周末较低,比较符合日常生活经验。
接下来进行数据的编码处理,方便后续模型的处理使用。
删除不需要的列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资料
后台回复 【干货】领取
