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的特征,最后将两个特征融合得到未来趋势。整个框架如下图:
- RNN用的是naive的LSTM,得到的特征用R(T)表示;
- CNN用的是H层1-d卷积来提取局部特征,用C(L)表示;
- 特征融合,预测:
用Wr和Wc矩阵将两个特征映射到相同维度然后相加,经过一个element-wise leaky ReLU activation 函数,最后连接到输出层<l, s>。
Loss 函数:
实验
实验设置
- Dataset:
- Power Consumption(PC): 一个家庭电量的序列
- Gas Sensor. 检测气体的传感器数据
- Stock Transaction, Yahoo股票1950-10到2016-4
数据shuffle后分为10%用于测试,其他用于训练。
这里没有提一个序列的过去趋势是怎么确定的,后面我会看看探究怎么确定的,知道了就补充下。
- Baseine:
- CNN:使用的是原始序列来预测
- LSTM:使用趋势序列来预测
- ConvNet+LSTM:ConvNet提取序列特征,然后用LSTM预测
- SVR:联合T和L作输入
- Pattern-based hidden markov model(pHMM): 对序列分段然后用HMM建模序列段之间的依赖,然后根据预测时序的状态来决定评估未来趋势。
- Naive:用上一trend预测。
(这里的LSTM是对趋势序列做预测的,我觉得应该增加一个使用原始序列来预测的,这里只有用CNN使用原始数据的。)
- Metric
RMSE - 训练
省略模型的具体参数.....
实验结果
-
对参数窗口大小w做了对比(这里只列出一个):
从实验设置来看,这个窗口大小最小300,很大,这个应该是因为要预测未来的总体趋势,所以需要使用较大的局部序列。
总结
这篇论文用的方法都是很常见的了,不过做的问题是时序趋势预测,与传统预测未来某个时刻的值不一样,不过两者有很多共同的应用(都是对未来的预测)。这种预测方法的好处我觉得在于它利用了一个全局的趋势信息(T),然后预测的目标多了一个持续时间。另外因为趋势是一个长时间的,所以这个是适用于长期的预测,如长期的投资等。