ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LSSVM到VMD-SSA-LSSVM:电力负荷预测组合模型路线图

LSSVM到VMD-SSA-LSSVM:电力负荷预测组合模型路线图

1. 先把四种算法的“辈分关系”说清楚

1.1 负荷序列的真实复杂度:短期预测为什么不能硬套一个模型

做短期电力负荷预测的人,拿到手里的数据往往不是一条平滑的曲线。一天24个点或96个点(15分钟采样),看起来有规律,但仔细展开看就会发现:有工作日的早晚双峰、有午休低谷、周末明显下移、节假日直接变形,再加上温度骤变、天气突变,甚至某个区域举办大型活动,都会在负荷曲线上砸出一个坑或顶出一座峰。这种序列通常是非平稳、强非线性、周期性叠加随机扰动的关系。直接拿一个基础回归模型去拟合,往往只能抓住大体趋势,细节处的拐点和尖峰基本都会被平滑掉,预测误差集中出现在这些位置。

这也是为什么在电力负荷预测这个领域,很少见到“一个模型打天下”的做法。常见思路是把问题进行拆解:要么对原始序列做分解,把复杂问题拆成若干相对简单的子问题;要么对模型本身做优化,让基础模型具备更强的自适应能力。标题里这四种算法——LSSVM、SSA-LSSVM、VMD-LSSVM、VMD-SSA-LSSVM,本质上就是这两条路线组合出来的一个递进序列。

1.2 LSSVM的先天不足与两条补强路线

先看基本面。LSSVM(最小二乘支持向量机)在负荷预测里算是一个经典基座模型,它把标准SVM的凸二次规划问题简化成线性方程组求解,训练速度快,小样本下泛化能力也不错。但它的短板也摆在明面上:预测效果严重依赖正则化参数和核函数参数,参数调不好误差就会明显抬升;另外,面对包含大量高频波动成分的原始负荷序列,它的拟合能力会显得捉襟见肘。

于是两条改进思路很自然就出来了。第一,解决参数选择问题——让算法自己去找最优参数,也就是引入群体智能优化算法,麻雀搜索算法(SSA)就是其中近年用得比较多的一种。第二,解决输入序列复杂度过高的问题——先把原始负荷序列用变分模态分解(VMD)拆成若干个相对平稳的分量,再逐个预测后叠加重构。这两条路线单独用,就构成了SSA-LSSVM和VMD-LSSVM;把两者叠加,就得到VMD-SSA-LSSVM。

1.3 四种算法其实是一张路线图

四者的关系可以理解成一个逐步加装备的过程。LSSVM是裸装状态;SSA-LSSVM相当于给模型装了一个自动调参模块;VMD-LSSVM相当于在数据输入端增加了一个预处理模块;VMD-SSA-LSSVM则是预处理和参数寻优全都装上。这种递进设计最大的好处是:每次只改一个变量,实验结果能明确归因到具体某个改进环节,而不是一笔糊涂账。这也是我在设计对比实验时的基本原则,后面会展开讲。

2. 四种算法的底层运行逻辑

2.1 LSSVM:把支持向量机的二次规划换成线性方程组

LSSVM和标准SVM的核心区别,很多人一句话就能说出来:标准SVM用不等式约束,LSSVM用等式约束;标准SVM求解的是一个二次规划问题,LSSVM求解的是一个线性方程组。但落到实际使用上,这两个差异带来了明显的性能变化。SVM回归要求部分样本点落在间隔带之外,求解时依赖于支持向量的选取,计算复杂度随样本量增长很快;LSSVM则让所有训练样本都参与约束,误差项取平方形式,于是可以把求解过程转化为一个线性KKT方程组的求解,在同样数据量下训练时间短得多。

在负荷预测里,核函数一般直接选RBF径向基核。原因很简单:负荷序列的特征维度不算高,样本量通常在上千到几千的规模,RBF核的映射能力足够刻画非线性关系,而且参数只有两个——正则化参数γ(有些文献写C)和核宽度参数σ²。γ控制模型对误差的惩罚力度,σ²控制单个样本的影响范围。这两个值的组合直接决定模型是欠拟合、正常、还是过拟合。实际调参时往往会发现一个规律:σ²太小,模型非常容易把训练集的噪声也学进去;γ太大,模型会变得僵硬;两者配合不当预测曲线会出现明显的波动毛刺。

2.2 SSA:麻雀觅食策略为什么比PSO更适合参数寻优

麻雀搜索算法是这几年的新面孔,它的灵感来自麻雀群体在觅食过程中的分工机制。种群里的个体分成三类角色:发现者、加入者和警戒者。发现者负责搜索食物丰富区域,加入者跟随发现者获取食物,警戒者则在发现危险时引导群体转移。每次迭代中,三个角色的位置更新规则不同:发现者按较大步长探索全局空间;加入者向当前最优位置靠拢,同时保留一定随机性;警戒者则负责跳出局部区域,防止整个种群陷入一个并不优秀的小范围。

相比粒子群算法(PSO)和遗传算法(GA),SSA在LSSVM参数寻优上有几个务实优势。第一,需要调整的超参数少,种群规模和最大迭代次数定下来基本就能跑,不需要像GA那样同时配交叉率、变异率;第二,发现者和警戒者机制天然兼顾了全局探索和局部开发,在多峰问题上不容易早早收敛;第三,它的位置更新计算量小,在同样的迭代次数下耗时更短,对于需要反复调参对比的实验场景非常友好。

2.3 VMD:把非平稳序列分解成可以“逐个击破”的分量

VMD是一种完全非递归的信号分解方法,思路是把原始信号分解为若干个有限带宽的固有模态函数(IMF),并且让每个分量的估计带宽之和最小。相比之前常见的EMD(经验模态分解),VMD最大的改进在于解决了模态混叠和端点效应问题。EMD是逐级筛分的递归过程,对噪声和采样率敏感,容易出现一个分量里混着多个频率成分;而VMD是求解一个变分问题的过程,计算时一次性确定所有分量的中心频率和带宽,分解结果更稳定。

在负荷预测里,VMD的价值在于把一个同时包含趋势、周期波动和随机噪声的序列,拆成频率由低到高的K个分量。低频分量反映负荷的整体趋势和日周期规律,高频分量对应的则是天气突变、用电随机行为这类成分。每个分量单独建模的难度比原始序列低得多,加总重构后误差往往比直接预测原始序列要小。不过VMD的两个关键参数需要认真对待:分解层数K和惩罚因子α。K取大了会出现过分解,把原本连续的分量硬切碎成几段;取小了又分解不彻底,高频噪声仍然混在主分量里。

2.4 VMD-SSA-LSSVM的完整数据流

把三个算法串起来,整个过程走一遍就能看清数据流动方向。第一步,原始负荷序列送入VMD,得到K个IMF分量和一个残差项(或者把残差也视为一个分量)。第二步,对每个分量分别做归一化,按照相同规则划分训练集和测试集。第三步,SSA在参数空间里搜索LSSVM的最优γ和σ²,用训练集的交叉验证误差作为适应度评判标准,然后把全部训练数据用最优参数重新训练LSSVM。第四步,对测试集逐点预测每个分量的未来值,把所有分量的预测结果加在一起,反归一化后得到最终的负荷预测值。

这套流程里的每个环节都有讲究,任何一个环节出问题都会影响最终结果。比如VMD层数没定好,高频分量可能混沌一片;再比如SSA寻优时如果不加交叉验证,很可能找到一组在训练集上精度极高但预测时完全失灵的参数。所以做这个实验时,不能把注意力都放在“跑通流程”上,而要把每一步的细节都记录清楚。

3. 从数据到预测结果的完整实现路径

3.1 数据清洗与归一化:这里最容易埋雷

拿到负荷数据后,第一步不是直接分解,而是清洗。负荷数据常见的脏点包括:采集终端故障产生的零值或跳变值、节假日与正常日负荷形态差异过大而导致的离群点、以及少量缺失记录。我的处理方式是,将连续缺失超过2个点的时段直接剔除,对单点缺失用前后时刻的线性插值补全,对明显异常的跳变值用同一时刻前7天的中位数替换。这类清洗操作对后续分解和建模的影响非常大,高频分量对异常点尤其敏感,一个离群值就可能在VMD分解后形成一个虚假的模态分量。

归一化的细节很多人不太在意,但这里恰恰是容易“埋雷”的地方。我的建议是:按训练集的均值和方差(或最小最大值)来归一化,然后把这个统计量直接应用到测试集,而不是用全量数据的统计量统一归一化。后者会引入测试集信息,造成数据泄露,使模型评估结果“虚高”。这个问题在第5部分还会重点展开。归一化方法上,负荷预测常用min-max归一化,把所有值压到[0,1]区间,与LSSVM的RBF核函数比较匹配。

3.2 VMD分解的层数与惩罚因子选择

VMD分解中K的选取没有一个万能公式,但有一条相对可靠的实践路径:先设置一个较大的K(比如8或10),分解后观察各个分量的中心频率。如果发现两个以上分量的中心频率非常接近,甚至出现频谱重叠,说明K偏大,存在过分解;如果最后一个分量的中心频率仍然很高,说明还有高频成分没被分离出来,K偏小。我实测下来,短期负荷预测的K值通常落在4到7之间。以某地区一个月的96点负荷数据为例,K设为5时分量的中心频率分别集中在0.02、0.08、0.15、0.25和0.35个奈奎斯特频率附近,彼此间距合理,没有再细分或合并的必要。

惩罚因子α的作用是控制分解分量的带宽。α越大,分量带宽越窄,对噪声的容忍度越低;α太小时分量会互相重叠,破坏VMD“有限带宽”的前提。文献里常见的取法是取2000左右的默认值,但我的经验是,具体取值要看数据采样频率和噪声强度,最佳做法是在确定K之后,对α做一个简单网格搜索,观察分解后分量的包络曲线是否平滑、有无明显畸变。

3.3 SSA寻优的适应度函数与参数边界

SSA优化LSSVM时,最核心的设计是适应度函数。我的做法是用训练集做5折交叉验证的平均均方误差(MSE)作为适应度值。交叉验证的作用是防止SSA找到一组只在固定子集上表现好的参数。如果不做交叉验证,直接用全量训练集拟合再预测训练集,寻优结果会有明显的过拟合倾向,最终在测试集上表现大打折扣。

参数边界方面,γ的搜索范围一般设为[0.1, 500],σ²设为[0.01, 100]。这个范围覆盖了绝大多数负荷预测场景下的合理取值,同时也不会让搜索空间过大、浪费迭代次数。SSA本身的参数相对简单:种群规模N通常取20到30,最大迭代次数T取30到50。我实测的体会是,种群超过30以后,增加数量带来的精度提升非常有限,但每轮迭代的计算时间明显上升,所以一般就设在25左右。

寻优流程可以归纳成几条:初始化麻雀种群,每一只麻雀的位置对应一组(γ, σ²);计算每个位置的适应度值;按适应度排序并区分发现者、加入者和警戒者角色;按照SSA的位置更新公式迭代更新所有个体的位置;达到最大迭代次数后输出全局最优位置对应的参数组合。实际操作中,最好把每一轮迭代的最优适应度画出来,如果曲线在20轮之前就完全平了,说明搜索可能过早收敛,需要检查种群规模和参数边界设置是否合理。

3.4 分量预测与结果重构

VMD分解得到K个分量之后,对每一个分量都要单独执行“归一化-SSA寻优-训练-预测”的流程。这里有一个细节值得注意:不同分量的预测难度差异很大。低频分量的变化平缓,LSSVM的预测误差通常很小;高频分量的随机性强,即使参数最优,误差也会明显偏高。而且各分量的最优参数往往差别很大,不能图省事让所有分量共用一组γ和σ²。

预测完成后,把K个分量的预测结果逐点相加,得到归一化空间中的重构预测序列,再做反归一化还原成实际负荷数值。需要注意的是,重构的误差并不等于各分量误差的简单平均。由于正负误差可能部分抵消,重构后的总体指标有时会看起来不错;但如果你单独观察高频分量的误差,会发现它其实仍然偏大,这正是高频分量中不可预测成分过高的正常表现。

4. 四组对照实验怎么设计才算公平

4.1 控制变量:只有算法不同,其余必须完全相同

很多对比实验做完之后,结果比不出来或者矛盾重重,问题往往出在实验设计不严谨。要做LSSVM、SSA-LSSVM、VMD-LSSVM、VMD-SSA-LSSVM这四组对比,最基本的底线是:同一个数据集、同一条时间序列、同一个训练测试集划分、同一个核函数、同一个归一化方法。我在做这个实验时,会把数据集划分这一步放在所有模型之前,一次划分完成,然后四组模型共用这一份划分好的数据,而不是每个模型各自重新划分。后者的后果是各组数据分布略有差异,最终精度差异很难判断是模型造成的还是数据划分造成的。

另外,SSA寻优涉及随机初始化,需要设置随机种子。仿真平台MATLAB里用rng函数固定随机数生成器,Python里则是numpy.random.seed()和random.seed()。同一组实验的所有模型最好也共用同一个种子,至少保证同一模型的不同次运行之间结果可复现。否则,同一组参数下两次运行的结果可能就有微小差异,这在小样本、高波动数据上会被放大成看似显著的结论。

4.2 评价指标:MAE、RMSE、MAPE、R²怎么选怎么读

短期负荷预测通用的评价指标通常是四个:平均绝对误差MAE、均方根误差RMSE、平均绝对百分比误差MAPE,以及决定系数R²。它们的计算方式在各类文献里都有标准定义,这里不再堆公式。需要多说一句的是怎么解读它们之间的关系:RMSE对大误差的惩罚更重,如果RMSE明显高于MAE,说明模型在某些预测点上出现了较大的偏差,可能存在尖峰预测失败的情况;MAPE用相对百分比表示误差,更适合用来横向比较不同量级区间的预测效果,比如白天高峰时段和夜间低谷时段的误差对比。

在实际报告结果时,我通常会把四个指标全部列出来,而不是只挑其中一个“好看”地呈现。因为单看精度指标容易被部分样本左右,尤其是MAPE在负荷值接近零的夜间时段会产生极大的百分比误差,单独看MAPE有时会低估模型的真实表现。如果某组实验的RMSE和MAE都不错,只有MAPE偏高,大概率是少数夜间低谷点的相对误差在捣鬼,属于可以接受的情况。

4.3 结果期望与异常判断

四组实验中,理论上的精度排序通常是:VMD-SSA-LSSVM最优,VMD-LSSVM次之,SSA-LSSVM再次,LSSVM垫底。VMD带来的提升一般比SSA带来的提升更明显,因为负荷序列经过分解后,每个分量的规律性显著增强,这是结构性改进;而SSA只是让参数更优,优势更多体现在上限提升而不是结构性改变。

如果实验结果显示VMD-SSA-LSSVM不如VMD-LSSVM,甚至不如基础LSSVM,不要急着怀疑“组合没用”,大概率是某个环节出了问题:可能是VMD层数选得不对,分量分解质量差;也可能是SSA寻优准则设置为全训练集误差而不是交叉验证误差,导致过拟合;还有可能是某个高频分量强行预测失败,误差在重构时主导了总误差。这时候应该单独观察每个分量的预测效果,定位误差来源到底在哪个分量上。

5. 实操中踩过的坑与排查思路

5.1 归一化数据泄露导致的结果“虚高”

这是我在第一次跑完整实验时就踩过的坑。当时的做法是先把全部序列归一化到[0,1],再划分训练集和测试集。结果测试集上的MAPE漂亮得惊人,当时还挺高兴。后来仔细一查,发现测试集本身的统计信息已经参与到了归一化计算之中——相当于考试时把答案提前看了一部分。改写成“只按训练集的统计量归一化”后,测试集误差数值上变大了不少,但那才是模型的真实水平。

这个排查思路是:对结果好得出奇的实验,先检查归一化、特征选择、交叉验证这些环节是否引入了未来信息。在负荷预测这类时间序列场景里,任何用全量数据计算出来的统计量都是有风险的,除非你再从头验证一遍。

5.2 VMD层数不当:过分解与欠分解

VMD层数选错,从结果上能看出来,但从分解图上更容易看出来。过分解时会出现某个分量的波形跟另一个分量几乎镜像对称的情况,或者多个分量的频率曲线贴在一起,说明模态混叠早已发生。欠分解时,最后几个分量的波形仍然是不规则的锯齿状,高频成分并没有得到充分分离。

我的处理办法是:不只依赖中心频率表,还要把每个分解结果画出来,用肉眼扫一遍波形形态是否合理。虽然听起来不够“自动化”,但在工程实操里这是最有效的办法。另外,改变K值之后一定要重新跑一遍SSA参数寻优,因为分量序列变了,最优参数组合也会变,沿用旧参数会引入额外误差。

5.3 SSA寻优陷阱:早熟收敛与交叉验证的必要性

SSA迭代曲线如果在前10轮就完全走平,通常不是好消息。可能表明种群多样性丢失过快,所有麻雀都挤在了同一个局部区域。一个实用的补救措施是把警戒者的比例适当调高,或者增加发现者的步长范围。当然更直白的做法还是:把寻优结果拿去做测试集预测,如果测试集误差远高于训练集误差,说明参数过拟合了,需要检查是不是适应度函数里少了交叉验证这一环。

从我的实践来看,同样的SSA算法,用交叉验证MSE做适应度比用训练集MSE做适应度,测试集MAPE平均能压下大约0.5到1个百分点。这个差距在负荷预测场景里已经是很可观的提升了。

5.4 预测曲线的可视化与误差带分析

数字指标固然重要,但真正让我对模型“建立信任感”的是预测曲线与真实负荷曲线的对比图。画图的时候,我习惯把整条测试集的真实值和四条预测曲线画在同一张图里,再用局部放大图展示高峰和低谷时段的细节。这种方式能很快看出模型在哪些时段系统性偏差——比如总是低估早高峰,或者总是高估午间低谷——这些规律在误差指标中很难一眼识别,但在图上非常直观。

另一个值得做的可视化是误差分布直方图。如果误差分布接近零均值的正态分布,说明模型没有明显的系统性偏差;如果误差分布明显偏斜,说明某些特殊时段(比如节假日、温度突变日)的处理还有改进空间。

6. 一点经验总结

整套流程跑下来之后,我最深的体会是:VMD-SSA-LSSVM这套组合真正值钱的地方不在于它比基础模型高出的那零点几个百分点的精度,而在于它提供了一套结构化的分析思路——先把复杂序列拆开逐一观察,再让算法在合理范围内自动寻找最优配置,最后把各部分合回一个整体。这种思路在负荷预测之外的很多时间序列场景(比如光伏功率预测、风速预测、交通流量预测)里同样适用。

对于准备自己做对比实验的朋友,我建议从最简单的LSSVM基线开始,跑出一个可信的误差基线,然后一次只加一个改进模块,完整记录每一次改变带来的误差变化。不要一开始就直接上VMD-SSA-LSSVM全套。上次我就是直接把全套组合上线,结果效果反而变差,排查了大半天才发现是VMD层数设置不当,浪费了不少时间。先建立基线,再逐级升级,你才能在误差变化中看清每个模块的真实贡献,也才能在实验报告里把结论写得让人信服。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进