利用LSTM进行时间预测任务

2019/12/14


2019/12/15
正如前面所说,如果你想用LSTM(或者说RNN)进行时间预测,那么比如必须将数据转化成LSTM可以接收的数据格式,这一点是不容置疑的;从LSTM自己的格式上也可以看出来;但是现在的疑惑在于,这种处理方式是正确的吗?同时,keras在处理输入数据的时候,也没有非常明白,导致整体上的逻辑混乱。
我现在见到非常多的方式,利用keras进行数据处理的行为,是利用滑动窗口的方式,首先将这个问题转化为一个回归问题。我现在是用的方式就是这种。关键问题是:怎么将这个输入的格式,跟其内部的网络结构匹配上。

(从现在的视角来看,我还是没有理解这些方式的具体形式,今天看到的autoencoder就是这样,有的是直接按照全部样本,单步全部输进去,有的也是通过窗口调整了这些东西。我感觉我得找一些权威的来看什么方式是正确的,或者说两者都是正确的,只不过有适用的场景??2019/12/29 添加)
keras-how-should-i-prepare-input-data-for-rnn这个问答,回答的时候说的挺好,如果你想通过5秒来预测后面的数据,那么你只需要将样本进行调整,调整成5秒一个样本就行了。同时,他的数据还是多条样本,**并不是一条样本的情况。也就是说,是这么回事吗?看我想从什么角度来预测咯?2019/12/29 添加---看完这个东西,我就在思考,把全部数据都输入进去然后进行重构的形式(编码器),是不是说,每次只能都是这样,每次都把所有数据都输入进去才能实验?不对,不对,如果样本长度不一样的,肯定是不行的。所以你的输入很重要,你的模型就已经确定了。除非你调整你的输入为那种形状,但是每个样本输入的时候肯定是固定的。关键就是如果你只有一个样本,你是怎么把整个数据弄进去的。)
prepare-univariate-time-series-data-long-short-term-memory-networks/这篇文章中提到,LSTM对于200-400之间的时间步数会工作更好,也提到了LSTM需要适合他的输入,3D。但是我不太清楚,那么那种stateful的是不是特殊情况呢?同时他下面有读者的评论提供了说是选择参数的文章,但是我下载了,看不懂。)

当时学习传统的时间预测模型过程中,书中提到,因为只有一条时间序列,并不能满足数据量的要求,只能是利用历史数据进行预测,这种方式就必须要求这个时间序列是平稳的。

时间预测的定义

时间预测问题:给一段历史数据,然后我预测未来的数值;可能是预测下一个点的数值,可能是预测下个时间段的数值。(上述定义应该是没有什么问题)

keras的使用方法

前面的那点已经说明,由于网络格式的设置,或者说数据格式的设置,我的输入参数必然是3D固定的;目前使用的方式就是这样,利用时间窗口的方法来预测最后一个值,那么keras输入参数input_shape = (time_steps,features),注意,一般来说你的输入数据应该是(samples,time_steps,features)输入数据的格式,要满足这个input_shape的要求,他的输入必然是3D的。
(input_shape的第一个参数可以是None,导致输入的时间步长可以不一样(个人感觉),虽然我测试的时候是使用的固定的步长)


而我所困惑的,其实是这种处理输入数据的方式。或者说,他实际的这个time_steps的含义。特别是前面说过的stateful的含义,我感觉这个东西才是真正的我前面说过的一直相关的东西。

文章提示

文章[1]中的图表,是唯一一个我见到的把LSTM网络结构和输入参数同时画在一起的,其他的都是单独介绍这个LSTM的原理,不过因为stateful这个东西的缘故,我并没有完全看懂他的东西,而且感觉他的内容有个地方不是地方,最上面的no'' samples另外一点,他没有把这个具体输入进去的过程给描述清楚,比如说, 我输入的步数只有1,也就是自变量只有1个,这种情况下,如果是使用4个LSTM的隐藏单元,他的输入和输入时怎么对应的。我感觉这个是不是就是我之前看到的那种,就是多种LSTM的模型形式。

模型形式

我不是确定是不是就是这个,感觉差不多 ,这个也需要考证。其实我最关注的就是,如果我的输入他是3步数,然后我的LSTM隐藏元个数是5个比如,他的网络结构图是什么样的。
这里说的不对,你要去看实际的这个LSTM内部信息,它里面有一些激活函数,他的结构就跟正常的神经网络是一样的,也就是说,如果你的步数是1,那你就是一个LSTM,具体内容可以看知乎[10]的答案。
上面这个图就是跟你设置的这个历史转状态有关,不太理解的就是那个many-to-many的第一个,为什么错位了。这个问题可以看问答[9],基本上你的需求,大致上就是这些,可能还有长度不一样的情况。
文章[11-12]是代码对这部分内容的示例。

文章[2]介绍调整输入参数维度的方法,但我感觉可看可不看,只要你理解了到底你的输入是什么样子的。
更有意义的是文章[13],这里他说的一句话很有用:你必须把这个问题转化成以往的那种问题,类似监督问题,就是把数据准备好。
文章[3]是官方对时间序列预测的介绍文档,非常简单,使用的是tensorflow的接口,但大体内容能够理解;他采用的方式也是滑动窗口的形式,所以,我个人认为我之前的疑问->这种方式是不是不对,回答应该是处理方式没问题。我要考虑他这种输入数据的形式与实际lstm要求的参数的对应,特别是前面说的stateful的问题。
文章[4]是一篇预测时间文章,他的内容没什么特殊的,但他前面数据建模中的一些话非常有意义,**同时,他后面在进行参数调整的时候,用到了一个东西,叫做MLFlow,这是一个开源的框架,有时间可以看看,感觉可以提高后续训练过程的效率。

Before we can train a neural network, we need to model the data in a way the network can learn from a sequence of past values. Specifically, LSTM expects the input data in a specific 3D tensor format of test sample size by time steps by the number of input features. As a supervised learning approach, LSTM requires both features and labels in order to learn. In the context of time series forecasting, it is important to provide the past values as features and future values as labels, so LSTM’s can learn how to predict the future. Thus, we explode the time series data into a 2D array of features called ‘X’, where the input data consists of overlapping lagged values at the desired number of timesteps in batches. We generate a 1D array called ‘y’ consisting of only the labels or future values which we are trying to predict for every batch of input features. The input data also should include lagged values of ‘y’ so the network can also learn from past values of the labels.

文章[5]介绍了keras的参数形式,但中间提到的这个batch_size,我并不是非常理解,我也没用过,特别是说,这个东西跟后面训练的时候使用的batch又有什么关联?需要考证。
(感觉这个文章说的很对,但是我他妈就是看不懂,这个就算了,后面再看吧 2019/12/29 -)
https://zhuanlan.zhihu.com/p/34495801
http://philipperemy.github.io/keras-stateful-lstm/
还有这另外的两篇文章,我看了这个之后,就感觉他妈的,对这个东西充满了恐惧,我感觉我没有掌握它。

issue[6]是一个关于输入参数维度的参考,但是我现在还是不能理解。

文章[7-8]是非常不错的介绍,他是单纯的去介绍LSTM原理的内容,相比于那篇经典的介绍,他的介绍更为清楚,特别是一些图片更具参考意义。

问答[9]是一个对LSTM的清楚介绍,同时涉及了一些stateful的信息,这个一定要多仔细看,他的回答里同时涉及了多种LSTM的模型。

参考文献

[1][Keras_LSTM_Diagram
[2]reshape-input-data-long-short-term-memory-networks-keras/
[3]Time series forecasting
[4]doing-multivariate-time-series-forecasting-with-recurrent-neural-networks.html
[5]understanding-input-and-output-shape-in-lstm-keras/
[6]https://github.com/keras-team/keras/issues/4870
[7]illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
[8]understanding-lstm-and-its-diagrams-37e2f46f1714
[9]Understanding Keras LSTMs
[10]Keras关于LSTM的units参数,还是不理解?
[11[Keras] 利用Keras建構LSTM模型,以Stock Prediction 為例 1
[12]6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
[13]convert-time-series-supervised-learning-problem-python/

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值