TreNet:预测时序趋势

TreNet:预测时序趋势

时序趋势Trend指的是时间序列未来是上升还是下降趋势,通常包括趋势的幅度和持续时间。预测趋势可以用在资源分配,负载调度(如预测负载会变大时,提前增加资源配置来减少负载),股票交易等。其实这个问题也可以变成时序预测问题,预测得到未来的值就能知道未来是什么趋势,不过这样趋势的持续时间是固定的(因为预测的是未来某个时间的值)。
为了解决这个问题,论文Hybrid Neural Networks for Learning the Trend in Time Series,IJCAI-17提出了TreNet,一个端到端的网络,综合学习序列的局部和全局的特征来预测趋势。

Problem

时序趋势表示为持续时间duration和斜率slope,用<l_k, s_k>表示,如下图(c)所示:



图c是一个趋势序列,没有原始序列值信息,而只包含趋势信息的,用T来表示这个趋势序列T={<l_k, s_k>}。原始序列表示为X={x_1, x_2, ... , x_T}。所有的l_k加起来等与序列长度T
趋势序列表示的是时序的整体趋势信息,而没有局部的趋势信息,因此还需要考虑序列的局部具体信息,用L={<x_t(k-w), ..., x_t(k)>}表示,其中tk是trend k的结束时间,w是取的局部序列长度。
现在,问题的目标就是利用趋势序列T和局部序列L来预测未来的趋势<l_t+1, s_t+1>。可以用下图形象的说明:



左图是L,右图是T,然后预测t=100之后的趋势。

TreNet

TreNet使用RNN来捕捉趋势序列T的特征,CNN来捕捉局部序列L的特征,最后将两个特征融合得到未来趋势。整个框架如下图:


  1. RNN用的是naive的LSTM,得到的特征用R(T)表示;
  2. CNN用的是H层1-d卷积来提取局部特征,用C(L)表示;
  3. 特征融合,预测:

    用Wr和Wc矩阵将两个特征映射到相同维度然后相加,经过一个element-wise leaky ReLU activation 函数,最后连接到输出层<l, s>。
    Loss 函数:

实验

实验设置

  • Dataset:
  1. Power Consumption(PC): 一个家庭电量的序列
  2. Gas Sensor. 检测气体的传感器数据
  3. Stock Transaction, Yahoo股票1950-10到2016-4

数据shuffle后分为10%用于测试,其他用于训练。
这里没有提一个序列的过去趋势是怎么确定的,后面我会看看探究怎么确定的,知道了就补充下。

  • Baseine:
  1. CNN:使用的是原始序列来预测
  2. LSTM:使用趋势序列来预测
  3. ConvNet+LSTM:ConvNet提取序列特征,然后用LSTM预测
  4. SVR:联合T和L作输入
  5. Pattern-based hidden markov model(pHMM): 对序列分段然后用HMM建模序列段之间的依赖,然后根据预测时序的状态来决定评估未来趋势。
  6. Naive:用上一trend预测。

(这里的LSTM是对趋势序列做预测的,我觉得应该增加一个使用原始序列来预测的,这里只有用CNN使用原始数据的。)

  • Metric
    RMSE
  • 训练
    省略模型的具体参数.....

实验结果

  1. 对参数窗口大小w做了对比(这里只列出一个):



    从实验设置来看,这个窗口大小最小300,很大,这个应该是因为要预测未来的总体趋势,所以需要使用较大的局部序列。

总结

这篇论文用的方法都是很常见的了,不过做的问题是时序趋势预测,与传统预测未来某个时刻的值不一样,不过两者有很多共同的应用(都是对未来的预测)。这种预测方法的好处我觉得在于它利用了一个全局的趋势信息(T),然后预测的目标多了一个持续时间。另外因为趋势是一个长时间的,所以这个是适用于长期的预测,如长期的投资等。

推荐阅读更多精彩内容