维也纳国际娱乐_维也纳国际娱乐Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序

中国围棋网2017年12月06日 10时12分25秒
62

原标题:教程 | Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

选自GitHub

作者:Artur Suilin

机器之心编译

参与:蒋思源、路雪、黄小天

近日,Artur Suilin 等人发布了 Kaggle 网站流量时序预测竞赛第一名的详细解决方案。他们不仅公开了所有的实现代码,同时还详细解释了实现的模型与经验。机器之心简要介绍了他们所实现的模型与经验,更详细的代码请查看 GitHub 项目。


GitHub 项目地址:https://github.com/Arturus/kaggle-web-traffic


下面我们将简要介绍 Artur Suilin 如何修正 GRU 以完成网站流量时序预测竞赛。


预测有两个主要的信息源:


  • 局部特征。我们看到一个趋势时,希望它会继续(自回归模型)朝这个趋势发展;看到流量峰值时,知道它将逐渐衰减(滑动平均模型);看到假期交通流量增加,就知道以后的假期也会出现流量增加(季节模型)。

  • 全局特征。如果我们查看自相关(autocorrelation)函数图,就会注意到年与年之间强大的自相关和季节间的自相关。

  • 我决定使用 RNN seq2seq 模型进行预测,原因如下:



    特征工程


    RNN 足够强大来发现和学习自身特征。模型的特征列表如下:



    特征预处理


    所有特征(包括 One-Hot 编码的特征)被归一化至零均值和单位方差。每个 pageviews 序列被独立归一化。


    时间依赖特征(自相关性、国家等)被「拉伸」至时序长度,即每天重复使用 tf.tile() 命令。


    模型在来自初始时序的随机固定长度样本上进行训练。例如,如果初始时序长度是 600 天,我们使用 200 天的样本进行训练,那么我们可以在前 400 天中随意选择开始采样的样本。


    该采样工作是一种有效的数据增强机制:训练代码在每一步随机选择每次时序的开始点,生成无限量的几乎不重复的数据。


    模型的核心技术


    模型主要由两部分组成,即编码器和解码器。


    编码器为 cuDNN GRU,cuDNN 要比 TensorFlow 的 RNNCells 快大约 5 到 10 倍,但代价就是使用起来不太方便,且文档也不够完善。


    解码器为 TF GRUBlockCell,该 API 封装在 tf.while_loop() 中。循环体内的代码从上一步获得预测,并加入到当前时间步的输入特征中。


    处理长时间序列


    LSTM/GRU 对于相对较短的序列(100-300 项以内)来说是非常好的解决方案。但对于较长的序列来说,LSTM/GRU 仍然有效,只不过会逐渐遗忘较早时间步所包含的信息。Kaggle 竞赛的时间序列长达 700 多天,所以我们需要找一些方法来「加强」GRU 的记忆力。


    我们第一个方法先是考虑使用一些注意力机制。注意力机制可以将过去较长距离的有用信息保留到当前 RNN 单元中。对于我们的问题,最简单高效的注意力方法是使用固定权重的滑动窗口注意力机制。它在较长距离的过去时间步上有两个重要的点(考虑长期的季节性),即 1 年前和 1 个季度前。

    我们可以采用 current_day - 365 和 current_day - 90 这两个时间点的编码器输出,并将它们馈送到全连接层以降低维度,并将结果加入到解码器的输入特征中。这个解决方案虽然简单却大大降低了预测误差。


    随后我们将重要的点与它们的近邻求均值,并借此减少噪声和补偿不均匀的间隔(闰年和不同长度的月份):attn_365 = 0.25 * day_364 + 0.5 * day_365 + 0.25 * day_366。


    但随后我们意识到 0.25、0.5、0.25 是一个一维卷积核(length=3),我们可以自动学习更大的卷积核以检测过去重要的点。


    最后,我们构建了一个非常大的注意力机制,它会查看每一个时间序列的「指纹」(指纹由较小的卷积网络产生),并决定应该注意哪些点和为较大卷积核生成权重。这个应用于解码器输出的较大卷积核会为每一个预测的日期生成一个注意力特征。虽然最后没有使用这种方法,但这个注意力机制仍然保留在代码中,读者可以在模型代码中找到它。


    注意,我们并没有使用经典的注意力方案(Bahdanau 或 Luong 注意力机制),因为经典的注意力机制应该在每个预测步上使用所有的历史数据点从头开始计算,因此这种方法对于较长时间序列(约两年的天数)来说太耗时间了。所以我们的方案将会对所有数据点进行一次卷积,对所有预测时间步使用相同的注意力权重(这也是缺点),这样的方案计算起来要快很多。


    因为我们对注意力机制的复杂度感到不太满意,因此我们试图完全移除注意力机制,并将一年前、半年前、一季度前重要的数据点作为编码器和解码器的附加特征。这样的结果是非常令人惊讶的,甚至在预测质量方面都要比带注意力机制的模型略胜一筹。因此我们最好的公开分数都是仅使用滞后(lagged)数据点实现的,它们都没有使用注意力机制。

    滞后数据点另一个重要的优势是,模型可以使用更短的编码器而不需要担心损失过去的信息,因为这些信息现在明确地包含在特征中。在采用这种方法后,即使我们编码器的长度是 60 到 90 天,结果也是完全可以接受的,而以前需要 300-400 天的长度才能获得相同的性能。此外,更短的编码器就等于更快速的训练和更少的信息损失。


    损失和正则化


    SMAPE(竞赛用的目标损失函数)因其在零值周围不稳定的行为而无法直接使用(当真值为零的时候,损失函数是阶跃函数;预测值也为零的时候,则损失函数不确定)。


    我使用经平滑处理的可微 SMAPE 变体,它在所有实数上都表现良好:



    另一个选择是在 log1p(data) 上的 MAE 损失函数,它很平滑,且训练目标与 SMAPE 非常接近。


    最终预测取最接近的整数,负面预测取零。


    标签:维也纳国际娱乐,维也纳国际娱乐官网,维也纳国际娱乐娱乐

    本文链接:http://www.weiqi.cc/developer/120616.html 转载请注明出处