/DeepTraffic

A project for traffic flow prediction

Primary LanguagePython

DeepTraffic

DeepTraffic 是一个能实时预测高速公路上的交通流量的模型。它利用高速公路上的时间日期、车道号、车流量、车速等历史信息预测一天当中某个时刻的车流量和车速。

数据定义

从原始数据集中提取部分字段后,数据形式如下1

gcrq cdh sjxh xkc dkc xhc zhc dhc tdh jzx mtc tlj xkcs dkcs xhcs zhcs dhcs tdhs jzxs mtcs
2016/5/22 11 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2016/5/22 12 50 3 0 0 0 0 0 0 0 0 77 0 0 0 0 0 0 0
2016/5/22 31 58 3 0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0
2016/5/22 32 60 3 0 0 1 1 1 0 0 0 80 0 0 67 79 63 0 0

​ 表一:数据集相关字段

表中各字段解释如下:

字段 名称
gcrq 观察日期
cdh 车道号
sjxh 时间序号
xkc 小客车流量
dkc 大客车流量
xhc 小货车流量
zhc 中货车流量
dhc 大货车流量
tdh 特大货车流量
jzx 集装箱流量
mtc 摩托车流量
tlj 拖拉机流量
xkcs 小客车速度
dkcs 大客车速度
xhcs 小货车速度
zhcs 中货车速度
dhcs 大货车速度
tdhs 特大货车速度
jzxs 集装箱速度
mtcs 摩托车速度
tljs 拖拉机速度

​ 表二:字段解释

  • 数据是每隔5分钟采样,即每个时间序号相隔5分钟。比如49~50这个时间段表示从某一天开始(00:00)起第49个5分钟至第50个5分钟的时间间隔。一天总共有288个时间序号。观察日期有36天。
  • 该条高速公路共有4条车道。车道号分别为11、12、31、32。
  • 表一中的一行表示在某一天(观察日期)的某一时刻(时间序号)的某一条车道(车道号)上各种类型车辆的数目和对应的车辆速度。

算法**

由于我们目标是利用过去历史时刻的车流量和车速预测当前时刻的车流量和车速,所以可把当前时刻的车流量和车速作为因变量,历史时刻的车流量和车速作为自变量,从而建立一个模型。

算法的大致想法是把前20分钟的车流量和车速作为输入 $x$ ,紧接着它后面的5分钟的车流量和车速则是 $y$ ,在训练集中它就是 $x$ 的 label。我们要做的就是找到一个模型 $y=f(x)$ ,使得给定某个20分钟时间段的数据,模型能预测在接下来的5分钟后的车流量和车速。

具体做法是求出某个时刻某个车道的平均车流量和平均车速,把它作为算法的输入。算法的输出是在这个时刻后的5分钟内的平均车流量和平均车速。把输入用矩阵的形式表示就是:

车道号\时间(单位:车流量) 1 2 3 4
11 0.1 0 0.3 0
12 0 0 0.2 0
31 0.2 0 0 0
32 0 0.5 0.4 0

车速与之同理。如果从列的角度,即按时间序号来看,时间序号为1的列形式为(0.1, 0, 0.2, 0),这就是一个时间步的输入向量。这个矩阵共有4个时间步的输入向量。

我们用 经典LSTM(长短期记忆网络)来实现这个交通流量模型。time steps 设置为4,即输入的时间步为4。每个时间步的车流量为一个 $4\times1$ 的向量,车速也是一个 $4\times1$ 的向量,把他们拼接成一个 $8\times1$的向量作为 LSTM 里一个时间步的输入。则 LSTM 的输入为 $8\times4$ 的矩阵。4个时间步后面的一个时间步就是它的标签。

算法步骤

  • 用 pandas 和 numpy 处理原始数据集,得到相关字段和数据。对数据进行归一化处理,即把车流量各字段和车速各字段映射到一个[0, 1]的区间上。
  • 针对每行数据,求出平均车流量和车速,并按观察日期、时间序号和车道号排序、分组得到新的数据组织形式。
  • 制作数据集。用 numpy 处理上述数据,把每个时间序号的数据都转换为 $8\times1$的向量作为一个分组。则一天共有288个这样的分组。每次读取4个分组存放到一个数组里,并把紧邻这4个分组后面的一个分组存放到另一个数组里,这就是一个样本点。样本点的形式为:$(X, y)$ 。其中,$X$ 的形式为 $(8\times1, 8\times1,8\times1,8\times1)$ ,里面有4个 $8\times1$ 的向量。$y$ 的形式为 $(8\times1)$ ,里面的 $8\times1$ 向量的时间序号紧邻 $X$ 的最后一个 $8\times1$ 向量的时间序号之后。分割数据集为训练集和测试集。
  • 用 tensorflow 里的 经典LSTM模块训练数据,经过参数调优,最终得到模型。

遇到过的困难

  • 根据现实问题建模。建模的经验不足,虽然有很多想法,但是这些想法很难转化为模型从而实现它。通过部分论文产生了一些想法,然后根据现实中的数据建立起了自己的模型。
  • 不熟悉数据集的制作。网上几乎没有这方面的教程,只能一边查阅 pandas API 和 numpy API 一边完成代码的编写。
  • 神经网络调参经验不足。通过可视化训练结果后,慢慢找到了一点感觉。由于神经网络里的参数可能很多,很难控制变量调整参数,对一些超参数的调优仍然有待摸索。

Footnotes

  1. 限于表格容量,未列出 tljs (拖拉机速度)字段。原始数据集中还有小时、分钟、行驶方向等字段,该表是经过提取相关字段后新生成的表。