I. 前言
现如今很多时间序列预测论文都是EMD分解+LSTM的套路,并且都取得了不错的效果。不过在这些论文中,基本没有哪一篇论文详细介绍过自己的数据处理过程,以及这种方式在现实应用中到底如何实现,都只是停留在理论层面。因此,这篇文章主要想谈一谈当我们在时间序列预测中使用EMD方法时应该如何进行数据处理。
II. 信息泄露和计算量的问题
大部分论文中的数据处理方式是这样的:首先将所有数据进行EMD分解,得到多个分量。然后针对每一个分量,分别划分训练集和测试集。对每一个分量我们都利用一个模型在其训练集上进行训练,然后在测试集上进行测试。如果我们想得到原始数据的真实/预测值,只需要将所有分量的真实/预测值进行叠加即可。
然而,一般在时间序列预测中,我们是这样处理数据的:首先将所有数据划分为训练集和测试集,然后对训练集进行归一化和特征工程,然后进行模型训练,这种处理方式中,训练集和测试集是分开的,训练集中的数据和测试集无关。值得注意的是,在对测试集进行归一化时,我们使用的是训练集中的最大/最小值。反观EMD中,我们首先对所有数据进行分解再划分训练集和测试集,这就造成了一个问题:训练集中考虑了未来数据!简而言之,在得到训练集的各个分量的过程中,我们使用了测试集中的数据,然而对模型训练来讲,测试集中的数据应该是未知的,这就造成了信息泄露问题。
此外,由于EMD存在分解出的分量个数严重依赖于序列的分布和长度的问题,在模型真正落地应用的时候,也存在一定的问题:假设我们利用前24个时刻预测后12个时刻的数据,在模型训练阶段,我们一共训练了10个分量模型,也就是数据被分解为10个分量。在模型训练完毕后,需要投入使用,如果我们想要预测未来12小时的数据,那么我们只需要最近的24个时刻的数据,一个关键问题是:如何将这24个数据分解为10个分量? 因为只有将这24个数据分解为10个分量,我们才能去对应使用训练好了的10个模型。现实情况是这种分解几乎是不可能的,因为用于模型训练的数据短则几百条,长则上万条,如此长的数据才能够分解为10个分量,24个数据是不太可能被分解为10个分量的。
假设用于模型训练和测试的时间序列数据为D,长度为T+k,前T个数据用于模型训练,后k个数据用于模型测试,利用前24个数据预测后12个数据。对于上述两个问题,一般来讲有以下3种解决方案:
2.1 多次训练+多次预测
为了得到测试集中的每个预测值,我们可以进行如下步骤:
- 对前T个数据进行EMD分解,得到多个分量,然后对每一个分量都训练一个模型。
- 模型训练完毕后,我们利用D[T-23:T]的数据得到每一个分量模型的12个预测输出,然后再将它们进行叠加,就能得到D[T+1:T+12]的预测值。
- 对D[13:T+12]的数据进行EMD分解,同样得到多个分量,然后对每一个分量都训练一个模型。然后利用D[T-11:T+12]这24个数据得到每一个分量模型的12个预测数据,然后叠加,就能得到D[T+13:T+24]的12个预测值。
- 重复上述123步骤,每次分解窗口滑动12个数据,然后对窗口内的数据进行分解和模型训练,最后进行预测,直到得到D[T+1:T+k]的全部预测值。
- 利用D[T+k]的预测值和真实值计算评价指标。
上述方法虽然没有造成信息泄露,但计算量很大。不过这种方法最大的优点就是:不用保证每一次分解时的IMFs的个数一致,即对D[1:T]的数据进行分解时我们可以得到10个分量,此时用于预测的D[T-23:T]中的每个数据也存在10个分量,可以直接预测,对D[13:T+12]中的数据进行分解,可以得到12个分量,此时用于预测的D[T-11:T+12]中的每个数据同样存在12个分量,可以直接预测。
2.2 单次训练+多次分解预测
方法2.2与方法2.1的主要区别就是只训练一次:
- 首先将D[1:T]的数据进行分解,然后进行数据分解,并为每个分量训练一个模型。
- 正式预测时,首先利用D[T-23:T]的分解数据直接得到D[T+1:T+12]的预测值;然后对数据D[13:T+12]进行分解,利用D[T-11:T+12]得到D[T+13:T+24]的预测值。
- 循环预测,直至预测结束。
可以发现这种方法就是每次都将最近的长度和训练集一致的数据进行分解,然后进行预测。这种方法虽然没有造成信息泄露,但计算量也很大。同时,该方法存在着一个致命的缺陷:要求每T个数据分解出的IMFs的个数必须保持一致,否则无法使用训练好的模型。
2.3 滑动分解构造样本
具体步骤:
- 对D[1:24]的数据进行分解,得到分量集合X,然后对D[13:36]进行分解,得到分量集合Y,然后对每一个分量分别构建一个样本(x, y),其中x为前24个数据,y为后12个数据。
- 对D[13:36]和D[25:48]分别进行分解,13:36为x,37:48为y,同样为所有分量生成一个样本。
- 重复上述步骤,两个窗口每次都滑动12个数据,直至训练集结束,得到所有训练样本。
- 利用前3步得到数据训练多个分量模型。
- 正式预测时,每次都选最近的24个数据进行分解,然后进行预测叠加。
上述方法也没有造成信息泄露,但同样计算量很大。同时,该方法与2.2一样:要求每24个数据分解出的IMFs的个数必须保持一致,否则训练会失败,同时无法使用训练好的模型。
2.3 总结
- 方法一不存在漏洞,但计算量是三种方法中最大的。
- 方法二和方法三都存在分解个数不确定的问题。
- 针对后两个方法存在的问题,一些文章提出了解决办法:用过PyEMD的人都知道,在具体分解时是可以设定最大分解个数的,但这个个数不会超过分解个数的上限,在这种情况下我们可以事先假定一个分解个数,这个值一般较小,每次分解时都按照该分解个数进行分解,但同样存在一种极端情况:某次分解的个数连该最小值都无法达到,这时我们可以在数据后面添0,然后再进行分解,如果个数还是达不到就继续添0直至达到指定分解个数,由于0分解后各个分量相加还是为0(或者一点噪声),对最终结果不影响。
这种改进方法还有待检验!
III. 参考文献
A review and discussion of decomposition-based hybrid models for wind energy forecasting applications
|