網(wǎng)絡(luò)電力負(fù)荷預(yù)測實(shí)戰(zhàn):從建模到踩坑的完整指南)
簡介基于BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)電力負(fù)荷預(yù)測的MATLAB編程學(xué)習(xí)資源面向本碩博及科研教學(xué)人員適合希望以經(jīng)典回歸預(yù)測案例快速入門神經(jīng)網(wǎng)絡(luò)算法的讀者。壓縮包共3個(gè)文件包含可直接運(yùn)行的主腳本、配套的電力負(fù)荷數(shù)據(jù)集以及完整操作演示視頻avi格式整個(gè)資源包約400KB文件精簡、層次清晰便于對照學(xué)習(xí)和代碼復(fù)現(xiàn)。資源給出了完整的BP神經(jīng)網(wǎng)絡(luò)負(fù)荷預(yù)測實(shí)現(xiàn)流程從數(shù)據(jù)整理、網(wǎng)絡(luò)建立、參數(shù)配置到訓(xùn)練與結(jié)果展示均有覆蓋兼容MATLAB 2021a及以上版本需以主腳本為入口運(yùn)行配合操作錄像可逐步掌握實(shí)際運(yùn)行方法并理解隱含層節(jié)點(diǎn)、訓(xùn)練函數(shù)等核心要素的選取思路。目前已有756人瀏覽學(xué)習(xí)可用于課程設(shè)計(jì)、論文仿真或自主編程練習(xí)是一份適合教學(xué)與自學(xué)的緊湊型實(shí)戰(zhàn)素材。1. 周五晚高峰前的那通調(diào)度電話BP神經(jīng)網(wǎng)絡(luò)預(yù)測電力負(fù)荷解決什么問題周五下午三點(diǎn)調(diào)度臺值長打來電話問晚間高峰負(fù)荷預(yù)估多少。這個(gè)數(shù)字直接決定機(jī)組啟停、備用容量安排和現(xiàn)貨市場報(bào)價(jià)偏差大了就是真金白銀的成本。電力負(fù)荷預(yù)測是個(gè)典型的時(shí)序回歸問題BP神經(jīng)網(wǎng)絡(luò)反向傳播的多層前饋網(wǎng)絡(luò)是解決這個(gè)問題最經(jīng)典的模型之一輸入歷史負(fù)荷序列和氣溫、星期類型等外部特征輸出未來一個(gè)時(shí)刻或連續(xù)多個(gè)時(shí)刻的負(fù)荷值。相比LSTM、Transformer這類重模型BP結(jié)構(gòu)簡單、數(shù)據(jù)量要求低、訓(xùn)練快在短期負(fù)荷預(yù)測場景里依然是大量在用的靠譜基線。下面按建模、代碼、踩坑、驗(yàn)證的順序把這套方案講清楚。適合做調(diào)度輔助決策、微網(wǎng)能量管理、售電公司負(fù)荷預(yù)測或者剛開始接觸時(shí)序預(yù)測、想找一個(gè)不用大算力也能快速落地的入門模型的工程師參考。2. 先建模再寫碼BP負(fù)荷預(yù)測的輸入特征、網(wǎng)絡(luò)結(jié)構(gòu)與數(shù)據(jù)預(yù)處理很多人拿到負(fù)荷數(shù)據(jù)就開始寫網(wǎng)絡(luò)loss降不下去才回頭想特征的事。電力負(fù)荷預(yù)測里數(shù)據(jù)質(zhì)量和特征構(gòu)造對結(jié)果的影響遠(yuǎn)大于網(wǎng)絡(luò)結(jié)構(gòu)本身。BP再能擬合喂進(jìn)去的是垃圾特征出來就是垃圾預(yù)測。所以先把輸入是什么、輸出是什么、用多少層網(wǎng)絡(luò)來表達(dá)這個(gè)映射關(guān)系想清楚代碼只是把方案落地的最后一層皮。2.1 為什么是BP而不是LSTM或xgboost模型選型先看數(shù)據(jù)規(guī)模BP這個(gè)名稱來自反向傳播Back Propagation網(wǎng)絡(luò)結(jié)構(gòu)本身是前饋全連接網(wǎng)絡(luò)。網(wǎng)上搜bp神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖十張有八張是輸入層、隱含層、輸出層的三層圈圖寫成代碼就是全連接層堆疊沒有任何循環(huán)或注意力機(jī)制。很多人一上手時(shí)序任務(wù)就找LSTM模型代碼但LSTM面向的是長序列依賴建模需要足夠多的數(shù)據(jù)才能發(fā)揮優(yōu)勢。電力負(fù)荷預(yù)測如果只取過去24到168小時(shí)窗口做輸入樣本量也就是幾千到幾萬條這個(gè)量級下LSTM的訓(xùn)練成本和調(diào)參難度都不劃算。另一個(gè)常見對比是xgboost代碼樹模型做負(fù)荷預(yù)測也能到相當(dāng)不錯(cuò)的精度尤其在特征工程做得細(xì)的時(shí)候但BP能端到端學(xué)習(xí)特征之間的非線性交互并且對輸入空間的插值行為更平滑這對保留負(fù)荷曲線的峰谷形狀是有幫助的。我的選型結(jié)論很直接樣本量在萬級以下、特征以數(shù)值型為主、需要快速迭代出第一個(gè)可用模型的時(shí)候用BP。樣本量到了幾十萬條以上序列依賴很強(qiáng)又有GPU資源再上LSTM或者Transformer不遲。BP在短期負(fù)荷預(yù)測里的定位是“靠譜基線”它先把流程跑通給后續(xù)復(fù)雜模型提供一個(gè)誤差對比的錨點(diǎn)。2.2 特征怎么構(gòu)造氣溫、星期類型與歷史負(fù)荷的滑窗編碼負(fù)荷預(yù)測的特征分兩塊負(fù)荷自身的歷史值和外部影響因素。歷史值用滑窗的方式構(gòu)造——取過去168小時(shí)一周的負(fù)荷序列作為輸入預(yù)測未來某個(gè)時(shí)刻的負(fù)荷。電力負(fù)荷有強(qiáng)烈的日周期和七日周期窗口覆蓋一個(gè)完整自然周后模型能學(xué)到“今天下午的負(fù)荷形態(tài)和上周同一天下午接近”這種規(guī)律。窗口大小不是越寬越好。window168意味著輸入維度是168特征維度高但樣本量不變網(wǎng)絡(luò)容量需求隨之上升。如果數(shù)據(jù)只有兩三年我更傾向于混合特征窗口取24再額外拼接t-24、t-168、t-336這三個(gè)單點(diǎn)負(fù)荷值既保留了近期趨勢又顯式注入日周期和周期。外部特征里氣溫是最重要的制冷和制熱負(fù)荷都跟著溫度走。這里有個(gè)常見誤用預(yù)測未來負(fù)荷時(shí)只能用氣溫的預(yù)報(bào)值不能用實(shí)測值否則線上跑的時(shí)候特征根本拿不到。星期類型用0到6的數(shù)值編碼節(jié)假日單獨(dú)拉一個(gè)二值位。峰谷時(shí)段如果有分時(shí)電價(jià)政策也可以作為特征進(jìn)入網(wǎng)絡(luò)但注意不要泄露未來信息。歸一化這一步放在特征之后。負(fù)荷值動(dòng)輒幾百到幾千MW氣溫在零下到四十度之間浮動(dòng)量綱差兩個(gè)數(shù)量級直接喂給網(wǎng)絡(luò)梯度更新會被大數(shù)值特征主導(dǎo)。MinMax歸一化到[0,1]區(qū)間是最省事的做法后面代碼部分會給出正確順序。2.3 結(jié)構(gòu)怎么定隱層數(shù)、隱層節(jié)點(diǎn)與激活函數(shù)的經(jīng)驗(yàn)參數(shù)BP的網(wǎng)絡(luò)結(jié)構(gòu)輸入層維度由特征數(shù)量決定輸出層一個(gè)節(jié)點(diǎn)、不帶激活函數(shù)因?yàn)檫@是回歸不是分類。真正的變量在隱層。單隱層BP在理論上能逼近任意連續(xù)函數(shù)兩層隱層對尖峰和突變擬合更好。電力負(fù)荷曲線一般就是早晚兩個(gè)峰形狀并不復(fù)雜一層隱層加夠?qū)挾榷鄶?shù)情況夠用數(shù)據(jù)特征組合變復(fù)雜之后再加第二層隱層作為備選。隱層節(jié)點(diǎn)數(shù)沒有定論很多人把這當(dāng)玄學(xué)。常見經(jīng)驗(yàn)公式是n_hidden sqrt(n_in n_out) aa在1到10之間取也有按輸入維度的1.5到2倍起步的。我一般從64開始看驗(yàn)證集誤差變化再翻倍或減半而不是一上來堆256個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)太多數(shù)據(jù)量不夠就必然過擬合節(jié)點(diǎn)太少損失函數(shù)降到一定水平就下不去了曲線呈平臺狀。激活函數(shù)的選擇直接影響訓(xùn)練穩(wěn)定性。隱層用relu輸出層保持線性這是當(dāng)前最穩(wěn)妥的組合。sigmoid在隱層容易飽和反向傳播時(shí)梯度接近消失層數(shù)稍深就訓(xùn)不動(dòng)。relu的梯度在正區(qū)間恒為1訓(xùn)練過程明顯穩(wěn)定。損失函數(shù)用mse因?yàn)樨?fù)荷預(yù)測要懲罰大偏差點(diǎn)mse對峰值誤差天然放大如果想在訓(xùn)練時(shí)順便盯百分比誤差可以把mape加進(jìn)監(jiān)控指標(biāo)但訓(xùn)練目標(biāo)還是用mse。3. 用Python跑通BP負(fù)荷預(yù)測從csv到loss曲線的完整代碼下面這段示例代碼是完整可跑的假設(shè)csv里至少有三列date小時(shí)級時(shí)間戳、load負(fù)荷值單位MW、temp氣溫單位攝氏度。幾千行的歷史數(shù)據(jù)就能跑出趨勢來。環(huán)境方面裝好tensorflow、pandas、numpy、scikit-learn即可不需要GPU。你跟著代碼操作視頻復(fù)現(xiàn)時(shí)環(huán)境配置和數(shù)據(jù)格式對齊是最容易卡住的地方代碼本身反而不難。3.1 讀數(shù)據(jù)與滑窗采樣把負(fù)荷序列變成監(jiān)督學(xué)習(xí)的X和Yimport pandas as pd import numpy as np df pd.read_csv(load_data.csv, parse_dates[date]) df df.sort_values(date).reset_index(dropTrue) window 168 # 用過去一周的負(fù)荷值 horizon 24 # 預(yù)測未來24小時(shí)后的那個(gè)點(diǎn) X, Y [], [] for i in range(len(df) - window - horizon): X.append(df[load].iloc[i:iwindow].values) Y.append(df[load].iloc[iwindowhorizon-1]) X np.array(X) Y np.array(Y) print(X.shape, Y.shape)這段代碼的邏輯是逐行滑窗第一個(gè)樣本取第0到第167小時(shí)的負(fù)荷對應(yīng)的標(biāo)簽是第191小時(shí)的負(fù)荷第二個(gè)樣本取第1到第168小時(shí)標(biāo)簽是第192小時(shí)。每一步窗口平移一個(gè)采樣點(diǎn)最終得到一組監(jiān)督學(xué)習(xí)需要的(X, Y)對。參數(shù)說明window168對應(yīng)一周的小時(shí)數(shù)電力負(fù)荷有強(qiáng)七日周期性窗口覆蓋完整周期后模型更容易學(xué)到周維度的規(guī)律。horizon24表示預(yù)測未來24小時(shí)之后的負(fù)荷點(diǎn)不是預(yù)測未來24個(gè)點(diǎn)。如果數(shù)據(jù)是半小時(shí)一條window要改成336horizon改成48參數(shù)按采樣頻率換算不能照抄。數(shù)據(jù)量很大時(shí)這個(gè)純Python循環(huán)會慢可以把循環(huán)改成numpy的滑動(dòng)窗口視圖但幾萬條樣本以內(nèi)沒必要可讀性更重要。3.2 歸一化與數(shù)據(jù)集劃分先切分再fit避免數(shù)據(jù)泄漏from sklearn.preprocessing import MinMaxScaler split int(len(X) * 0.8) X_train_raw, X_test_raw X[:split], X[split:] Y_train_raw, Y_test_raw Y[:split].reshape(-1, 1), Y[split:].reshape(-1, 1) scaler_x MinMaxScaler() scaler_y MinMaxScaler() X_train scaler_x.fit_transform(X_train_raw).astype(np.float32) X_test scaler_x.transform(X_test_raw).astype(np.float32) Y_train scaler_y.fit_transform(Y_train_raw).ravel() Y_test scaler_y.transform(Y_test_raw).ravel()這里的順序很關(guān)鍵先切分再在訓(xùn)練集上fit測試集只調(diào)用transform。很多示例代碼為了省事對全量數(shù)據(jù)fit之后再切分測試集指標(biāo)會虛高這是教科書級別的數(shù)據(jù)泄漏后面第4.5節(jié)還會展開講。預(yù)測階段同樣只transform并把訓(xùn)練好的scaler保存下來供線上推理腳本使用。參數(shù)說明切分比例0.8比0.2按時(shí)間順序切不打亂shuffle。負(fù)荷預(yù)測遵循時(shí)間因果隨機(jī)打亂等于把未來信息泄露給模型。MinMax的默認(rèn)范圍是[0, 1]對全連接網(wǎng)絡(luò)夠用如果隱層激活換成tanh可以設(shè)feature_range(-1, 1)配合激活函數(shù)的值域。astype(np.float32)是為了和TensorFlow默認(rèn)的浮點(diǎn)精度對齊省掉訓(xùn)練時(shí)的類型轉(zhuǎn)換開銷。3.3 Keras搭建BP網(wǎng)絡(luò)訓(xùn)練參數(shù)與回調(diào)的取舍from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.callbacks import EarlyStopping model Sequential() model.add(Dense(64, activationrelu, input_shape(X_train.shape[1],))) model.add(Dropout(0.1)) model.add(Dense(32, activationrelu)) model.add(Dense(1)) # 回歸任務(wù)輸出層不帶激活函數(shù) model.compile(optimizeradam, lossmse, metrics[mae]) model.summary() early_stop EarlyStopping( monitorval_loss, patience10, restore_best_weightsTrue ) history model.fit( X_train, Y_train, validation_split0.1, epochs200, batch_size64, callbacks[early_stop], verbose1 )Sequential堆三個(gè)Dense層輸入維度是168對應(yīng)window第一層64個(gè)節(jié)點(diǎn)第二層32個(gè)節(jié)點(diǎn)輸出層一個(gè)節(jié)點(diǎn)。這里注意BP處理的是表格型數(shù)據(jù)輸入形狀是(samples, features)不需要像LSTM那樣寫input_shape(steps, features)的三維形狀。Dropout加在第一個(gè)隱層之后訓(xùn)練時(shí)隨機(jī)丟棄10%的節(jié)點(diǎn)緩解過擬合。參數(shù)說明batch_size64是內(nèi)存和梯度穩(wěn)定性的折中幾千條樣本時(shí)64或32都常見。epochs設(shè)200但EarlyStopping會在驗(yàn)證損失連續(xù)10個(gè)epoch不下降時(shí)提前截?cái)嗖estore_best_weights回滾到驗(yàn)證損失最小的權(quán)重。實(shí)際訓(xùn)練通常幾十個(gè)epoch就停了。這組參數(shù)適合大多數(shù)負(fù)荷數(shù)據(jù)集如果訓(xùn)練loss持續(xù)不降先檢查2.2節(jié)的特征構(gòu)造和4.1節(jié)的學(xué)習(xí)率不要急著加層加節(jié)點(diǎn)。3.4 預(yù)測結(jié)果反歸一化與誤差計(jì)算別只盯著loss曲線pred_norm model.predict(X_test, verbose0).ravel() pred scaler_y.inverse_transform(pred_norm.reshape(-1, 1)).ravel() real scaler_y.inverse_transform(Y_test.reshape(-1, 1)).ravel() mae np.mean(np.abs(pred - real)) rmse np.sqrt(np.mean((pred - real) ** 2)) mape np.mean(np.abs((real - pred) / real)) * 100 print(fMAE: {mae:.2f} MW, RMSE: {rmse:.2f} MW, MAPE: {mape:.2f}%)模型輸出的是歸一化到[0,1]區(qū)間的值直接拿去和真實(shí)負(fù)荷比是沒有意義的必須用scaler_y的inverse_transform還原回MW單位。三個(gè)誤差指標(biāo)里MAE給出平均偏差的直觀量級RMSE對峰值偏差更敏感MAPE是百分比行業(yè)匯報(bào)時(shí)最常引用。指標(biāo)計(jì)算方式關(guān)注的誤差類型經(jīng)驗(yàn)判斷MAE絕對誤差的均值平均偏差水平幾十MW級別視系統(tǒng)容量浮動(dòng)RMSE誤差平方均值再開根大偏差點(diǎn)明顯大于MAE時(shí)說明有尖峰誤差MAPE百分比誤差的均值相對偏差短期負(fù)荷預(yù)測5%以內(nèi)不錯(cuò)10%以上要排查注意MAPE有個(gè)天生的毛病負(fù)荷低谷時(shí)段真實(shí)值很小哪怕絕對誤差只有幾MW百分比也會被放大得很夸張。所以看MAPE要分段看峰時(shí)段和平段分開統(tǒng)計(jì)才有意義。訓(xùn)練完成后再用matplotlib把預(yù)測曲線和真實(shí)曲線疊在一張圖里肉眼看一眼滯后和峰谷形態(tài)比只看數(shù)值指標(biāo)更能發(fā)現(xiàn)問題。4. BP負(fù)荷預(yù)測的5個(gè)高頻踩坑收斂慢、滯后預(yù)測與數(shù)據(jù)泄漏的排查記錄這一章的坑我基本都踩過部分是復(fù)現(xiàn)別人代碼時(shí)翻車翻出來的部分是上線之后才暴露的。每一條按現(xiàn)象、原因、解決三個(gè)步驟寫訓(xùn)練曲線不對勁的時(shí)候直接對照排查就行。4.1 loss不降反升學(xué)習(xí)率與數(shù)據(jù)量綱在互相打架現(xiàn)象訓(xùn)練第一個(gè)epoch的loss就是幾百甚至nan后面一路震蕩下降不了。原因最常見的是輸入沒有歸一化。負(fù)荷值幾千MW氣溫幾十度兩個(gè)特征進(jìn)入同一個(gè)全連接層梯度被大數(shù)值特征主導(dǎo)小數(shù)值特征幾乎學(xué)不到東西。其次是adam優(yōu)化器默認(rèn)學(xué)習(xí)率0.001對量綱敏感的BP來說偏高容易在陡峭的損失面上震蕩loss直接沖上nan也不奇怪。解決先做MinMax歸一化這一點(diǎn)按3.2節(jié)的順序來做。然后把a(bǔ)dam的學(xué)習(xí)率從默認(rèn)的0.001降到0.0005或0.0001。如果還震蕩在compile時(shí)加上clipnorm1.0給梯度裁剪一個(gè)上限。另外檢查一下csv里有沒有缺失值或臟數(shù)據(jù)NaN進(jìn)入網(wǎng)絡(luò)后loss一定會飛這屬于“環(huán)境沒問題但loss起飛”的頭號原因。4.2 預(yù)測曲線比真實(shí)值慢半拍單步滾動(dòng)預(yù)測的錯(cuò)覺陷阱現(xiàn)象測試集的預(yù)測曲線和真實(shí)曲線形狀幾乎完全一致但肉眼可見向右偏了一兩個(gè)采樣點(diǎn)峰值總是晚到。MAPE不算差但調(diào)度員一看就說“這曲線是抄昨天的吧”。原因輸入特征里包含最近時(shí)刻的負(fù)荷值模型發(fā)現(xiàn)“把上一個(gè)值復(fù)制過來”的損失最小于是學(xué)到了近似恒等映射。負(fù)荷在平穩(wěn)段變化小抄近路的收益很大只有到峰值段才暴露出滯后。這并不是網(wǎng)絡(luò)壞了而是損失函數(shù)和特征結(jié)構(gòu)決定的偷懶行為。解決先確認(rèn)預(yù)測點(diǎn)與輸入窗口最后一個(gè)點(diǎn)的間隔。如果horizon1滯后現(xiàn)象最明顯。改進(jìn)有三個(gè)方向一是把輸入特征中的最近點(diǎn)替換成t-24和t-168的值逼模型學(xué)周期規(guī)律而不是學(xué)復(fù)制二是把horizon加大到2或3讓模型必須跨過短時(shí)波動(dòng)三是構(gòu)造差分特征把負(fù)荷增量作為輸入讓模型學(xué)變化量而不是學(xué)絕對值。我一般優(yōu)先用第三招效果最直接但要記得預(yù)測完把差分還原成絕對負(fù)荷值。4.3 訓(xùn)練集MAPE很低、測試集崩盤過擬合的三個(gè)信號現(xiàn)象訓(xùn)練集MAPE 2%測試集20%往上或者訓(xùn)練loss一直降、驗(yàn)證loss先降后升形成標(biāo)準(zhǔn)的U型曲線。原因網(wǎng)絡(luò)容量超出數(shù)據(jù)量能支撐的信息量模型開始背訓(xùn)練集的噪聲。另一個(gè)隱蔽原因是按時(shí)間切分后測試集時(shí)段恰好包含節(jié)假日或極端天氣分布和訓(xùn)練集差異大模型沒見過這種特征組合預(yù)測自然崩。解決EarlyStopping已經(jīng)能擋住一部分過擬合再把Dropout從0.1提到0.2到0.3或者把隱層節(jié)點(diǎn)從64/32降到32/16。檢查特征里有沒有節(jié)假日和星期類型標(biāo)記數(shù)據(jù)幾年的跨度內(nèi)節(jié)假日分布是否均勻。數(shù)據(jù)量不夠時(shí)正則化比加層更管用先把網(wǎng)絡(luò)變小再談精度。另外訓(xùn)練集和測試集的MAPE差距超過三倍基本就是過擬合別猶豫直接減容量。4.4 Windows環(huán)境下msvcp140.dll缺失導(dǎo)致代碼跑不起來現(xiàn)象pip install tensorflow裝完import tensorflow直接報(bào)錯(cuò)“由于找不到msvcp140.dll無法繼續(xù)執(zhí)行代碼”重裝包、換虛擬環(huán)境都解決不了。原因TensorFlow在Windows下依賴VC運(yùn)行庫msvcp140.dll就是運(yùn)行庫的組成部分。報(bào)這個(gè)錯(cuò)不是pip包壞了也不是代碼問題是系統(tǒng)層面缺了運(yùn)行庫。解決安裝Microsoft Visual C Redistributable選x64版本裝完重啟Python解釋器即可。這個(gè)坑在新裝系統(tǒng)的機(jī)器上特別常見復(fù)現(xiàn)代碼操作視頻時(shí)也經(jīng)??ㄔ谶@里。排查技巧是看報(bào)錯(cuò)缺少的具體dll文件名msvcp140.dll或vcruntime140.dll都屬于運(yùn)行庫不要?jiǎng)h包重裝浪費(fèi)時(shí)間的可能性很大。4.5 歸一化泄漏用全量數(shù)據(jù)統(tǒng)計(jì)量做標(biāo)準(zhǔn)化是隱藏作弊現(xiàn)象離線測試MAPE 4%上線后MAPE變成12%代碼一模一樣數(shù)據(jù)格式也沒變。原因離線階段如果對全量數(shù)據(jù)fit了MinMaxScaler再切分標(biāo)準(zhǔn)化用的min和max已經(jīng)包含了測試集的信息模型在訓(xùn)練時(shí)等于偷看過測試邊界。上線后新數(shù)據(jù)的負(fù)荷超出訓(xùn)練min/max范圍被scaler截?cái)嘣谶吔缟项A(yù)測值系統(tǒng)性偏移。另一種更隱蔽的泄漏來自滑窗重疊相鄰樣本共享大量歷史點(diǎn)測試集和訓(xùn)練集時(shí)間上相鄰時(shí)評估結(jié)果天然偏樂觀。解決嚴(yán)格按3.2節(jié)的順序先切分再對訓(xùn)練集fit測試集只transform。把scaler_x和scaler_y用joblib保存下來預(yù)測腳本里load回來。檢查泄漏最快的方法是重新訓(xùn)練時(shí)把時(shí)間順序打亂如果測試集指標(biāo)反而變好說明原評估有泄漏。評估時(shí)如果發(fā)現(xiàn)第一周誤差大、后面誤差小也按“每N個(gè)樣本取一個(gè)”的稀疏方式重做測試集。提示歸一化泄漏沒有后悔藥只能重訓(xùn)重評。上線前保存scaler、保存訓(xùn)練集的min/max邊界是數(shù)據(jù)泄漏的兜底保險(xiǎn)。5. 負(fù)荷預(yù)測的進(jìn)階驗(yàn)證滾動(dòng)預(yù)測、誤差閾值與視頻學(xué)習(xí)的正確順序5.1 滾動(dòng)預(yù)測與多步預(yù)測BP在這兩類任務(wù)里的邊界BP做多步預(yù)測有兩條路遞歸預(yù)測把上一個(gè)預(yù)測值拼進(jìn)輸入特征繼續(xù)跑下一個(gè)點(diǎn)實(shí)現(xiàn)簡單但誤差會逐點(diǎn)累積預(yù)測步數(shù)越多曲線越飄直接預(yù)測把輸出層節(jié)點(diǎn)數(shù)改成目標(biāo)步數(shù)一次輸出未來24個(gè)負(fù)荷點(diǎn)峰值形狀保留得更好但輸出維度變大需要更多樣本支撐。我的邊界判斷是未來1到3小時(shí)用遞歸BP沒問題未來24小時(shí)用直接預(yù)測超過一周的負(fù)荷預(yù)測不建議硬用BP換統(tǒng)計(jì)方法或樹模型看趨勢更穩(wěn)妥。5.2 跟著代碼操作視頻復(fù)現(xiàn)時(shí)的三個(gè)建議這類負(fù)荷預(yù)測的代碼操作視頻通常覆蓋環(huán)境搭建、數(shù)據(jù)讀取、網(wǎng)絡(luò)訓(xùn)練、結(jié)果畫圖四個(gè)環(huán)節(jié)。我建議按這個(gè)順序走一遍不要急著改網(wǎng)絡(luò)結(jié)構(gòu)。第一先把csv格式和代碼對齊日期列的解析最常出問題parse_dates解析失敗會得到全NaN。第二跑通后把window、horizon、batch_size各改一次觀察loss曲線和預(yù)測曲線的變化這是理解BP參數(shù)最快的方式。第三看完視頻一定要自己補(bǔ)做4.5節(jié)的數(shù)據(jù)泄漏檢查——視頻為了演示效果經(jīng)常省略這步復(fù)現(xiàn)出來的漂亮指標(biāo)在真實(shí)業(yè)務(wù)里不成立。這套滑窗、歸一化、切分、評估的代碼骨架和python量化交易策略代碼里的特征構(gòu)造套路幾乎一樣跑通后換個(gè)數(shù)據(jù)集就是另一個(gè)時(shí)序預(yù)測項(xiàng)目。我第一次做負(fù)荷預(yù)測時(shí)就是全量數(shù)據(jù)歸一化然后直接開訓(xùn)測試集MAPE漂亮得發(fā)假上線后一周掉到16%。后來查了兩天才發(fā)現(xiàn)是scaler在偷看數(shù)據(jù)。現(xiàn)在我的習(xí)慣是先檢查歸一化邊界再檢查預(yù)測曲線有沒有滯后最后才信誤差指標(biāo)。這套習(xí)慣是從那些翻車夜換來的希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取