An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)

摘要

在日益城市化的今天,城市居民出行问题逐渐成为衡量一个城市现代化能力的标准;城市出行方式多元化的同时,也对各交通系统的调度运营能力提出了更高的要求:如何提高运营效率,如何运用有限的安保力量进行有效的安检部署等问题一直在阻挠着城市交通的发展。
An AI compute of cities based on Distributed-Platform and Distributed-Databases(基于分布式平台的城市AI计算系统),通过分析地铁站的历史刷卡数据,预测站点未来的客流量变化,帮助实现更合理的出行路线选择,规避交通堵塞,提前部署站点安保措施等,最终实现用大数据和人工智能等技术助力未来城市安全出行。
同时,本模型也可扩展复用至机场客流量预测、商场流量预测等多种应用场景,具有高度的可移植性及高可用性。
1.问题描述
通过分析杭州地铁站的历史刷卡数据(2019.01.01-2019.01.25),对未来某天的00时至24时以10分钟为单位各时段各站点的进站和出站人次进行预测,帮助调度人员等有关部门进行合理的地铁运营,助力城市高效、安全出行。
本课题同时为天池大数据竞赛平台的算法大赛–城市计算AI挑战赛新人赛,我们团队获得了B榜12/958的成绩。
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)(本次大赛因主办方原因于2019.5.24中午12:00暂时下线)

2.数据说明
2.1 训练数据

20190101至20190125共25天地铁刷卡数据记录,约1.7GB,共涉及3条线路81个地铁站约7000万条数据作为训练数据(Metro_train.zip);训练数据用于搭建地铁站点乘客流量预测模型。训练数据(Metro_train.zip)解压后可以得到25个csv文件,每天的刷卡数据均单独存在一个csv文件中,以record为前缀。如2019年1月1日的所有线路所有站点的刷卡数据记录存储在record_2019-01-01.csv文件中,以此类推。
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
2.2预测数据
三种预测模式:
A:提供2019年1月28日的刷卡数据(testA_record_2019-01-28.csv),需对2019年1月29日全天各地铁站以10分钟为单位的人流量进行预测。
B:提供2019年1月26日的刷卡数据(testB_record_2019-01-26.csv),需对2019年1月27日全天各地铁站以10分钟为单位的人流量进行预测。
C:提供2019年1月30日的刷卡数据(testC_record_2019-01-30.csv),需对2019年1月31日全天各地铁站以10分钟为单位的人流量进行预测。

预测数据提交格式:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
3.数据预处理
训练数据包含了1.1-1.25,25个csv文件,文件内容如下图所示:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)由于数据量过大(7000万+条地铁刷卡数据),且数据过于格式化,不方便对整体数据进行把握,所以我们首先要做的就是:数据可视化。
3.1客流量数据可视化
首先使用Tableau进行可视化处理,如下图:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)但是Tableau不支持以10分钟为间隔进行数据划分且操作繁琐,所以我们自己开发了一个数据可视化工具(使用JavaScript编写),用于对地铁数据批量可视化制图,并将工具开源到了:
超时代无可比拟的数据可视化工具–TZLEAU
Github地址
以下是示例图:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)通过可视化的地铁流量折线图,我们可以根据进出站的高峰时间判断此地铁站所处的功能区域(如:居民区、商务区等等。)
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)上图为我们编写的一个py脚本,用于处理生成的可视化图像,将他们分站点建文件夹进行存储,如下图所示:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
3.2地铁站地理位置可视化
训练数据中的地铁站以编号形式存在(0-80),为了更易于理解各地铁站间的地理位置关系,我们将地铁站编号映射到了实际地铁站地理位置,如下图所示:An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)3.3异常数据处理
我们发现,在凌晨0点到凌晨五点(地铁停止运行时间),也会有出入站数据;经我们多处求证证实:这些出入站数据均为地铁维护人员的刷卡数据,所以在最后的预测结果中,可以将这些异常数据忽略或者直接复制,使这些异常数据不会对预测结果造成影响。
4. 数据预分析
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
上图为朝阳站周一地铁客流量数据图,根据图我们可以看出,早上八点钟左右(上班高峰期),进站人数达到了MAX;晚上六点钟左右(下班高峰期),出站人数达到了MAX,由此我们可以推断出,此站位于居民区。

An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
上图为近江站周一地铁客流量数据图。根据图我们可以看出,早上八点钟左右(上班高峰期),出站人数达到了MAX;晚上六点钟左右(下班高峰期),进站人数达到了MAX,由此我们可以推断出,此站位于商业区/公司聚集区。

An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)
上图为龙翔桥站周一地铁客流量数据图。根据图我们可以看出,此站地铁流量在一天内呈“潮汐特征”,白天出站人数多,晚上进站人数多,且两者大致相同,因此,可以推断出此战位于旅游点区域。

An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)

上图为杭州东站25天的进出站流量图。杭州东站为“城际车站”,因此我们可以发现该车站地铁流量存在“潮汐特征”,即:周六入站人数与周日出站人数大致相同(周六乘城铁离开杭州,周日呈地铁返回杭州)。
5.模型选择
LightGBM
5.1.1 LightGBM简介

LightGBM是一个梯度Boosting框架,使用基于决策树的学习算法。它可以说是分布式的,高效的,有以下优势:

1)更快的训练效率

2)低内存使用

3)更高的准确率

4)支持并行化学习

5)可以处理大规模数据An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)5.1.2 LightGBM原理
1)直方图算法
直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。在XGBoost中需要遍历所有离散化的值,而在这里只要遍历k个直方图的值。
使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值。
然后在计算上的代价也大幅降低,XGBoost预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data * #feature) 优化到O(k* #features)。
 2)LightGBM的直方图做差加速
一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后(父节点在上一轮就已经计算出来了),可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)3)带深度限制的Leaf-wise的叶子生长策略
  Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
 Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
 4)直接支持类别特征(即不需要做one-hot编码)
  实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的one-hot编码特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的one-hot编码展开。并在决策树算法上增加了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。
5)直接支持高效并行
  LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。
  1)特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  2)数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
  LightGBM针对这两种并行方法都做了优化,在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。
5.2 GBDT
GBDT(Gradient Boosting Decision Tree)是一种基于迭代所构造的决策树算法。GBDT由三个概念组成:Regression Decistion Tree、Gradient Boosting与Shrinkage
GBDT主要的优点有:

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
    3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
    回归树的运行流程与分类树基本类似,但有以下两点不同之处:
    第一,回归树的每个节点得到的是一个预测值而非分类树式的样本计数,假设在某一棵树的某一节点使用了年龄进行分枝(并假设在该节点上人数),那么这个预测值就是属于这个节点的所有人年龄的平均值。
    第二,在分枝节点的选取上,回归树并没有选用最大熵值来作为划分标准,而是使用了最小化均方差。这很好理解,被预测出错的次数越多,错的越离谱,均方差就越大,通过最小化均方差也就能够找到最靠谱的分枝依据。
    6. 算法实现
    6.1.模型影响因素
    6.1.1节假日因素

    An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)

上图为相同车站的1月1日(元旦)与相同周期(1.1为周二,则相同周期也为其他周周二的数据)的客流量数据对比,我们可以发现,元旦当日的客流量数据与相同历史周期大相径庭;若将元旦当日数据加入训练集会对模型造成很大的负影响,所以我们在训练集中剔除了元旦。
6.1.2 天气因素
天气因素会对客流量预测模型产生很大影响,如:下雨会导致客流量高峰滞后,并造成地铁站拥堵;我们在网上爬取了杭州市1月的天气情况数据;但由于爬去的数据为粗粒度,进有每日的天气状况数据,无小时粒度的天气数据,所以我们将天气数据舍弃。An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)6.1.3 其他影响因素
我们在构建客流量预测模型时还考虑到了其他影响因素,如:地铁运行设备故障,突发事件等。但网上显示杭州地铁1月份并没有此类情况,所以不必将其纳入模型构建。
6.2 算法实现
首先我们将数据已十分钟为单位进行划分,并统计每天每站每一个单位时间(十分钟)的进出站人数总和。
我们要预测的是1月27日地铁进出站客流量,所以,我们选择训练集中相同历史阶段的前四天作为训练数据(即周二至周五);选择相同历史周期的数据作为label,提取特征(即选择1.6、1.13、1.20)。
使用LightGBM+GBDT进行训练并预测。
评估指标用以评判对未来一天以10分钟为单位各时段各地铁站的出站和入站人次的总量预测是否准确,因此采用平均绝对误差(Mean Absolute Error,MAE)分别对入站人数和出站人数预测结果进行评估,最后再对两者取平均,得到最终评分。
已提交的成绩中,最高评分为15.32(截止2019年5月24日12:00)。
6.3多模型融合
我们使用LightGBM中的category_feature参数,对LineID、StationID等特征分别进行单独预测,然后进行加权融合,但由于比赛暂时下线,无法获得此种模型的评分,但肯定比单模型有提升。
7. 并行学习(分布式)
7.1 LightGBM集群

An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)搭建lightgbm集群,使用数据算法,并行学习(4台阿里云服务 器),使用wget回收结果。An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)7.2 多天预测集群
利用LightGBM生成的model以及算法较优的鲁棒性,将model及算法分布到多台阿里云服务器(或多个集群),每一台阿里云服务器预测每一天的客流量,使用IRPC并行的发出训练命令,并使用wget回收结果。An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)下图为IRPC的部分核心代码:
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)下图为远程调用(IRPC)使用的shell命令,shell命令可以完成以下功能:执行.py文件进行训练,将预测的数据保存到指定文件夹等。
An AI compute of cities based on Distributed-Platform and Distributed-Databases(天池地铁流量预测)8. 总结与展望
我们的模型实用性强,且可扩展。此模型可扩展使用于机场客流量预测、商场人流量预测等;且可将lightGBM训练生成的模型使用Java进行扩展上传至云平台进行实时流计算。
我们团队在这次课题中,分工合作,发挥自己的优势,扩展知识的同时也掌握了大数据处理的基本步骤以及特征工程的基本方法;同时,也懂得了如何进行团队合作,与团队一起,劈波斩浪!

欢迎大家讨论☺