在时间序列预测领域,广泛使用 EMD、VMD、ICEEMDAN 等分解算法。然而,许多研究在数据分解步骤中将训练数据集和测试数据集一起分解。在实际应用中,由于测试数据未知,分解方法无法直接分解未知数据,这使得许多先前的研究结果无法在预测实践中加以应用。另外,测试数据集的分解会给训练过程带来未知信息,从而显示出虚假的高预测精度。
以某研究为例,若将包含训练集和测试集的总数据带入 VMD 分解,无论中间采用何种方法,都会导致预测精度虚高。
从信号分解原理来看,当把整个数据集输入到 VMD、CEEMDAN 等分解算法时,算法在计算 t=100 处的模态值时,会利用 t=101, 102...甚至 T 处的信息来平衡整体的平滑度和带宽约束。此外,任何信号分解算法在处理时间序列的'两端'时都会遇到数学上的困难。算法会将序列末尾的数据'折叠'并拼接到前面,或者进行循环卷积。这意味着,处于序列末尾的测试集数据,被直接作为边界条件影响了序列中间或开头的训练集数据的分解结果,导致模型实际上已经'偷看'到了未来的走势。
为防止 VMD 等方法导致的信息泄露问题,可采用滚动分解方法。
首先,分解已知的时间序列数据(不包括测试数据);其次,使用分解后的分量作为预测模型的输入来预测第一个测试数据点;第三,在集成中使用简单加法策略获得第一个测试数据点的预测结果。
之后,第二轮滚动分解和滚动预测开始。此时,需要将训练数据集扩展为当前已知的数据,即训练数据集加上第一个测试数据点来预测第二个测试数据点,然后进行分量预测和集成。重复上述步骤,直到所有测试集数据被预测出为止。

通过一个案例来看看基于滚动分解机制的预测效果(以下所有程序,均采用 Matlab 完成)。我们首先采用一个某地的风速数据集,数据集格式如下:

原始数据大概长这样,是一个典型的非线性、非平稳时间序列。

接着,我们通过如下方式进行 VMD 分解与预测:
- 取过去 W 个点(窗口大小)的数据片段,这里 W 设置为 6,当然您也可以设置为其他数字,都没问题。
- 对这个片段进行 VMD 分解。
- 提取分解出的特征(IMFs),由于 BP 模型运行速度较快,因此我们输入到 BP 模型预测 x(t+1)。
- 时间前进一步到 t+1,获得真实值,窗口滑动,重复上述步骤。
得到的结果如下所示,首先是预测效果图(效果图只有测试集的,因为预测训练集毫无意义):

可以看到,效果还是非常不错的,预测值基本上都能够紧贴真实值,RMSE 也非常低。其次是回归拟合图:

以及误差直方图:





