DLLXW / Baidu_BigData2020

2020第六届百度&西安交大大数据竞赛暨IKCEST第二届“一带一路”国际大数据竞赛

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Baidu_BigData2020

2020第六届百度&西安交大大数据竞赛暨IKCEST第二届“一带一路”国际大数据竞赛(复赛B榜15)

本赛题旨在鼓励我们选手通过合理的运用时间和空间数据来预测疫情的发展,本质上是一个时空序列预测问题。通过查阅相关资料和相似问题的解决方案。我们队伍尝试了多种思路,最终的解决方案融合了很多方案的结果,主要的解决思路如下:通过可视化数据,我们发现一个区域的每日新增人数不仅和该区域的历史新增人数有关,同时和它的相邻各个区域的新增人数都有着密切的关联,也就是时间和空间上都需要仔细考虑。如果把赛题当做一个时间序列的题目来做,结合传染病的动力学模型,我们想到可以利用改进的SEIR模型来做.从空间维度上考虑,构建的是回归树模型(lightGBM)

空间数据的回归预测方案

我们构建的是一个回归模型,以区域为粒度,一个区域的一天的新增人数是我们的一个样本。树模型学习的特征如下构建:当预测第N天时,模型的输入特征由以下构成:

考虑潜伏期的一个假设:第N天的新增人数是又前面某个时间段(a-b)决定的,a~b表示潜伏期的N-b,N-a可以看做潜伏期的波动范围(因为第N天检测出来的新增肯定是几天前就已经感染了的)

  • 该区域前m(m是可调节参数)每天的新增人数(需要循环构建,预测得到一天的值加入训练集重新构建特征预测下一天)
  • 通过前m天的新增人数计算出的数据的变化趋势指数(需要迭代循环构建)
  • 前面某个时间段个日期的天气指标(利用到weather数据)
  • 过去某个时间段期该区域的人流量密度(利用到density数据)
  • 过去某个时间段内区域之间的迁移强度(transfer数据)以及和本区域有迁移关系的其它区域的感染情况

不像lstm这种可以序列到序列(输出可以多步),树模型的输出只能是一个值,因此第一次预测只能预测到91天,要预测92天的数据,需要把第91天的数据加入到之前的训练数据来重新构建特征

同时虽然对于已有的训练数据,很容易构建出树模型的特征,但是在预测的时候,很多特征也是不知道的,特别是当我们需要长时间预测的时候。必须要连同特征也一起预测,也就是一个多元预测的问题。为了避免这种情况方便特征构造,同时为了避免误差累计效应(因为需要迭代循环预测),我们采取的方案是只用树模型进行一个短期的预测(也就是利用树模型来预测未来K天的新增数目,这里的k针对不同的城市我们采取了不同的取值,5<k<10;对于后面k~30天的预测,我们使用的是SEIR模型)

时间数据的SEIR传染病动力学预测方案

由上面可知,树模型虽然利用上了空间数据,但是由于模型本身特征的局限性和误差累计效应,不使用于预测长期的趋势。所以对于长期趋势的预测,我们采取的是经典的SEIR模型,不过在该模型的基础上对于一些部分进行了改进,特别是对于接触率随着时间的变化我们做了许多的工作 我们队SEIR模型的利用又分为两种方案:

  • 以城市为粒度,利用SEIR模型去拟合一个城市的每日新增人数,然后利用一定的策略分配给各个区域

  • 以区域为粒度,这样拟合出来的结果就是我们需要预测的值,但是因为很多区域并不符合SERI规律,所以需要结合上面的城市为粒度的方案

    SEIR的最优参数寻找方案:

  • 通过已有的数据估算出SEIR模型参数的大致范围

  • 在该范围内设定一定的搜索步长进行搜索,损失函数采取RMSE

  • 通过贪心搜索,得到一组最优参数

伪标签

我们还利用了一种方案,就是将seir模型预测出的结果当做伪标签,然后利用树模型来学。虽然有一定效果,但也并不是十分理想

2 环境依赖

为了方便对代码进行详尽的注释和思路描述,所有的代码都为xx.ipynb格式,所以需要安装jupyter notebook

  • Python 3.x
  • pandas库
  • scikit-learn库
  • lightgbm库
  • jupyter notebook

3 目录和文件说明

主目录下面存了5份代码文件,

infectDataset/是赛题给出的原始感染数据

dataset/下面提供了已经处理完毕的时空数据和构建的特征,这些结果本该由运行数据预处理.py产生,但耗时会很长,所以直接给出了结果

submit/目录是将会生成提交结果的目录

4代码和运行说明

主要提供五份代码:每一份代码都有两种格式,一个是.py文件,一个是notebook的.ipynb格式(主要方便阅读)

同时:因为实现的思路过于复杂,所以代码繁杂,运行时间很长,而且各个部分依赖众多,无法集成在一个脚本里面。为了方便运行,lgb只是给出了一个最简易的demo实现。seir的脚本是可以直接出来提交结果的,但是由于随机种子,最优参数还有模型融合,后处理的随机性等缘故,直接预测出来的结果大约在1.16到1.3之间波动(复赛b榜上的最优结果是1.16)

数据预处理.ipynb

这个脚本所做的工作就是处理原始数据,将经纬度根据最近邻原则分配给区域id,构建一些基本的特征,譬如考虑潜伏期的天气特征,区域之间的流动特征,区域内部的流动特征,城市之间的迁移特征等等.输入就是原始数据,输出是构建的特征.代码运行时间会很长,根据不同电脑的配置,需要大约数个小时。而且这个脚本的预测结果是需要给后面使用的,为了方便运行,代码输出的结果特征已经在dataset/features目录下面给出。

回归预测.ipynb

改脚本实现的是利用空间和时间数构建的树模型,直接运行脚本,将会得到前m天的预测结果,可以看到预测结果可视化如下

image-20200801223616868

这个结果是短期的预测结果,还不是最终的提交文件,最终的结果需要结合SEIR的长期预测

seir_city.ipynb

这个脚本是以城市为粒度进行的SEIR模型构建,设置好数据路径,直接run all,最后会得到一个可以提交的结果,因为模型十分依赖于参数,参数的变动会导致模型结果的较大波动,而且一些随机种子的应用也会导致结果的变动,我们因为一些原因,并未记录最优参数,直接运行出来的结果可能并非最优。运行后也可以得到可视化结果(距离):

seir_region.ipynb

改脚本实现的是是以区域为粒度进行的SEIR模型构建,

lgb_persudo.ipynb

这个脚本就是伪标签的版本

About

2020第六届百度&西安交大大数据竞赛暨IKCEST第二届“一带一路”国际大数据竞赛


Languages

Language:Jupyter Notebook 100.0%