上海城市道路拥堵指数分析(EDA)

时间:2024-03-27 20:27:06

本次研究使用的数据集是2015年上海SODA竞赛的城市数据集,拿到数据后我就确立了本次数据挖掘的题目——对于上海市道路交通拥堵指数的分析,并实现不同位置在一定精度(80%)下的交通拥堵指数的预测。

根据主观感觉,一个位置特定时间的交通拥堵指数可能跟这个路段的天气情况(降水、温度、风向、能见度等)、空气质量(PM2.5指数)和道路情况相关,所以本次数据分析选用的数据集有城市交通拥堵指数.csv、空气质量状况.csv以及网络搜集所得天气数据三个数据集,拿到数据集后各数据集的特征情况以及处理目标如下:
2015上海城市道路拥堵指数分析(EDA)

2015上海城市道路拥堵指数分析(EDA)

2015上海城市道路拥堵指数分析(EDA)

Preprocessing

step by step!对数据集的预处理一个一个来

城市交通数据集

  1. 首先对城市数据集的区域特征进行处理。关于区域的特征有区域名和区域编号两个,故大胆猜测他们两个之间存在着某种关系,要找到这种关系。

    区域编号的命名存在着某种规律,做了统计之后发现区域编号总共有XN、XZ、XW、DN、DZ、DW六种类型,接着我在百度地图上对着不同区域号的区域名做了个标记图(下面放出XN类型的标记图):
    2015上海城市道路拥堵指数分析(EDA)
    emmm似乎这些地点都在黄浦江西,并且靠近上海市的中心地带,那会不会X代表黄埔江西,D代表黄浦江东,N、Z、W分别代表城市的内环、中环和外环呢。尽管无法验证,但是这个猜想基本和实际的标记图一致。接下来做出这不同区域的分布:
    2015上海城市道路拥堵指数分析(EDA)
    虽然通过上面的实践我们找到了区域编号的命名规律,但是似乎到这里就必须做出选择了——将预测问题转换为大的区域的交通指数预测问题 or 精确度更高的交通指数预测。

    在这里我决定预测大的区域的交通指数,因为我们数据集的样本比较少,具体到某一时间某个精确地点的样本只有200条左右,模型拟合地不好。因此在这时调整目标为预测不同区域不同时间的拥堵指数。

    除此之外,还做了一些特征,通过人工打标的方式,对不同区域的属性值做出了划分,如教学区(SchoolArea)、生活区(LivingArea)、商业区(ShoppingArea)等等
    2015上海城市道路拥堵指数分析(EDA)

  2. 接下来对时间这一条特征进行处理。从原来的特征中提取出小时作为新的特征Hour,让模型的预测时间精度在一个小时以内,也方便后期的训练。

    将日期提取出来,转化为一年中的第多少天作为新的特征Days

    创建新的复合特征IsRushHour表示这个小时是否是高峰期,IsFestival表示这天是不是节日(包括所有的法定节日和情人节、圣诞节这种可能会增加拥堵指数的节日),IsWeekend表示这天是否是周末等等
    2015上海城市道路拥堵指数分析(EDA)

  3. 好了,处理差不多了我们来看一下拥堵指数(预测目标)的分布情况
    2015上海城市道路拥堵指数分析(EDA)
    上图表示了不同年份(2014、2015)交通指数的分布情况,可以看出大多数的交通拥堵指数都在15~50的区间内,且2015年的拥堵指数对比2014年的拥堵指数有左移的趋势,这是不是说明15年的拥堵情况减轻了呢
    2015上海城市道路拥堵指数分析(EDA)
    上图是不同天数的拥堵指数平均值,上面是2014年的、下面是15年的,可以看出不管是14年还是15年的拥堵指数都以七天为一个周期进行有规律的小波动,尤其在周末拥堵指数较低,在平日拥堵指数较高,或许上海市民在周末的主要活动是以休息为主吧。

    此外在14年270天左右出现的明显高峰,对应着的是国庆节假日出游人数的增多。数据整体较符合生活规律

空气质量数据集

空气质量数据集最明显的特点是同样表示空气质量等级的特征有三个AQIGradeAIRQUALITY。三个特征如果相关性比较紧密,就需要去除两个冗余的特征,减小模型的计算量,避免Overfitting。在这里使用了两种方法来分析特征之间的相关性:Spearman分析和Pearson分析。其他特征比如时间和站点的处理方法如城市交通数据集。。
2015上海城市道路拥堵指数分析(EDA)

  • Pearson分析:这种分析方法主要分析特征之间的线性相关,范围为(1,1),1表示线性正相关,-1表示线性负相关。绘制相关性矩阵如下图:
    2015上海城市道路拥堵指数分析(EDA)
    可以看到该图右下角三个特征之间呈现高度的线性正相关性
  • Spearman分析:这种分析方法主要分析特征之间的正负相关,范围同样为(1,1),绘制相关性图如下,表示其他各特征与AQI特征之间的正负相关:
    2015上海城市道路拥堵指数分析(EDA)
    两图皆可分析得出这三个特征之间存在着很大的冗余性,因此删除其中两个特征,在这里仅保留AIRQUALITY特征用做以后的建模

天气数据集

对于天气数据集,我并没有打算将其中的全部特征用于建模。我主观感觉只有气温、能见度、降雨量三个特征会对拥堵指数产生影响,所以这里只用了三个特征。
2015上海城市道路拥堵指数分析(EDA)
可以看到三个特征都有不同数量的数值缺失,气温(TAvg)缺失值较多。对于缺失值的填补,我用一段时间内的平均值来填补气温的缺值;对于降雨量(Rain)的缺值,我选择全部填0;而能见度(Visibility)这个特征,因为想不出好的方法弥补缺值,故将这条特征舍弃。

Modeling——Classification

一开始这本来是一个回归问题,但是将拥堵指数分成五类,预测某一个时间某个地点的拥堵指数级别,就转换成了一个分类问题。五类分别是:

(0,16]:(16,33]:,(33,50]:,(50,67]:,(67,]:

分类后将数据划分为训练集和测试集,将训练集输入模型进行训练,测试集输入模型进行预测,得各模型的预测准确率如下:
2015上海城市道路拥堵指数分析(EDA)
可以看见基于决策树的模型超级随机树(ExtraTrees)、决策树(DecisionTree)、梯度助推决策树(GradientBoostDecisionTree)的表现都不错,决策树的得分达到了0.86,达到了80%准确率的目标。

其实这里应该使用混淆矩阵(Confusion Matrix)作为评分标准,因为五个类的数量非常不均,使用准确率作为评分标准并不能准确表现模型判断正误的能力。

再看看四个树模型中,各特征的影响力程度(FeatureImportance):
2015上海城市道路拥堵指数分析(EDA)
emmm出现了一些异常情况。四个树中时间特征处于绝对统治地位,其他特征的地位都很低。相比之下GBDT模型对各个特征的利用率比较平均,在这一点上GBDT是优于其他三种树模型的。

Modeling——Regression

这里使用了三种模型对拥堵指数做回归分析,分析所得结果如下:

Model Mean Squared Error Mean Absolute Error
RandomForestRegressor 13.8 2.6
GradientBoostRegressor 27.8 3.9
LinearRegressor 71.4 6.8

可以看出树形模型(RandomForestRegressor和GradientBoostRegressor)的表现较好,最好均方差(Mean Squared Error)达到了13.8,是一个中规中矩的表现吧。

Neural Networks

除了传统的统计学模型,也尝试了神经网络,希望能取得进一步的提高,网络结构是我和团队中的另一人一起设计的,结构图如下:
2015上海城市道路拥堵指数分析(EDA)
这个网络结构没有多复杂,单纯的DNN。在输入数据端我们加入了规范层(Batch Normalization)以规范化数据,提高神经网络的学习效果。除最后一层外,所有层的**函数均为‘relu’,并在各层之间加入Dropout以避免过拟合。学习的效果如下图所示:
2015上海城市道路拥堵指数分析(EDA)
emmm光看图的话,准确率差不多在83%左右,和之前的几个树模型相差不多,有点小失望。那么用神经网络做回归分析效果会不会好点呢?

将分类的网络改为回归的网络很简单,只需去掉最后的Softmax层,将输出改为一个神经元就行了,因此回归的结构为:
2015上海城市道路拥堵指数分析(EDA)
回归的训练情况如下,其中为了画图方便,均方差除了10:
2015上海城市道路拥堵指数分析(EDA)
所以直到最后神经网络也并没有在这个问题上表现出优异的性能,有点失望。

Clustering

聚类分析的主要目的,是为了从另一个角度检验拥堵指数划分区间是否得当,看五类样本是否具有相差不多的样本量:
2015上海城市道路拥堵指数分析(EDA)
上图中左图是原始的聚类结果,效果很差,糊成一片。在去掉Days这个时间特征以后,变成了右图的样子,聚类效果好了很多。

可以看到确实可以将拥堵指数分为五类,但恐怕这几类的数量是非常不均的,有三类的数量很多而两类的数量很少。

分析和总结

对于时间特征的处理

对于时间这个特征,可能刚才用到的所有模型都没办法准确地学习时间的序列化的特点。记得我们在处理日期时把日期转换成为了离散的数值,范围为1~200+,对人类来说有很明显的序列特征,但在模型眼里,可能1相当于0,200相当于1,而中间的值都相当于0到1的小数值。

但是也有部分模型能够处理具有时间特征的数据,比如ARIMA,RNN等等,关于这个可以作为以后进一步的目标深入研究

数据的分布特征影响模型发挥

2015上海城市道路拥堵指数分析(EDA)
如上图所示,在分类问题的解决中,各个类的数量是非常不均匀的,这不仅在聚类分析中体现了出来,而且直接影响了分类的效果(理论上各类的数量差不多时分类效果是最好的)。对于这个缺陷以后或许可以修改分类的区间,使得各类的数量相差不多(但随便修改分类区间也是错误的行为,这里因为没有一个官方标准来确定各类的区间大小,所以我说可以这样做)

数据泄露

2015上海城市道路拥堵指数分析(EDA)
摘抄自Kaggle,简单来说就是用了一些“作弊”手段来得到不切实际的过高分数,赢得比赛。在比赛中,分数至上,抛弃数据的现实意义无可厚非;但在处理实际问题时,这么做就会使得到的分数毫无意义。

我用之前的模型做了一个对比,使用和不使用数据泄露,各模型的表现变化如下:
2015上海城市道路拥堵指数分析(EDA)
可以看到,除了Bayes(原因不明),其他所有模型在不使用数据泄露之后表现都有不同程度的下降,证明了之前的结论。

为什么没有使用SVM、GridSearchCV等等

原因只有一个:太慢了!!

为了等待SVM训练完毕,我曾经傻等了160个小时(多于两周的计算时间)。在项目收尾时我们团队实现了用TensorFlow的SVM,利用Tensorflow的特性,能充分调动计算机资源,进行并行计算甚至CUDA加速。这个也可以作为进一步深入研究的目标之一。

以上。