鯨魚算法優(yōu)化雙向LSTM做時間序列預(yù)測的Matlab實(shí)戰(zhàn))
簡介面向時間序列預(yù)測與智能優(yōu)化算法結(jié)合需求的Matlab用戶這套代碼提供了改進(jìn)鯨魚算法優(yōu)化雙向長短期記憶網(wǎng)絡(luò)IWOA-BILSTM與標(biāo)準(zhǔn)BILSTM的完整對比實(shí)驗(yàn)方案。優(yōu)化范圍涵蓋迭代次數(shù)、隱藏層節(jié)點(diǎn)個數(shù)、學(xué)習(xí)率及正則化參數(shù)需在MATLAB 2019及以上版本運(yùn)行適合希望在預(yù)測模型中引入高效超參數(shù)尋優(yōu)機(jī)制的學(xué)者與工程師。包內(nèi)共15個文件以11個.m腳本為主涵蓋數(shù)據(jù)預(yù)處理、適應(yīng)度計(jì)算、模型訓(xùn)練、結(jié)果可視化等環(huán)節(jié)另有2個.mat保存訓(xùn)練與仿真數(shù)據(jù)、1個xlsx承載原始數(shù)據(jù)集、1個txt說明文件輔助快速上手整體壓縮包僅70KB輕量且結(jié)構(gòu)清晰。代碼質(zhì)量較高評價指標(biāo)包含R2、MAE、MSE、RMSE并配有對比繪圖腳本可直接替換自己的數(shù)據(jù)進(jìn)行時間序列預(yù)測實(shí)驗(yàn)。目前已有199人學(xué)習(xí)便于快速驗(yàn)證IWOA-BILSTM相比BILSTM的預(yù)測精度提升效果。1. 用改進(jìn)鯨魚算法優(yōu)化雙向LSTM做時間序列預(yù)測到底在優(yōu)化什么半夜調(diào) LSTM 的超參是很多做時間序列預(yù)測的人共同的噩夢隱藏層節(jié)點(diǎn)設(shè)多少、學(xué)習(xí)率給多大、L2 正則怎么定每個參數(shù)都像開盲盒試錯一輪就是半小時起步。IWOA-BILSTM 這個名字拆開看就兩件事用改進(jìn)鯨魚算法IWOA自動搜索雙向長短期記憶網(wǎng)絡(luò)BiLSTM的關(guān)鍵超參數(shù)然后用搜索到的最優(yōu)參數(shù)完成時間序列預(yù)測。它解決的是 BiLSTM 這類模型“結(jié)構(gòu)很強(qiáng)、參數(shù)太玄”的痛點(diǎn)適合做風(fēng)速、電力負(fù)荷、交通流、股價等單變量或多變量預(yù)測的工程師和研究者。本文從原理講到 Matlab 實(shí)現(xiàn)把滑窗構(gòu)造、適應(yīng)度函數(shù)、參數(shù)映射和最容易翻車的數(shù)據(jù)細(xì)節(jié)一次說清。2. 從 BiLSTM 到 IWOA-BILSTM雙向結(jié)構(gòu)為什么適合時序預(yù)測改進(jìn)鯨魚算法改在哪2.1 單向 LSTM 丟掉了什么BiLSTM 雙向結(jié)構(gòu)處理時序的直覺理解單向 LSTM 沿時間軸從 t1 讀到 tT每個時刻的隱藏狀態(tài)只攜帶過去信息。做時間序列預(yù)測時直覺上“只該看過去”但這忽略了一個事實(shí)很多序列的局部模式只有放到整段上下文里才能被識別。舉個最直白的例子——負(fù)荷曲線每天的早高峰和晚高峰形狀相近但幅值不同單向 LSTM 讀到某個上升沿時它分不清這是早高峰的前半段還是晚高峰的反彈BiLSTM 讓信息同時從兩個方向流過序列前向隱藏狀態(tài)捕捉“從過去到現(xiàn)在”的趨勢后向隱藏狀態(tài)捕捉“從現(xiàn)在回看過去”的上下文最后把兩個方向的輸出拼接起來作為這一時刻的表征。有人會問預(yù)測未來時根本沒有未來數(shù)據(jù)后向 LSTM 的信息從哪來這是初學(xué)者最常卡住的地方。訓(xùn)練時 BiLSTM 讀的是滑窗構(gòu)造的一段歷史序列后向傳播處理的是這段窗口內(nèi)從右向左的信息流并不是真正的未來值。預(yù)測時同樣輸入歷史窗口網(wǎng)絡(luò)用學(xué)到的雙向模式做特征提取不存在標(biāo)簽泄露。理解這一點(diǎn)后面設(shè)計(jì)實(shí)驗(yàn)時才不會把測試集混進(jìn)來。2.2 鯨魚算法 WOA 的編碼方式超參數(shù)映射成鯨魚位置鯨魚優(yōu)化算法模擬座頭鯨的泡泡網(wǎng)捕食行為核心是三種位置更新策略收縮包圍、螺旋氣泡網(wǎng)、隨機(jī)搜索。在 IWOA-BILSTM 里每條鯨魚的位置向量就是一組待優(yōu)化的超參數(shù)組合。我一般把位置向量設(shè)計(jì)成四維分別對應(yīng) BiLSTM 的隱藏層節(jié)點(diǎn)數(shù)、初始學(xué)習(xí)率、L2 正則化系數(shù)和 MiniBatchSize。連續(xù)變量直接映射整數(shù)變量取 round學(xué)習(xí)率和 L2 這類跨數(shù)量級的參數(shù)做對數(shù)映射。位置維度參數(shù)含義取值范圍映射方式x1隱藏層節(jié)點(diǎn)數(shù)[16, 128]round 取整x2初始學(xué)習(xí)率[1e-4, 1e-2]10 的冪次對數(shù)映射x3L2 正則化系數(shù)[1e-8, 1e-2]10 的冪次對數(shù)映射x4MiniBatchSize[16, 128]round 取整每次迭代時用當(dāng)前鯨魚位置解碼出超參數(shù)訓(xùn)練一個 BiLSTM把驗(yàn)證集上的 RMSE 作為適應(yīng)度值。適應(yīng)度越小說明這組超參數(shù)越好。整個流程就是把“調(diào)參玄學(xué)”變成了一個可迭代的數(shù)值優(yōu)化問題。2.3 IWOA 的三個改進(jìn)點(diǎn)收斂因子、種群初始化和精英變異標(biāo)準(zhǔn) WOA 在工程實(shí)測里有兩個典型毛病一是前期收斂太快鯨魚還沒充分探索就扎堆到局部最優(yōu)附近二是后期種群多樣性丟失最優(yōu)解周圍沒有擾動跳不出局部坑。IWOA 最常見的改進(jìn)組合是“非線性收斂因子 混沌初始化 精英變異”三件套。收斂因子 a 從線性遞減改成余弦型遞減例如 a 2*cos(π/2 * t/MaxIter)這樣前中期探索范圍更大后期才逐步轉(zhuǎn)入精細(xì)開發(fā)。種群初始化用 Tent 混沌映射代替 rand 均勻分布原理是混沌序列在 [0,1] 區(qū)間內(nèi)分布更均勻且自相關(guān)低初始鯨魚位置不容易扎堆。精英變異針對每一代的最優(yōu)個體在更新完位置后給它加一個小幅高斯擾動相當(dāng)于給當(dāng)前最優(yōu)解一個跳出去再試一次的機(jī)會。這三個改進(jìn)都不復(fù)雜但對收斂速度和最終精度的提升在后面的對比實(shí)驗(yàn)里能明顯看到。3. 數(shù)據(jù)與實(shí)驗(yàn)設(shè)計(jì)先定基準(zhǔn)再談優(yōu)化滑窗和歸一化這樣搭3.1 數(shù)據(jù)集選取與劃分單變量先跑通多變量再擴(kuò)展不管是用公開的風(fēng)速數(shù)據(jù)集還是自己采集的負(fù)荷數(shù)據(jù)第一原則是按時間順序劃分絕不能隨機(jī)打亂。隨機(jī)打亂會讓模型“偷看”未來驗(yàn)證集和測試集指標(biāo)都會虛高這是時間序列預(yù)測里最隱蔽的翻車點(diǎn)。我一般按 7:1.5:1.5 劃分訓(xùn)練集、驗(yàn)證集、測試集驗(yàn)證集專門用來算適應(yīng)度測試集只在最終模型確定后碰一次。如果做多變量預(yù)測常見的做法是把輔助變量和預(yù)測目標(biāo)按同一時間軸對齊后拼成特征矩陣。例如預(yù)測電力負(fù)荷可以把溫度、濕度、節(jié)假日標(biāo)記作為附加特征特征維度從 1 變成 4但滑窗構(gòu)造邏輯不變。先用單變量把 IWOA-BILSTM 的流程跑通再擴(kuò)多變量排查問題會容易得多。3.2 滑窗構(gòu)造樣本時間步長和預(yù)測步長的選擇邏輯滑窗是時間序列預(yù)測的數(shù)據(jù)基礎(chǔ)。假設(shè)用過去 ts 個時刻預(yù)測未來 h 步那么每個樣本是一個 ts 長的窗口標(biāo)簽是窗口末端后第 h 個時刻的值。決定滑窗參數(shù)時ts 要和數(shù)據(jù)的周期性對齊比如小時級電力負(fù)荷有 24 小時周期ts 至少取 24 或 48日級風(fēng)速數(shù)據(jù)可以取 7 或 14。預(yù)測步長 h 取 1 時是最簡單的單步預(yù)測多步預(yù)測則需要遞歸策略或直接多輸出。下面這個 Matlab 函數(shù)生成滑窗樣本步長 step 控制窗口之間的間隔function [XCell, YVec] makeSlidingWindows(data, ts, h, step) % data: 歸一化后的單變量序列行向量 % ts: 時間步長每個樣本用過去多少個時刻 % h: 預(yù)測步長預(yù)測未來第 h 個時刻 % step: 窗口滑動步長 N length(data); n floor((N - ts - h 1) / step); % 樣本總數(shù) X zeros(ts, n); Y zeros(1, n); for i 1:n idx (i - 1) * step 1; X(:, i) data(idx : idx ts - 1); % 每列一個樣本 Y(i) data(idx ts h - 1); % 對應(yīng)標(biāo)簽 end % trainNetwork 需要 cell 數(shù)組每個 cell 是 1×ts 的觀測 XCell cell(1, n); for i 1:n XCell{i} X(:, i); end YVec Y; end這段代碼的關(guān)鍵在于樣本組織和標(biāo)簽對齊。X 的每一列是一個樣本列數(shù) n 是樣本數(shù)trainNetwork 要求序列輸入是 cell 數(shù)組所以第二個循環(huán)把每一列轉(zhuǎn)成行向量塞進(jìn) cell。標(biāo)簽 YVec 是 1×n 的行向量對應(yīng)每個樣本的預(yù)測目標(biāo)。step 參數(shù)常被忽略但它的作用很大step1 時窗口高度重疊樣本量最大但信息冗余stepts 時窗口完全不重疊樣本量小但獨(dú)立性強(qiáng)。對 BiLSTM 來說我通常先選 step1再用驗(yàn)證集誤差判斷是否需要增大。3.3 對比實(shí)驗(yàn)的三條基線BILSTM、WOA-BILSTM、IWOA-BILSTM對比實(shí)驗(yàn)的目的不是為了好看是為了說清楚“改進(jìn)到底改進(jìn)在哪”。我一般固定同一份滑窗數(shù)據(jù)和同一個隨機(jī)種子跑三條基線模型超參數(shù)來源說明BiLSTM經(jīng)驗(yàn)手動設(shè)置基線模型WOA-BiLSTM標(biāo)準(zhǔn)鯨魚算法尋優(yōu)驗(yàn)證標(biāo)準(zhǔn) WOA 的效果IWOA-BiLSTM改進(jìn)鯨魚算法尋優(yōu)最終方案評估指標(biāo)用 RMSE、MAE、MAPE、R2 四個注意全部按反歸一化后的原始量綱計(jì)算。對比時看兩個層面一是 IWOA 的適應(yīng)度收斂曲線是否比 WOA 更快、最終值更低二是三個模型在測試集上的預(yù)測誤差確認(rèn)改進(jìn)沒有過擬合驗(yàn)證集。4. 在 Matlab 里把 IWOA-BILSTM 跑通適應(yīng)度函數(shù)、參數(shù)映射與網(wǎng)絡(luò)訓(xùn)練的最小代碼4.1 適應(yīng)度函數(shù)設(shè)計(jì)用驗(yàn)證集 RMSE 還是 MAPE適應(yīng)度函數(shù)是整個 IWOA-BILSTM 的“評價標(biāo)準(zhǔn)”它決定鯨魚往哪個方向進(jìn)化。用 RMSE 時大誤差被平方放大模型會優(yōu)先壓平那些偏離大的點(diǎn)用 MAPE 時誤差被相對化更關(guān)注小數(shù)值時刻的預(yù)測精度。如果數(shù)據(jù)里有接近零的值MAPE 會爆炸這時 RMSE 更穩(wěn)。我習(xí)慣用驗(yàn)證集 RMSE 作為適應(yīng)度因?yàn)樗鼘Ξ惓|c(diǎn)敏感、量綱明確且和最終測試指標(biāo)的衡量口徑一致。注意一個細(xì)節(jié)適應(yīng)度函數(shù)內(nèi)部要訓(xùn)練完整的 BiLSTM這是整個算法最耗時的部分。因此迭代次數(shù)和種群規(guī)模必須克制常見做法是種群 N5、迭代 MaxIter10每輪要訓(xùn)練 5×1050 個網(wǎng)絡(luò)單變量小數(shù)據(jù)集在 CPU 上大約需要十幾分鐘GPU 會快很多。工程驗(yàn)證階段可以先 N3、MaxIter5確認(rèn)流程沒問題再加大。4.2 鯨魚位置與 BiLSTM 超參數(shù)的映射核心解碼代碼鯨魚位置是 [0,1] 區(qū)間內(nèi)的歸一化連續(xù)值解碼成真實(shí)超參數(shù)需要按維度做映射。下面這段代碼實(shí)現(xiàn)了 4.2 節(jié)表格里的映射邏輯function params decodePosition(pos, lb, ub) % pos: 1×4 鯨魚位置向量取值 [0,1] % lb: 1×4 各維度下界 % ub: 1×4 各維度上界 posReal lb pos .* (ub - lb); % 線性映射到實(shí)際范圍 hiddenUnits round(posReal(1)); % 隱藏層節(jié)點(diǎn)數(shù)取整 learnRate 10^(posReal(2)); % 學(xué)習(xí)率對數(shù)映射 l2Reg 10^(posReal(3)); % L2 正則化系數(shù)對數(shù)映射 miniBatch round(posReal(4)); % MiniBatchSize取整 params [hiddenUnits, learnRate, l2Reg, miniBatch]; end這里的關(guān)鍵是第 4 和第 5 行的對數(shù)映射。學(xué)習(xí)率 1e-4 到 1e-2 看起來跨度只有兩個數(shù)量級但如果做線性映射隨機(jī)初始化很容易落在 0.005 附近導(dǎo)致大量候選點(diǎn)集中在高學(xué)習(xí)率區(qū)間。對數(shù)映射把 1e-4、1e-3、1e-2 變成 -4、-3、-2 的均勻分布候選點(diǎn)在各數(shù)量級上分布更合理。整數(shù)參數(shù)在 round 前可能取到 16 到 128 之間的任意浮點(diǎn)數(shù)取整后直接傳給 bilstmLayer。4.3 網(wǎng)絡(luò)訓(xùn)練與驗(yàn)證trainNetwork 的兩個關(guān)鍵設(shè)置解碼出超參數(shù)后就要構(gòu)造網(wǎng)絡(luò)結(jié)構(gòu)并訓(xùn)練。核心代碼塊如下function fitness iwoaFitness(params, XTrain, YTrain, XVal, YVal) hiddenUnits params(1); learnRate params(2); l2Reg params(3); miniBatch params(4); % 網(wǎng)絡(luò)結(jié)構(gòu)單變量輸入 - BiLSTM - 全連接 - 回歸輸出 layers [ sequenceInputLayer(1) bilstmLayer(hiddenUnits, OutputMode, last) fullyConnectedLayer(1) regressionLayer]; % 訓(xùn)練選項(xiàng)靜默訓(xùn)練關(guān)閉訓(xùn)練進(jìn)度圖 options trainingOptions(adam, ... InitialLearnRate, learnRate, ... L2Regularization, l2Reg, ... MiniBatchSize, miniBatch, ... MaxEpochs, 50, ... Shuffle, every-epoch, ... Verbose, 0, ... Plots, none); % 訓(xùn)練并預(yù)測驗(yàn)證集 net trainNetwork(XTrain, YTrain, layers, options); YPred predict(net, XVal); % 反歸一化后計(jì)算 RMSE需要傳入 PS 結(jié)構(gòu)體這里省略 rmse sqrt(mean((YPred - YVal).^2)); fitness rmse; end這段代碼有兩個必須注意的設(shè)置。第一個是OutputMode, lastBiLSTM 層的輸出模式?jīng)Q定網(wǎng)絡(luò)輸出的是每個時刻的隱藏狀態(tài)還是最后一個時刻的狀態(tài)回歸預(yù)測必須用last否則全連接層收到的是整個時間維度的輸出序列維度對不上。第二個是Verbose, 0和Plots, none適應(yīng)度函數(shù)要被調(diào)用幾十次開著訓(xùn)練進(jìn)度條和損失曲線會拖慢速度而且控制臺刷屏嚴(yán)重影響調(diào)試心情。trainNetwork 要求 XTrain 是 cell 數(shù)組且每個 cell 內(nèi)的矩陣維度是 特征數(shù)×?xí)r間步長。單變量場景每個 cell 是 1×ts與我們 3.2 節(jié)生成的格式完全對應(yīng)。這里的MaxEpochs, 50是適應(yīng)度評估時的訓(xùn)練輪數(shù)不是最終模型的訓(xùn)練輪數(shù)最終模型確定后要用更多輪次重新訓(xùn)練一次。5. IWOA-BILSTM 避坑指南容易翻車的五個參數(shù)與數(shù)據(jù)細(xì)節(jié)5.1 適應(yīng)度函數(shù)只在訓(xùn)練集上算測試集指標(biāo)斷崖式下跌現(xiàn)象迭代過程中適應(yīng)度一路下降最終 IWOA-BILSTM 在驗(yàn)證集上 RMSE 很低但換到測試集后誤差突然放大 30% 以上。原因適應(yīng)度函數(shù)只用訓(xùn)練集擬合、驗(yàn)證集評估但超參數(shù)搜索過程本身就在驗(yàn)證集上做了隱式“訓(xùn)練”搜索輪次越多驗(yàn)證集的信息被吸收得越多最終模型在驗(yàn)證集上必然偏樂觀。解決一是適應(yīng)度統(tǒng)一用驗(yàn)證集測試集嚴(yán)格留在最后二是觀察訓(xùn)練集和驗(yàn)證集誤差的差距如果差距持續(xù)拉大說明隱藏層節(jié)點(diǎn)數(shù)或?qū)W習(xí)率組合偏向過擬合優(yōu)先調(diào)大 L2 正則化系數(shù)。5.2 歸一化泄漏mapminmax 把整個數(shù)據(jù)集的最大最小值都算進(jìn)去了現(xiàn)象訓(xùn)練時模型表現(xiàn)極好測試集卻出現(xiàn)幅度錯位預(yù)測曲線整體偏低或偏高。原因歸一化時用mapminmax(data)對全量數(shù)據(jù)求了最大最小值相當(dāng)于模型在訓(xùn)練階段“見過”了測試集的數(shù)值范圍這是標(biāo)準(zhǔn)的時間序列數(shù)據(jù)泄漏。解決先用訓(xùn)練集單獨(dú)擬合歸一化參數(shù) PS再對驗(yàn)證集和測試集應(yīng)用同一組參數(shù)。Matlab 里[~, PS] mapminmax(trainData, 0, 1)得到映射參數(shù)之后用mapminmax(apply, valData, PS)處理驗(yàn)證集測試集同理。5.3 滑窗步長設(shè)成 1 導(dǎo)致樣本高度重疊模型“背答案”現(xiàn)象訓(xùn)練誤差非常低但測試誤差不穩(wěn)定同一組參數(shù)換一次隨機(jī)種子波動很大。原因step1 時相鄰樣本只差一個時刻重疊率高達(dá) (ts-1)/ts訓(xùn)練集里大量高度相似的樣本讓模型記住了窗口的具體模式而非一般規(guī)律。解決先把 step 設(shè)為 ts/2讓樣本重疊率降到 50% 左右再觀察驗(yàn)證集誤差變化。如果數(shù)據(jù)量充足stepts 完全不重疊的效果更穩(wěn)。這個參數(shù)值得專門做一組小實(shí)驗(yàn)它不參與鯨魚尋優(yōu)但對最終性能影響極大。5.4 隱藏層節(jié)點(diǎn)數(shù)與鯨魚種群規(guī)模亂設(shè)一次實(shí)驗(yàn)跑半小時現(xiàn)象鯨魚位置解碼出的隱藏層節(jié)點(diǎn)數(shù)偏大加上種群規(guī)模 N10、迭代次數(shù) MaxIter30一次完整實(shí)驗(yàn)跑了快兩個小時才出結(jié)果。原因BiLSTM 的參數(shù)量隨隱藏層節(jié)點(diǎn)數(shù)平方級增長訓(xùn)練時間也隨之暴漲而 IWOA 的每一輪都要重新訓(xùn)練網(wǎng)絡(luò)總耗時等于 種群×迭代×單次訓(xùn)練耗時。解決把隱藏層節(jié)點(diǎn)數(shù)上限從 256 壓到 128種群 N5、MaxIter10先跑通再放規(guī)模。如果單次訓(xùn)練超過 2 分鐘就縮減樣本量或訓(xùn)練輪數(shù)優(yōu)先保證能快速迭代。5.5 earlyStopping 開著結(jié)果每次實(shí)驗(yàn)預(yù)測曲線風(fēng)格都不一樣現(xiàn)象同樣一組超參數(shù)連續(xù)運(yùn)行兩次得到的測試集 RMSE 相差很大預(yù)測曲線一條平滑一條抖動像抽獎。原因trainingOptions 里沒有關(guān)閉驗(yàn)證集早停而 BiLSTM 權(quán)重初始化是隨機(jī)的不同運(yùn)行在早停時停在了不同的局部最優(yōu)。解決適應(yīng)度評估階段固定隨機(jī)種子Matlab 里每次訓(xùn)練前調(diào)用rng(0)再用ValidationPatience, Inf或直接不設(shè)驗(yàn)證集早停參數(shù)確保同一組超參數(shù)的評估結(jié)果可復(fù)現(xiàn)。這個細(xì)節(jié)決定了你最后寫對比表格時數(shù)字是真實(shí)差距還是隨機(jī)噪聲。6. 誤差分布與消融實(shí)驗(yàn)用這兩個手段驗(yàn)證 IWOA-BILSTM 不是 Paper 模型跑完 IWOA-BILSTM光看測試集 RMSE 數(shù)字還不夠我習(xí)慣用兩個手段確認(rèn)模型是真的變好了而不是換了個隨機(jī)種子碰運(yùn)氣。第一個手段是畫預(yù)測誤差分布直方圖。把測試集每個樣本的預(yù)測誤差預(yù)測值減真實(shí)值收集起來用 Matlab 的 histogram 畫出來看它的均值和形狀。正常的模型誤差應(yīng)近似零均值的正態(tài)分布峰值在 0 附近拖尾不明顯。如果直方圖明顯偏移說明模型存在系統(tǒng)性偏差比如歸一化泄漏或滑窗標(biāo)簽錯位如果拖尾很長說明少數(shù)極端時刻預(yù)測很差需要檢查這些時刻是不是數(shù)據(jù)里的異常尖峰。這一步比單一指標(biāo)更能暴露問題。第二個手段是嚴(yán)格做消融實(shí)驗(yàn)。對比表至少包含三行BiLSTM 基線、WOA-BILSTM、IWOA-BILSTM三者在同一份數(shù)據(jù)、同一種滑窗參數(shù)、同一個隨機(jī)種子下運(yùn)行。我習(xí)慣在跑對比前先釘死隨機(jī)種子確保三組實(shí)驗(yàn)的權(quán)重初始化基準(zhǔn)一致不然你比出來的差距可能是運(yùn)氣差。消融結(jié)果一般會看到兩個現(xiàn)象WOA-BILSTM 相比 BiLSTM 提升有限說明標(biāo)準(zhǔn)鯨魚算法找到了還不錯的參數(shù)但未必跳出了局部坑IWOA-BILSTM 進(jìn)一步提升且多次重復(fù)實(shí)驗(yàn)的方差更小說明改進(jìn)算法不僅找到了更優(yōu)解而且更穩(wěn)定。最后再提一個工程小技巧預(yù)測結(jié)果畫圖時把真實(shí)值、BiLSTM 預(yù)測、IWOA-BILSTM 預(yù)測畫在同一張圖里再把兩者誤差的上下包絡(luò)帶畫成陰影區(qū)域。這樣能一眼看出改進(jìn)主要發(fā)生在哪些時段——是尖峰時刻擬合得更好還是整體趨勢更貼近。做時序預(yù)測的都知道一張清晰的對比圖比一堆指標(biāo)數(shù)字更能讓方案被接受。這些驗(yàn)證手段看起來不起眼但正是它們把 IWOA-BILSTM 從“代碼能跑”推進(jìn)到“結(jié)果可信”。我自己的習(xí)慣是每次都先把消融表跑出來再調(diào)參跑完再回頭優(yōu)化數(shù)據(jù)預(yù)處理希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取