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分钟的车流量和车速作为输入
具体做法是求出某个时刻某个车道的平均车流量和平均车速,把它作为算法的输入。算法的输出是在这个时刻后的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。每个时间步的车流量为一个
- 用 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
-
限于表格容量,未列出 tljs (拖拉机速度)字段。原始数据集中还有小时、分钟、行驶方向等字段,该表是经过提取相关字段后新生成的表。 ↩