时间序列预测这东西,单模型做到头就是那么回事。我曾一度迷信XGBoost,觉得树模型天下无敌,直到在某个电力负荷数据集上被一组用"分解+融合"思路的论文按在地上摩擦,才发现自己连入门都算不上。后面花了两三周把那套思路完整复现了一遍,核心就是今天要聊的:非线性二次分解(CEEMDAN + VMD)配上Ridge、RandomForest、XGBoost三个模型做融合预测。整套代码跑下来,效果比任何单一模型都稳,尤其是在非平稳、强波动的时间序列上,提升非常明显。
我不打算给你念论文,也不打算贴那种"复制即跑"但完全看不懂的代码。这篇博文会把这套方案拆开揉碎,讲清楚为什么分解要分两次、为什么偏偏选这三个模型、融合到底怎么融,以及我在实操中踩过的那些坑。看完你不仅能复现,还能知道每个环节背后的取舍逻辑。
1. 单模型做时间序列预测,到底卡在哪了
1.1 三个主流模型的各自短板
先说Ridge回归。岭回归本质上是最小二乘加L2正则化,它假设目标变量和特征之间是线性关系。时间序列里的趋势项、周期性成分,用线性模型去拟合确实能拿下,但一旦遇到非线性波动——比如突发事件导致的尖峰、市场情绪带来的突变——线性模型就直接失明了。你调再好的正则化系数,它也学不出非线性模式,因为假设就摆在那里。
随机森林作为Bagging类算法的代表,通过并行训练多棵决策树并取平均来降低方差。它的优势在于能捕捉非线性关系,对异常值有一定鲁棒性。但RF在做预测时有一个天生缺陷:它无法外推训练集取值范围之外的目标值。也就是说,如果测试集中的某个数值超过了训练集中该特征的最大值,RF的预测结果会被"钳制"在训练集范围附近。这对时间序列预测来说很致命,因为时间序列的特点就是会出现历史从未出现过的新极值。
XGBoost作为Boosting类算法的代表,用加法模型加前向分布算法,逐步拟合残差。它的拟合能力非常强,是这三者里最能打的一个。但它的问题也很典型:对噪声极度敏感,训练轮数一旦过高就容易把噪声也学进去,在测试集上表现反而更差。而且XGBoost对参数极其挑剔,learning_rate、max_depth、subsample这些参数稍微调得不合适,结果差出几个量级都不是什么稀罕事。
1.2 为什么"先分解、再预测"能提升效果
单一模型有短板,那就换思路:不直接用原始序列做预测,而是先把序列分解成若干个子序列,分别建模再重构。
这个思路能成立的根本原因在于,时间序列本质上是多种不同频率、不同特性的信号叠加。电力负荷数据里有每日的周期性波动,有天气变化带来的低频趋势,还有突发事件导致的高频随机波动。把这几种成分混在一起喂给模型,模型必须同时拟合不同频率的规律,互相干扰,效果自然不会好。
而分解之后,每个子序列的频率特性相对单一,模型只需要学习一种规律。Ridge去管低频趋势,RF管中等频率的非线性波动,XGBoost去啃高频细节,各司其职,哪怕每个模型都不完美,合起来的整体效果也会远超单模型。
1.3 分解一次不够,为什么还要再分解
很多入门方案用EMD或EEMD分解一次就完事了。但实际跑下来你会发现,第一次分解得到的某些IMF分量依然非常复杂,尤其是高频分量——它们依然包含着剧烈的波动和噪声。拿这些IMF直接建模,模型还是得同时学高频振荡和噪声,负担一点没减轻。
所以二次分解的意义就在于:对第一次分解出来的复杂分量再做一次分解,把"难啃的骨头"继续拆细。第一层分解负责把趋势和周期拆开,第二层分解负责把高频复杂分量进一步拆成更简单的模态。每一层各干各的活,分工明确,后面的模型才能真正轻松。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 非线性二次分解:CEEMDAN打底,VMD收尾
2.1 第一层分解为什么选CEEMDAN而不是EMD或EEMD
EMD是希尔伯特-黄变换的核心,能把非线性非平稳信号自适应地分解成若干个本征模态函数(IMF)。但EMD有个臭名昭著的问题——模态混叠(mode mixing),也就是不同频率的成分混进同一个IMF里,导致分解结果不稳定。你输入数据稍微改一点点,IMF就全变了。
EEMD通过往原始信号里反复加白噪声来缓解模态混叠,但代价是计算量大,而且加了噪声之后重构误差很难完全消除。
CEEMDAN(完全自适应噪声集合经验模态分解)在EEMD基础上做了改进,它在每一层分解时自适应地添加噪声,并且噪声在分解完成后可以完全被抵消。简单说,CEEMDAN既保留了EEMD抑制模态混叠的优点,又不容易引入重构误差,分解结果更稳定、更完备。我在实际使用中,CEEMDAN分解出来的IMF数量一般为6到10个,且每个IMF的频率特征相对清晰,比EMD稳定得多。
2.2 对高频IMF再做VMD的现实意义
第一次分解完成后,你会得到一串IMF。其中IMF1、IMF2这些排在前面的分量频率最高,它们往往包含剧烈的振荡和随机噪声。如果你把IMF1直接扔给预测模型,你会发现无论用什么模型预测,误差都很大,因为IMF1本身的信噪比太低。
VMD(变分模态分解)是另一种完全不同的分解思路。它通过构造变分问题,把信号分解成若干个中心频率各不相同的有限带宽模态,本质上是把信号在频域上分离。VMD的优势在于它能把复杂信号按中心频率切分成窄带模态,每个模态的频带很窄,规律性更强,更容易预测。
所以常规做法是:第一层用CEEMDAN做完整分解,然后把频率最高、能量占比又不小的几个IMF分量挑出来,第二层用VMD再分解一次,得到若干带宽更窄的模态子分量。这里有个关键点要注意:并不是所有IMF都需要二次分解。低频IMF通常趋势明显,直接建模效果就不差;只有那些高频IMF,非平稳性依然很强,才值得做VMD二次处理。如果不管三七二十一全都二次分解,不仅计算量暴涨,还会把一些原本规律清晰的分量打碎,适得其反。
2.3 分解参数的工程设置与Python实现
我用的是PyEMD库
