? ? ? ?利用深度學(xué)習(xí)進(jìn)行序列預(yù)測(cè)時(shí)患整,模型參數(shù)的確定是很頭疼的問(wèn)題拜效,因?yàn)槟P蛥?shù)的選擇對(duì)于結(jié)果的影響非常大。現(xiàn)在最流行的深度學(xué)習(xí)模型當(dāng)屬長(zhǎng)短期記憶(LSTM)了各谚,它屬于卷積神經(jīng)網(wǎng)絡(luò)(CNN)的一種改進(jìn)紧憾,具有很多優(yōu)點(diǎn),可以避免模型發(fā)生梯度消失和梯度爆炸昌渤,而且具有長(zhǎng)短期記憶的功能赴穗。我基于Matlab2021編寫了一個(gè)BO-LSTM算法,其中BO指的是貝葉斯(Bayesian)算法膀息,利用BO算法對(duì)LSTM模型的超參數(shù)進(jìn)行優(yōu)化選擇般眉,包括采取的歷史回歸長(zhǎng)度、隱藏層數(shù)潜支、隱藏層單元數(shù)甸赃、單元隨機(jī)丟棄率、初始學(xué)習(xí)率冗酿,這樣可以解決模型確定的問(wèn)題埠对。該程序可以直接用于對(duì)于時(shí)間序列的多步提前預(yù)測(cè)络断。為方便理解,我自定義了一個(gè)時(shí)間序列项玛,然后進(jìn)行了提前24步預(yù)測(cè)貌笨。可以自己根據(jù)需要進(jìn)行修改襟沮,用來(lái)預(yù)測(cè)自己的序列锥惋。
? ? ? ?下面簡(jiǎn)單對(duì)程序代碼進(jìn)行一個(gè)說(shuō)明。
? ? ? ?這個(gè)是程序運(yùn)行的結(jié)果臣嚣。結(jié)果展示了單步預(yù)測(cè)(即1步預(yù)測(cè))和24步預(yù)測(cè)的結(jié)果净刮。數(shù)據(jù)為隨機(jī)生成剥哑。若有自己的數(shù)據(jù)可以讀取硅则,然后自行調(diào)參。這里橫坐標(biāo)的意義為:<=0的表示歷史數(shù)據(jù)株婴,>0的表示為未來(lái)數(shù)據(jù)怎虫。整體效果還是比較好的。
? ? ? ? 下面詳細(xì)分析了24步預(yù)測(cè)誤差結(jié)果困介。包括絕對(duì)誤差大审、MAE症见、RMSE勒庄、MAPE朝蜘〗裕總體來(lái)說(shuō)結(jié)果還行睡汹,但是這個(gè)是因?yàn)樾蛄斜旧砭哂幸欢ㄒ?guī)律杂曲。這個(gè)結(jié)果每次是不一樣的弃理,有多種原因想罕,模型訓(xùn)練結(jié)果也存在一定離散性屿良,導(dǎo)致結(jié)果有所不同圈澈。
? ? ? ? ? ? 模型的訓(xùn)練過(guò)程,貝葉斯優(yōu)化我選取了最大迭代步數(shù)為20步尘惧,通常默認(rèn)為30步康栈。下面是迭代過(guò)程的目標(biāo)函數(shù)示意圖。貝葉斯算法可以根據(jù)當(dāng)前的歷史結(jié)果喷橙,預(yù)測(cè)下一個(gè)最優(yōu)點(diǎn)的位置啥么,然后確定參數(shù),然后訓(xùn)練贰逾,得到結(jié)果悬荣,再以此往復(fù)。
? ? ? ? ? ? 因?yàn)榈枰?0步似踱,我的程序默認(rèn)選擇不顯示每次迭代的收斂過(guò)程隅熙。如果需要看的話可以自己修改程序代碼稽煤,將'Plots',"none", ...? 修改為'Plots',"training-progress", ...? 如果開啟了查看收斂過(guò)程,會(huì)出現(xiàn)20個(gè)下面這種圖囚戚。建議第一次運(yùn)行的時(shí)候打開,這樣可以看自己的收斂過(guò)程是否合理匾二。
? ? ? ? 下面簡(jiǎn)單說(shuō)明一下程序的實(shí)現(xiàn)思路和代碼截圖。
? ? ? ? 1.程序首先新建一個(gè)臨時(shí)文件夾,用于存放貝葉斯優(yōu)化過(guò)程的每次結(jié)果譬猫,以便優(yōu)化后進(jìn)行文件的調(diào)取染服。
? ? ? ? 2.創(chuàng)建時(shí)間序列數(shù)據(jù)柳刮。如果有真實(shí)的數(shù)據(jù)的話秉颗,建議用load或dlmread命令讀取數(shù)據(jù)文件午乓,此處必須保證時(shí)間序列變量為行向量益愈。我這里用的是隨機(jī)信號(hào)蒸其,省的還要上傳數(shù)據(jù)文件摸袁,太麻煩了蜂大。這樣一個(gè)m文件就可以搞定了。
? ? ? 3.確定要用哪些數(shù)據(jù)作為測(cè)試集,我這里是取了最后24個(gè)數(shù)據(jù)隙咸,作為測(cè)試集五督,也就相當(dāng)于未來(lái)的數(shù)據(jù)充包。其它數(shù)據(jù)同時(shí)作為訓(xùn)練集和驗(yàn)證集误证。
注意:有的研究只設(shè)置了訓(xùn)練集,然后訓(xùn)練過(guò)程盡可能保證訓(xùn)練集的誤差小。我覺(jué)得這種做法欠妥青团,很容易陷入過(guò)擬合的問(wèn)題督笆。所以我添加了驗(yàn)證集诱贿,訓(xùn)練過(guò)程需要查看驗(yàn)證集的誤差情況料扰。
? ? ? 4.設(shè)置優(yōu)化器晒杈。確定LSTM模型的哪些參數(shù)是可能需要改變的孔厉,我這里選擇了5種參數(shù),包括采取的歷史回歸長(zhǎng)度然磷、隱藏層數(shù)姿搜、隱藏層單元數(shù)、單元隨機(jī)丟棄率致份、初始學(xué)習(xí)率氮块√喜酰可以自己定義參數(shù)的范圍蝠引,這樣貝葉斯算法就可以在這些參數(shù)范圍內(nèi)進(jìn)行尋優(yōu)。最大迭代次數(shù)我設(shè)置為了20步吊洼。
? ? ? 5.調(diào)用自定義的目標(biāo)函數(shù),利用貝葉斯算法對(duì)LSTM模型的超參數(shù)進(jìn)行優(yōu)化超燃。目標(biāo)函數(shù)的定義如下(僅展示了部分代碼)。我覺(jué)得這部分是貝葉斯優(yōu)化的核心届良,有點(diǎn)類似于遺傳算法的適應(yīng)度計(jì)算士葫。
? ? ? ? 6.將訓(xùn)練的最優(yōu)結(jié)果對(duì)應(yīng)的超參數(shù)進(jìn)行讀取識(shí)別,同時(shí)讀取最優(yōu)超參數(shù)下的訓(xùn)練得到的LSTM模型屋灌。
? ? ? 7.根據(jù)最佳超參數(shù),評(píng)估訓(xùn)練集和測(cè)試集的誤差除嘹。這一步我是為了保險(xiǎn),如果只是為了預(yù)測(cè),這一步可以不要。
? ? ? 8.進(jìn)行單步預(yù)測(cè)和24步預(yù)測(cè)。我這里同時(shí)做了單步和24步預(yù)測(cè)赁温,實(shí)際上我需要的只是24步預(yù)測(cè)股囊,這個(gè)在風(fēng)電預(yù)測(cè)里面比較常見。單步預(yù)測(cè)結(jié)果我也計(jì)算了内狗,只是為了進(jìn)行一個(gè)對(duì)比⊙颐穑現(xiàn)在很多文獻(xiàn)都只對(duì)比單步預(yù)測(cè)的結(jié)果,我覺(jué)得這個(gè)是很扯的一件事情熄云。事實(shí)上,單步預(yù)測(cè)我覺(jué)得意義并不大练般,只有對(duì)未來(lái)若干數(shù)據(jù)進(jìn)行預(yù)測(cè)才有價(jià)值。當(dāng)然這只是我個(gè)人的觀點(diǎn)。歡迎大家討論谷市!
? ? ? 9.誤差分析巩梢。我這里展示了4種誤差的圖,這也是最常用的誤差評(píng)估指標(biāo)了忌警。
? ? ? 以上就是全部?jī)?nèi)容了搁拙!程序我只展示了部分,完整的下載鏈接請(qǐng)點(diǎn)擊:基于貝葉斯優(yōu)化算法的LSTM模型時(shí)間序列多步預(yù)測(cè)Matlab程序代碼。(非免費(fèi)感混,十幾塊錢端幼,權(quán)當(dāng)尊重一下勞動(dòng)吧哈哈)。如果有問(wèn)題也歡迎留言討論弧满,或者聯(lián)系我的郵箱huweicheng92@163.com婆跑,我做了一些風(fēng)速智能預(yù)測(cè)的研究,如果有能一起合作寫文章的也非常歡迎庭呜。
————————————————
版權(quán)聲明:本文為CSDN博主「hwc_yzt」的原創(chuàng)文章滑进,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明募谎。
原文鏈接:https://blog.csdn.net/weixin_38919810/article/details/124768458