吳文培,宋亞林,魏上斐
(河南大學(xué)智能網(wǎng)絡(luò)系統(tǒng)研究所,河南 開封 475000)
用電量預(yù)測是智能用電研究的重要問題之一,為國家電力資源的合理分配、地方供電平衡、線路電量損耗計算提供了重要參考信息,對智能用電管理工作具有積極的指導(dǎo)意義。
用電量預(yù)測是典型的時間序列預(yù)測問題,分析時間序列目的是預(yù)測未來發(fā)展趨勢。關(guān)于如何發(fā)掘用電量數(shù)據(jù)之間的規(guī)律,建立準(zhǔn)確可靠的數(shù)學(xué)模型,一直是中外學(xué)者們研究的問題[1]。傳統(tǒng)的預(yù)測方法如移動平均法,是對時間數(shù)列進行修勻處理[2],加大移動平均法的期數(shù)(即加大n值)會使平滑波動效果更好,但會使預(yù)測值對數(shù)據(jù)實際變動更不敏感[3];移動平均時距項數(shù)N為奇數(shù)時,只需一次移動平均,移動平均值作為移動平均項數(shù)中間一期的趨勢代表值;而當(dāng)移動平均項數(shù)N為偶數(shù)時,移動平均值對應(yīng)的是偶數(shù)項的中間位置,無法對正某一時期,需要再進行一次相臨兩項平均值的移動平均,才能使平均值對正某一時期[4]。隨著人工智能的發(fā)展,各類機器學(xué)習(xí)算法與深度學(xué)習(xí)算法[5]涌現(xiàn)出來。如長短時記憶網(wǎng)絡(luò)[6](Long Short Term Memory Network,LSTM),能夠成功解決原始循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)難以記住時間間隔較長的數(shù)據(jù)特征缺陷。RNN的梯度問題在LSTM及其變種里面得到了一定程度的解決[7],可以處理100個量級的序列,但對于1000個量級[8]及更長的序列依然顯得棘手。隨機森林[9]能夠提供有效的方法來平衡數(shù)據(jù)集誤差,但在解決回歸問題時,并不能給出一個連續(xù)的輸出[10]。當(dāng)進行回歸時,隨機森林不能夠做出超越訓(xùn)練集數(shù)據(jù)范圍的預(yù)測[11],這會導(dǎo)致在某些特定噪聲的數(shù)據(jù)進行建模時出現(xiàn)過度擬合[12]。對于小數(shù)據(jù)或低維數(shù)據(jù)[13](特征較少的數(shù)據(jù)),并不能產(chǎn)生很好的分類(回歸)效果。Prophet模型具有簡單、易解釋[14]的周期性結(jié)構(gòu),能很好地兼容并解釋節(jié)假日等時間節(jié)點,但Prophet模型易在特殊時間點陷入過擬合[15],這將導(dǎo)致部分預(yù)測行為的誤差偏大。對此,本文提出了利用XGBoost模型優(yōu)化Prophet模型的策略,使融合模型兼具兩個子模型的優(yōu)勢,減小預(yù)測誤差。實驗證明,改進后的預(yù)測模型X-Prophet,與原模型相比,預(yù)測誤差更小。
2017年2月,F(xiàn)acebook開源了一款基于 Python 和 R 語言的數(shù)據(jù)預(yù)測工具——“Prophet”[16]。該算法是基于時間序列分解和機器學(xué)習(xí)的擬合而設(shè)計的,不僅可以處理時間序列存在一些異常值的情況,也可以處理部分缺失值的情形,還能夠幾乎全自動地預(yù)測時間序列未來的走勢。其中在擬合模型時使用了 pyStan 這個開源工具,因此能夠在較快的時間內(nèi)得到需要預(yù)測的結(jié)果。
Prophet是一種加法模型,由趨勢項、周期項、節(jié)假日項、誤差項四項組成
p(t)=g(t)+s(t)+h(t)+εt
(1)
g(t)表示趨勢項,表示時間序列在非周期上面的變化趨勢;s(t)表示周期項,也可以稱為季節(jié)項,默認(rèn)情況下,以周或年為單位;h(t)表示節(jié)假日項,表示當(dāng)天是否存在節(jié)假日;表示誤差項。
趨勢項g(t)是Prophet中的一個重要項,g(t)有兩個重要函數(shù),一個是基于分段線性函數(shù),另一個是基于邏輯回歸函數(shù)。
基于分段邏輯回歸增長模型如
(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’的時候,需要提前設(shè)置好C(t)的取值。
基于分段線性函數(shù)的模型形如
g(t)=(k+a(t)δ)·t+(m+a(t)Tγ)
(4)
k表示增長率,δ表示增長率的變化量,m表示offset parameter。
周期(季節(jié))s(t)中的周期性函數(shù)可以通過正玄或余玄函數(shù)來表示。用傅立葉級數(shù)來模擬時間序列的周期性,如
(5)
對于以年為周期的序列(P=365.25),N=10;對于以周為周期的序列,N=3。參數(shù)可以形成向量
β=(a1,b1,…,aN,bN)T
(6)
當(dāng)N=10時
(7)
當(dāng)N=3時
(8)
因此,時間序列的季節(jié)項是:s(t)=x(t)β,β的初始化是β~Normal(0,σ^2)。σ=seasonality_prior_scale,σ值越大,表示季節(jié)的效果越明顯。
節(jié)假日項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,默認(rèn)值是10,當(dāng)值越大時,表示節(jié)假日對模型的影響越大。
X-Prophet改進模型是在原模型Prophet的基礎(chǔ)上,增加了一個置信值優(yōu)化模塊。該模塊的作用是結(jié)合Prophet和XGBoost兩個子模型,利用XGBoost模型優(yōu)化Prophet模型,減小模型預(yù)測誤差。X-Prophet模型如圖1所示。
圖1 X-Prophet模型圖
結(jié)合Prophet模型實現(xiàn)原理和流程分析,原數(shù)據(jù)經(jīng)過趨勢項、季節(jié)項、節(jié)假日項、誤差項處理后(參照式(1)),給出一系列預(yù)測值的置信區(qū)間,置信區(qū)間有上限yhat_upper和下限yhat_lower。每個時間節(jié)點上下限之間的所有值都有可能成為該時間節(jié)點的預(yù)測值。Prophet以每個時間節(jié)點預(yù)測值yhat作為最終預(yù)測結(jié)果。而節(jié)假日等特殊時間節(jié)點是時間序列預(yù)測問題中的一個重要特征,顯示加入對節(jié)假日等特殊時間節(jié)點的處理,對最終的預(yù)測結(jié)果有明顯的影響。對Prophet模型而言,其中h(t)項是對節(jié)假日的專門處理項,為了將節(jié)假日效應(yīng)發(fā)揮至最大,模型默認(rèn)將節(jié)假日影響力參數(shù)置為最大值,以此提升整個模型的預(yù)測性能。但是最大節(jié)假日影響力參數(shù)易使Prophet模型在節(jié)假日等時間節(jié)點的預(yù)測行為陷入過擬合,影響模型的穩(wěn)定性,使預(yù)測誤差偏大。
XGBoost模型是一種強分類器模型[17],能夠快速準(zhǔn)確地挖掘數(shù)據(jù)中的節(jié)假日等特殊時間點的特征,而且該模型具有正則化項,在對時間序列數(shù)據(jù)進行分析預(yù)測的過程中,能夠避免預(yù)測行為陷入過擬合[18]。因此,這里提出改進模型X-Prophet。X-Prophet模型中增加預(yù)測值優(yōu)化模塊,如圖1所示。目的是通過優(yōu)化模塊引入XGBoost項,利用XGBoost具有正則項的特性來優(yōu)化Prophet,使這兩個模型優(yōu)勢互補,得到X-Prophet改進模型,最終達到減小預(yù)測誤差,提高預(yù)測準(zhǔn)確率的目的。對于引入XGBoost優(yōu)化項后的X-Prophet模型,模型構(gòu)建可用如下公式表示
(10)
ft(x)=wq(x)
(11)
(12)
(13)
(14)
式(10)表示X-Prophet模型分析數(shù)據(jù)得到相應(yīng)時間點的最優(yōu)解;式(12)表示模型的懲罰項 ,懲罰項用來控制模型的復(fù)雜度;式(13)表示模型的損失函數(shù),在每一輪迭代過程中,損失函數(shù)obj使得預(yù)測值和損失值的誤差和達到最小,即完成了最優(yōu)模型的構(gòu)建。式(14)表示模型的最終預(yù)測值。
3.2.1 數(shù)據(jù)集
本文的實驗數(shù)據(jù)集采用的是數(shù)據(jù)平臺Kaggle提供的美國加州地區(qū)2008~2017年10年的小時用電數(shù)據(jù)。
3.2.2 模型構(gòu)建
對原數(shù)據(jù)進行建模分析,為防止數(shù)據(jù)因為時間亂序?qū)嶒灲Y(jié)果產(chǎn)生影響,預(yù)先對數(shù)據(jù)按時間進行排序。X-Prophet模型進行預(yù)測時需要兩列數(shù)據(jù)分別是‘ds’和‘y’,其中‘ds’表示時間戳,‘y’表示時間序列的值,因此,在處理數(shù)據(jù)時,需要修改數(shù)據(jù)的列名。原數(shù)據(jù)也是兩列數(shù)據(jù),包括時間列和用電量列(k-Wh)。X-Prophet對缺失數(shù)據(jù)具有很好的處理方式,首先去除數(shù)據(jù)中的異常點(outlier),直接賦值為none,X-Prophet可以通過插值處理缺失值,所以這里不需要額外對原數(shù)據(jù)的缺失值進行處理。通過以上對原數(shù)據(jù)的處理,得到處理后的數(shù)據(jù),如表1所示。
表1 預(yù)處理后的數(shù)據(jù)
周期性(季節(jié)性)是X-Prophet模型中的一個重要組成部分,采用標(biāo)準(zhǔn)傅里葉級數(shù),年、周的周期性(seasonality)近似值分別為20和6,周期性成分(seasonal component)在正常情況下是平滑狀態(tài)。如果時間序列超過兩個周期,X-Prophet將默認(rèn)適合每周和每年的季節(jié)性。對于日(sub-daily)時間序列,也將適合每日的季節(jié)性。節(jié)假日處理是X-Prophet模型中一個重要模塊,為了充分發(fā)揮X-Prophet的性能,本文加入節(jié)假日信息。因為采用的美國加州的用電數(shù)據(jù),所以需要加入一些美國主要的節(jié)假日信息,如超級碗(橄欖球比賽),以及一些美國的傳統(tǒng)日期,如元旦、感恩節(jié)、圣誕節(jié)。節(jié)假日信息表如表2 所示。
表2 節(jié)假日信息表
將處理好的以“小時”為時間粒度的數(shù)據(jù),按訓(xùn)練集70%、測試集30%的比例進行劃分,以便更好地評估X-Prophet模型預(yù)測的準(zhǔn)確率。改進模型X-Prophet提供了一系列參數(shù)協(xié)助模型調(diào)優(yōu),表3是模型參數(shù)初始化列表。
表3 模型參數(shù)初始化表
選擇趨勢模型,控制參數(shù)是“growth”,默認(rèn)使用分段線性的趨勢“growth=linear”,但是如果認(rèn)為模型的趨勢是按照log函數(shù)方式增長的,可設(shè)置growth=′logistic′從而使用分段log的增長方式。默認(rèn)情況下,只有在時間序列的前80%才會推斷出突變點,以便有足夠的長度來預(yù)測未來的趨勢,并避免在時間序列的末尾出現(xiàn)過度擬合的波動,默認(rèn)值可以在大多數(shù)情況下工作。修改changepoint_range參數(shù),changepoint_range=0.9表示將在時間序列的前90%處尋找潛在的變化點。如果趨勢的變化被過度擬合(即過于靈活)或者擬合不足(即靈活性不夠),可以利用輸入?yún)?shù) changepoint_prior_scale 來調(diào)整稀疏先驗的程度。默認(rèn)下,這個參數(shù)被指定為 0.05 。增大該值,會導(dǎo)致趨勢擬合得更加靈活。如果發(fā)現(xiàn)節(jié)假日效應(yīng)被過度擬合了,可以通過設(shè)置參數(shù) holidays_prior_scale調(diào)整它們的先驗規(guī)模來使之平滑,默認(rèn)情況下該值取 10 。減小該值會降低假期效果。seasonality_prior_scale 參數(shù)可以用來調(diào)整模型對于季節(jié)性的擬合程度。learning_rate表示學(xué)習(xí)率,可以縮減每一步的權(quán)重值,使得模型更加健壯;max_depth表示樹的最大深度,值越大,樹越復(fù)雜??梢杂脕砜刂七^擬合,典型值是3-10。
將訓(xùn)練集的數(shù)據(jù)作為模型的輸入數(shù)據(jù),查看預(yù)測的成分分析,如圖2所示。
圖2 預(yù)測成分分析圖
圖2給出了模型對訓(xùn)練集數(shù)據(jù)各成分單獨分析的結(jié)果。從上至下依次是美國加州地區(qū)2008~2014年用電量被Prophet加法模型分解的增長趨勢(trend)、節(jié)假日趨勢(holidays)、周趨勢(weekly)、年度趨勢(yearly)、日趨勢(daily)。增長趨勢中訓(xùn)練集到測試集10年的年用電量波動不大,基本保持平衡;年度趨勢中,2月、8月、12月存在波峰,說明這三個月是加州地區(qū)每年用電量最多的月份;5月、10月存在明顯的波谷,說明這兩個月是加州每年用電量最少的兩個月。周趨勢中,周日到周二的用電量存在明顯的線性急速增長趨勢,接近正比。增長趨勢到周二后消失,周二至周五,用電量波動很小,基本趨向平穩(wěn)。周五至周六,用電量開始下降。說明每周周末用電量最低,周二至周五用電量最多,基本趨向平穩(wěn)。日趨勢中,每天4點是用電量的低谷,20點事用電量的高峰,0點到4點用電量存在明顯下降趨勢,4點到10點明顯增長,10點到18點用電量趨勢基本維持平穩(wěn),20點到24點,用電量迅速下降。
將訓(xùn)練集的數(shù)據(jù)分別作為Prophet模型和改進后的X-Prophet模型的輸入,進行數(shù)據(jù)分析,將訓(xùn)練好的模型用于測試集,對預(yù)測效果進行分析。本文選用平均百分比誤差(MAPE)和均方根誤差(RMSE)作為評估原模型和改進模型預(yù)測效果的標(biāo)準(zhǔn),表達式如下
(15)
(16)
observed為每個小時的實際用電量,predicted為每個小時的預(yù)測量,n為小時的總數(shù)。用以上誤差公式計算原模型和改進模型在測試集數(shù)據(jù)上的預(yù)測誤差。Prophet模型誤差如表4所示;X-Prophet模型根據(jù)不同權(quán)值產(chǎn)生多組誤差,如表5所示。
表4 測試集Prophet模型誤差表
表5 權(quán)值系數(shù)w1和w2對應(yīng)的X-Prophet模型誤差
表5中數(shù)據(jù)顯示,當(dāng)w1=0.2,w2=0.8時,改進模型X-Prophet在測試集上的預(yù)測綜合誤差最小,即此時模型最優(yōu),MAPE=7.69,RMSE=1557.1。
Prophet模型和當(dāng)w1=0.2、w2=0.8時X-Prophet模型在測試集上的預(yù)測效果圖如圖3、圖4所示。
圖3 Prophet測試集預(yù)測效果圖
圖4 X-Prophet測試集預(yù)測效果圖
圖3、圖4中顯示,深灰色曲線表示測試集中用電量的預(yù)測值,淺灰色曲線表示用電量的真實值。結(jié)果表明改進后的模型X-Prophet在測試集數(shù)據(jù)上的的曲線擬合效果比Prophet模型要好。
對比Prophet模型在測試集上的預(yù)測誤差,以及w1=0.2,w2=0.8時X-Prophet模型的預(yù)測誤差,見表6。
表6 兩種模型誤差對比表
分析上表發(fā)現(xiàn),與原模型相比,改進后的模型在測試集上,預(yù)測誤差MAPE減少了約11%,RMSE同樣減少了約11%。改進后的模型具有更準(zhǔn)確的預(yù)測結(jié)果。
綜上所述,改進模型X-Prophet與原模型Prophet相比,預(yù)測誤差更小,模型更穩(wěn)定,預(yù)測效果更佳。
本文提出了一種基于Prophet的改進預(yù)測模型X-Prophet。該模型引入了優(yōu)化項XGBoost對Prophet預(yù)測值進行優(yōu)化,使Prophet與XGBoost優(yōu)勢互補,提高預(yù)測準(zhǔn)確率。實驗結(jié)果表明,與原模型相比,X-Prophet改進模型使預(yù)測誤差減小了約11%,在預(yù)測行為上比原模型具有更高的準(zhǔn)確性。