科技战疫-大数据公益挑战赛-DataFountain重点区域人群密度预测 第1名方案
百度网盘链接(密码:0lsy)
赛题给出的数据包括区域历史人群密度和网格联系等数据,对数据进行探索分析:
首先对所有区域的平均人群密度分布进行统计,如下图所示。可以发现在1.24之前由于疫情才刚开始发展并且还未到春节,北京市的人群密度很大,在春节后受疫情影响人群密度明显变小,并且在原本假期结束的时间点之后人群密度一直很小,在2.2之后的两周才呈现出一定的规律性,所以春节左右的时间段对应的历史数据应该清除,否则会引入过多的噪声,最后训练模型时选择的数据是2.2到2.15期间的历史数据。
算法的整个框架如下图所示,分为数据层,模型层和融合层,最终的输出结果由树模型预测和规则模型预测两部分组成。数据层我们选择了网格联系强度、天气数据、区域历史人群密度和区域属性数据作为模型的输入,模型具体说明如下。
由上一节的分析可知,人群密度的时序数据具有两级周期性,如果直接按照时间的顺序直接预测9天的人群密度,序列长度为216,这样连续预测长序列的误差很大,为了解决这一问题,我们是使用了两个维度的预测方法进行结合。如下图所示,由于30天历史数据前期的人群密度与要预测时间段差别大,所以我们仅使用2.2之后的数据作为训练数据。
树回归模型部分的框架如下图所示,首先进行特征提取得到小时级别的时序特征和区域属性特征,并且基于网格联系强度构建区域的关联流动图,通过graph embedding算法提取空间特征,然后将时序特征、区域属性特征和空间特征输入回归树模型对未来人群密度进行连续预测。
2.1 特征提取
我们首先从以下几个方面构建特征:时序特征、属性编码特征和天气节假日等特征。
2.2 构建区域关联图
题目给出的数据是200m*200m的网格联系强度,但是预测目标并不是网格而是区域的人群密度,网格和区域之间没有严格的对应关系(区域可能包含多个网格,网格内也可能有多个区域),所以如何基于网格构建区域之间的关联图是一个问题。 因为区域中心所在的网格往往代表来这个区域最核心的人群密度信息,所以在这里我们直接按照数据给定的区域中心所在网格这一关系来构建区域关联图。需要注意的是,有些区域所在的中心网格并没有在网格联系强度数据中出现,等价于网格缺失,所以对这些区域需要重新寻找距离区域中心最近的网格来代表这个区域。最终可以构建24个加权有向图,分别对应24个小时下区域之间的关系网络,边上的权重表示区域间的联系强度。
2.3 空间特征学习 构建区域关联图之后对区域的特征空间进行提取,时刻t的有向图中存在区域A指向区域B的连边表示t时刻A到B有一定的人群流动性,所以我们选择了基于随机游走的图嵌入算法来学习24个小时对应的空间特征。在实验中我们选择了node2vec和deepwalk两种算法,最终使用的是实际效果更好的node2vec。
2.4 小时级别的人群密度预测 使用LightGBM[1]和XGBoost[2]两个回归树模型分别对结果进行预测,对结果进行融合。分别用p和q表示h小时对应的两个模型,则第i个区域在第d天h小时的人群密度预测值为:
其中g的增长趋势因子,在下一节的规则模型会介绍到。因为由于训练数据的时间范围很短,难以将趋势信息提取并使用回归树模型训练,所以预测的结果不完全满足区域人群密度的增长趋势,为了克服这一问题我们对回归树预测的结果乘上趋势因子以获得更准确的预测结果。
如下图所示,在进行规则建模[3]时,我们考虑了四个因素增长趋势因子(growth)、基础人群密度(base)、周级别的周期因子(alpha)和天级别的周期因子(beta)。
3.1 增长趋势因子 由之前的数据分析可知,一个区域在不同时间段的增长趋势不同(比如白天增长趋势明显,但夜间相对稳定),所以在计算增长趋势因子时我们将一天24小时划分为三个集合,分别为S_1={23,0,1,2,3,4,5,6},S_2={7,8,9,19,20,21,22},S_3={10,11,12,13,14,15,16,17,18}。S1集合包含23点到早上6点,在这个时间段活动人群最少,其人群密度相对稳定;S2集合包含早上6点到8点和晚上19点到22点,这个时间段人们开始出行活动和回家,其人群密度有一定的趋势性;S3集合包含早上10点到下午18点,这个时间段是人们活动的主要时间,其人群密度呈现出明显的趋势性。计算公式如下:
growth表示的是区域i最近一周呈现出的增长趋势,开根号进行趋势平滑,其中Sh表示时间h所在的集合,E1表示预测天的前一周的天数集合,E2表示E1的前一周的天数集合。为了增强趋势因子的鲁棒性,我们还考虑了区域所属类型的增长趋势因子,加权得到最终区域i的增长趋势因子为:
w0,w1,w2是三个加权参数,满足w0+w1+w2=1,第一项表示单个区域计算得到的趋势因子,第二项表示区域所属类型1的所有区域平均趋势因子,第三项表示区域所属类型2的所有区域平均趋势因子(如北京南站的类型是“交通设施;火车站”,其类型1是“交通设施”,类型2是“火车站”)。
3.2 基础人群密度我们选择最近三天的平均人群密度base和回归树模型预测的第一天人群密度base进行加权作为基础人群密度,计算公式如下:
3.3 周和天级别的周期因子_ 周级别的周期因子是一周七天为周期的分布系数,我们选择的是最近一周的周期分布系数作为预测的周期因子(也尝试过最近两周并且进行加权融合,但效果不如最近一周的效果好),计算公式如下:
天级别的周期因子是一天24小时为周期的分布系数,考虑到周末和工作日的出行活动差别较大,分别对工作日和周末的24小时统计的分布系数求平均得到对应天级别的周期因子:
在实验中我们发现回归树模型预测周末人群密度的效果很好,但工作日预测效果相对较差,所以我们去掉训练数据的周末后又按照同样的训练回归树模型预测工作日的人群密度。最后对回归树模型的预测结果和规则模型的预测结果进行加权融合。规则模型和回归树模型两种建模方式侧重点不同,从两个维度方向去预测,融合后准确率有明显的提升。此外,由于预测的是未来9天的人群密度,而周期性为7天,所以我们用前两天的预测结果乘上趋势因子作为最后两天的预测结果,从而避免连续预测的误差传递问题。
上面的建模思路虽然考虑到了空间关联特征,但是题目给出的网格人群密度数据并没有使用,而这部分数据显然对区域的预测也有意义,为了能利用这部分数据,我们尝试使用深度时空残差网络DeepST模型[4]预测网格的人群密度。 由于题目给出的网格数据是分散的,首先要把网格在地理空间上进行恢复,得到L*L的人群密度图像,如下图是早上7点以天安门为中心,大小为131*131的网格人群密度分布图,然后通过这些网格图像分别构建相邻时间、周期性、趋势性的三维张量,并且结合天气、区域属性等特征作为DeepST的输入,预测所有网格在下一个时间段的人群密度。由于时间原因这部分并没有继续往下做,接下来的思路是通过DeepST预测出网格的人群密度后,通过算法建立网格和区域的映射关系,从而将网格的预测结果可以对应到区域的人群密度,从而提高预测的准确性。
[1] Tianqi Chen and Carlos Guestrin. XGBoost: A Scalable Tree Boosting System. In 22nd SIGKDD Conference on Knowledge Discovery and Data Mining, 2016 [2] Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, Tie-Yan Liu. "LightGBM: A Highly Efficient Gradient Boosting Decision Tree". Advances in Neural Information Processing Systems 30 (NIPS 2017), pp. 3149-3157. [3] dropout, 时间序列规则法快速入门, https://www.jianshu.com/p/31e20f00c26f [4] Zhang J , Zheng Y , Qi D . Deep Spatio-Temporal Residual Networks for Citywide Crowd Flows Prediction[J]. 2016.