APP下载

基于改进Prophet模型的用电量预测研究

2021-12-10吴文培宋亚林魏上斐

计算机仿真 2021年11期
关键词:预测值用电量误差

吴文培,宋亚林,魏上斐

(河南大学智能网络系统研究所,河南 开封 475000)

1 引言

用电量预测是智能用电研究的重要问题之一,为国家电力资源的合理分配、地方供电平衡、线路电量损耗计算提供了重要参考信息,对智能用电管理工作具有积极的指导意义。

用电量预测是典型的时间序列预测问题,分析时间序列目的是预测未来发展趋势。关于如何发掘用电量数据之间的规律,建立准确可靠的数学模型,一直是中外学者们研究的问题[1]。传统的预测方法如移动平均法,是对时间数列进行修匀处理[2],加大移动平均法的期数(即加大n值)会使平滑波动效果更好,但会使预测值对数据实际变动更不敏感[3];移动平均时距项数N为奇数时,只需一次移动平均,移动平均值作为移动平均项数中间一期的趋势代表值;而当移动平均项数N为偶数时,移动平均值对应的是偶数项的中间位置,无法对正某一时期,需要再进行一次相临两项平均值的移动平均,才能使平均值对正某一时期[4]。随着人工智能的发展,各类机器学习算法与深度学习算法[5]涌现出来。如长短时记忆网络[6](Long Short Term Memory Network,LSTM),能够成功解决原始循环神经网络(RNN)难以记住时间间隔较长的数据特征缺陷。RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决[7],可以处理100个量级的序列,但对于1000个量级[8]及更长的序列依然显得棘手。随机森林[9]能够提供有效的方法来平衡数据集误差,但在解决回归问题时,并不能给出一个连续的输出[10]。当进行回归时,随机森林不能够做出超越训练集数据范围的预测[11],这会导致在某些特定噪声的数据进行建模时出现过度拟合[12]。对于小数据或低维数据[13](特征较少的数据),并不能产生很好的分类(回归)效果。Prophet模型具有简单、易解释[14]的周期性结构,能很好地兼容并解释节假日等时间节点,但Prophet模型易在特殊时间点陷入过拟合[15],这将导致部分预测行为的误差偏大。对此,本文提出了利用XGBoost模型优化Prophet模型的策略,使融合模型兼具两个子模型的优势,减小预测误差。实验证明,改进后的预测模型X-Prophet,与原模型相比,预测误差更小。

2 Prophet模型

2017年2月,Facebook开源了一款基于 Python 和 R 语言的数据预测工具——“Prophet”[16]。该算法是基于时间序列分解和机器学习的拟合而设计的,不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形,还能够几乎全自动地预测时间序列未来的走势。其中在拟合模型时使用了 pyStan 这个开源工具,因此能够在较快的时间内得到需要预测的结果。

Prophet是一种加法模型,由趋势项、周期项、节假日项、误差项四项组成

p(t)=g(t)+s(t)+h(t)+εt

(1)

g(t)表示趋势项,表示时间序列在非周期上面的变化趋势;s(t)表示周期项,也可以称为季节项,默认情况下,以周或年为单位;h(t)表示节假日项,表示当天是否存在节假日;表示误差项。

趋势项g(t)是Prophet中的一个重要项,g(t)有两个重要函数,一个是基于分段线性函数,另一个是基于逻辑回归函数。

基于分段逻辑回归增长模型如

(2)

其中

a(t)=(a1(t),…,as(t))T

δ=(δ1,…,δs)T

γ=(γ1,…,γs)T

(3)

C(t)表示模型容量,k表示增长率,δ表示增长率的变化量。随着t的增加,g(t)趋于C(t)。使用Prophet的growth=’logistic’的时候,需要提前设置好C(t)的取值。

基于分段线性函数的模型形如

g(t)=(k+a(t)δ)·t+(m+a(t)Tγ)

(4)

k表示增长率,δ表示增长率的变化量,m表示offset parameter。

周期(季节)s(t)中的周期性函数可以通过正玄或余玄函数来表示。用傅立叶级数来模拟时间序列的周期性,如

(5)

对于以年为周期的序列(P=365.25),N=10;对于以周为周期的序列,N=3。参数可以形成向量

β=(a1,b1,…,aN,bN)T

(6)

当N=10时

(7)

当N=3时

(8)

因此,时间序列的季节项是:s(t)=x(t)β,β的初始化是β~Normal(0,σ^2)。σ=seasonality_prior_scale,σ值越大,表示季节的效果越明显。

节假日项h(t)模型形如

Z(t)=(1{t∈Di},…,1{t∈DL}),k=(k1,…,kL)T

(9)

k的初始化是k~Normal(0,v^2),v=holidays_prior_scale,默认值是10,当值越大时,表示节假日对模型的影响越大。

3 X-Prophet改进模型

3.1 X-Prophet模型原理

X-Prophet改进模型是在原模型Prophet的基础上,增加了一个置信值优化模块。该模块的作用是结合Prophet和XGBoost两个子模型,利用XGBoost模型优化Prophet模型,减小模型预测误差。X-Prophet模型如图1所示。

图1 X-Prophet模型图

结合Prophet模型实现原理和流程分析,原数据经过趋势项、季节项、节假日项、误差项处理后(参照式(1)),给出一系列预测值的置信区间,置信区间有上限yhat_upper和下限yhat_lower。每个时间节点上下限之间的所有值都有可能成为该时间节点的预测值。Prophet以每个时间节点预测值yhat作为最终预测结果。而节假日等特殊时间节点是时间序列预测问题中的一个重要特征,显示加入对节假日等特殊时间节点的处理,对最终的预测结果有明显的影响。对Prophet模型而言,其中h(t)项是对节假日的专门处理项,为了将节假日效应发挥至最大,模型默认将节假日影响力参数置为最大值,以此提升整个模型的预测性能。但是最大节假日影响力参数易使Prophet模型在节假日等时间节点的预测行为陷入过拟合,影响模型的稳定性,使预测误差偏大。

XGBoost模型是一种强分类器模型[17],能够快速准确地挖掘数据中的节假日等特殊时间点的特征,而且该模型具有正则化项,在对时间序列数据进行分析预测的过程中,能够避免预测行为陷入过拟合[18]。因此,这里提出改进模型X-Prophet。X-Prophet模型中增加预测值优化模块,如图1所示。目的是通过优化模块引入XGBoost项,利用XGBoost具有正则项的特性来优化Prophet,使这两个模型优势互补,得到X-Prophet改进模型,最终达到减小预测误差,提高预测准确率的目的。对于引入XGBoost优化项后的X-Prophet模型,模型构建可用如下公式表示

(10)

ft(x)=wq(x)

(11)

(12)

(13)

(14)

式(10)表示X-Prophet模型分析数据得到相应时间点的最优解;式(12)表示模型的惩罚项 ,惩罚项用来控制模型的复杂度;式(13)表示模型的损失函数,在每一轮迭代过程中,损失函数obj使得预测值和损失值的误差和达到最小,即完成了最优模型的构建。式(14)表示模型的最终预测值。

3.2 X-Prophet模型构建

3.2.1 数据集

本文的实验数据集采用的是数据平台Kaggle提供的美国加州地区2008~2017年10年的小时用电数据。

3.2.2 模型构建

对原数据进行建模分析,为防止数据因为时间乱序对实验结果产生影响,预先对数据按时间进行排序。X-Prophet模型进行预测时需要两列数据分别是‘ds’和‘y’,其中‘ds’表示时间戳,‘y’表示时间序列的值,因此,在处理数据时,需要修改数据的列名。原数据也是两列数据,包括时间列和用电量列(k-Wh)。X-Prophet对缺失数据具有很好的处理方式,首先去除数据中的异常点(outlier),直接赋值为none,X-Prophet可以通过插值处理缺失值,所以这里不需要额外对原数据的缺失值进行处理。通过以上对原数据的处理,得到处理后的数据,如表1所示。

表1 预处理后的数据

周期性(季节性)是X-Prophet模型中的一个重要组成部分,采用标准傅里叶级数,年、周的周期性(seasonality)近似值分别为20和6,周期性成分(seasonal component)在正常情况下是平滑状态。如果时间序列超过两个周期,X-Prophet将默认适合每周和每年的季节性。对于日(sub-daily)时间序列,也将适合每日的季节性。节假日处理是X-Prophet模型中一个重要模块,为了充分发挥X-Prophet的性能,本文加入节假日信息。因为采用的美国加州的用电数据,所以需要加入一些美国主要的节假日信息,如超级碗(橄榄球比赛),以及一些美国的传统日期,如元旦、感恩节、圣诞节。节假日信息表如表2 所示。

表2 节假日信息表

将处理好的以“小时”为时间粒度的数据,按训练集70%、测试集30%的比例进行划分,以便更好地评估X-Prophet模型预测的准确率。改进模型X-Prophet提供了一系列参数协助模型调优,表3是模型参数初始化列表。

表3 模型参数初始化表

选择趋势模型,控制参数是“growth”,默认使用分段线性的趋势“growth=linear”,但是如果认为模型的趋势是按照log函数方式增长的,可设置growth=′logistic′从而使用分段log的增长方式。默认情况下,只有在时间序列的前80%才会推断出突变点,以便有足够的长度来预测未来的趋势,并避免在时间序列的末尾出现过度拟合的波动,默认值可以在大多数情况下工作。修改changepoint_range参数,changepoint_range=0.9表示将在时间序列的前90%处寻找潜在的变化点。如果趋势的变化被过度拟合(即过于灵活)或者拟合不足(即灵活性不够),可以利用输入参数 changepoint_prior_scale 来调整稀疏先验的程度。默认下,这个参数被指定为 0.05 。增大该值,会导致趋势拟合得更加灵活。如果发现节假日效应被过度拟合了,可以通过设置参数 holidays_prior_scale调整它们的先验规模来使之平滑,默认情况下该值取 10 。减小该值会降低假期效果。seasonality_prior_scale 参数可以用来调整模型对于季节性的拟合程度。learning_rate表示学习率,可以缩减每一步的权重值,使得模型更加健壮;max_depth表示树的最大深度,值越大,树越复杂。可以用来控制过拟合,典型值是3-10。

4 实验分析

将训练集的数据作为模型的输入数据,查看预测的成分分析,如图2所示。

图2 预测成分分析图

图2给出了模型对训练集数据各成分单独分析的结果。从上至下依次是美国加州地区2008~2014年用电量被Prophet加法模型分解的增长趋势(trend)、节假日趋势(holidays)、周趋势(weekly)、年度趋势(yearly)、日趋势(daily)。增长趋势中训练集到测试集10年的年用电量波动不大,基本保持平衡;年度趋势中,2月、8月、12月存在波峰,说明这三个月是加州地区每年用电量最多的月份;5月、10月存在明显的波谷,说明这两个月是加州每年用电量最少的两个月。周趋势中,周日到周二的用电量存在明显的线性急速增长趋势,接近正比。增长趋势到周二后消失,周二至周五,用电量波动很小,基本趋向平稳。周五至周六,用电量开始下降。说明每周周末用电量最低,周二至周五用电量最多,基本趋向平稳。日趋势中,每天4点是用电量的低谷,20点事用电量的高峰,0点到4点用电量存在明显下降趋势,4点到10点明显增长,10点到18点用电量趋势基本维持平稳,20点到24点,用电量迅速下降。

将训练集的数据分别作为Prophet模型和改进后的X-Prophet模型的输入,进行数据分析,将训练好的模型用于测试集,对预测效果进行分析。本文选用平均百分比误差(MAPE)和均方根误差(RMSE)作为评估原模型和改进模型预测效果的标准,表达式如下

(15)

(16)

observed为每个小时的实际用电量,predicted为每个小时的预测量,n为小时的总数。用以上误差公式计算原模型和改进模型在测试集数据上的预测误差。Prophet模型误差如表4所示;X-Prophet模型根据不同权值产生多组误差,如表5所示。

表4 测试集Prophet模型误差表

表5 权值系数w1和w2对应的X-Prophet模型误差

表5中数据显示,当w1=0.2,w2=0.8时,改进模型X-Prophet在测试集上的预测综合误差最小,即此时模型最优,MAPE=7.69,RMSE=1557.1。

Prophet模型和当w1=0.2、w2=0.8时X-Prophet模型在测试集上的预测效果图如图3、图4所示。

图3 Prophet测试集预测效果图

图4 X-Prophet测试集预测效果图

图3、图4中显示,深灰色曲线表示测试集中用电量的预测值,浅灰色曲线表示用电量的真实值。结果表明改进后的模型X-Prophet在测试集数据上的的曲线拟合效果比Prophet模型要好。

对比Prophet模型在测试集上的预测误差,以及w1=0.2,w2=0.8时X-Prophet模型的预测误差,见表6。

表6 两种模型误差对比表

分析上表发现,与原模型相比,改进后的模型在测试集上,预测误差MAPE减少了约11%,RMSE同样减少了约11%。改进后的模型具有更准确的预测结果。

综上所述,改进模型X-Prophet与原模型Prophet相比,预测误差更小,模型更稳定,预测效果更佳。

5 结论

本文提出了一种基于Prophet的改进预测模型X-Prophet。该模型引入了优化项XGBoost对Prophet预测值进行优化,使Prophet与XGBoost优势互补,提高预测准确率。实验结果表明,与原模型相比,X-Prophet改进模型使预测误差减小了约11%,在预测行为上比原模型具有更高的准确性。

猜你喜欢

预测值用电量误差
CBCT图像引导的放疗前后半程摆位误差分析
AI讲座:ML的分类方法
自体荧光内镜对消化道肿瘤诊断临床应用分析
隧道横向贯通误差估算与应用
隧道横向贯通误差估算与应用
季节模型在某医院月门诊量预测中的研究与应用
精确与误差
压力表非线性误差分析与调整