電功率預(yù)測(cè)實(shí)戰(zhàn):從定階、擬合到多步預(yù)測(cè)與避坑指南)
簡(jiǎn)介面向風(fēng)電功率預(yù)測(cè)研究者和工程師的AMRA算法Matlab實(shí)現(xiàn)資源針對(duì)風(fēng)速、風(fēng)向、溫度、湍流強(qiáng)度等多變量影響下的功率預(yù)測(cè)問(wèn)題完整覆蓋數(shù)據(jù)清洗、插值標(biāo)準(zhǔn)化、特征構(gòu)造、多元回歸建模、交叉驗(yàn)證與結(jié)果可視化等關(guān)鍵環(huán)節(jié)。壓縮包共6個(gè)文件含3個(gè).mat示例數(shù)據(jù)、2個(gè).m核心算法腳本及1個(gè)rar附加壓縮包整體僅129KB輕量緊湊其中.m腳本實(shí)現(xiàn)模型訓(xùn)練與預(yù)測(cè)主流程.mat數(shù)據(jù)可直接加載用于實(shí)驗(yàn)復(fù)現(xiàn)rar內(nèi)為補(bǔ)充參考內(nèi)容。資源已有254人學(xué)習(xí)下載適合需要對(duì)照AMRA與ARIMA等模型效果、深入理解回歸預(yù)測(cè)流程的初學(xué)者和研究人員。通過(guò)內(nèi)置數(shù)據(jù)與Matlab函數(shù)可直觀查看預(yù)測(cè)曲線與實(shí)際值的對(duì)比并在真實(shí)風(fēng)電場(chǎng)景中調(diào)整滯后值、滑動(dòng)窗口和模型參數(shù)完成從數(shù)據(jù)預(yù)處理到預(yù)測(cè)評(píng)估的完整實(shí)驗(yàn)為后續(xù)優(yōu)化和算法擴(kuò)展提供實(shí)用基礎(chǔ)。1. 風(fēng)電功率預(yù)測(cè)為什么繞不開(kāi) AMRA先看懂它解決的三個(gè)痛點(diǎn)上一套風(fēng)電場(chǎng)預(yù)測(cè)模型在并網(wǎng)考核里連續(xù)三個(gè)月誤差超限調(diào)度打電話來(lái)問(wèn)原因。氣象預(yù)報(bào)給的風(fēng)速曲線和實(shí)際偏差超過(guò) 2.5 m/s模型全線跑偏。后來(lái)?yè)Q用 amra 這套自回歸滑動(dòng)平均思路從歷史功率序列自身挖記憶結(jié)構(gòu)才把短期預(yù)測(cè)撐住。AMRA 的核心邏輯很簡(jiǎn)單不跟天氣預(yù)報(bào)較勁而是把風(fēng)速變化在功率序列里留下的“慣性”和“沖擊響應(yīng)”分別建模用過(guò)去若干個(gè)采樣點(diǎn)的功率和誤差滾動(dòng)預(yù)測(cè)未來(lái)功率。它解決的三個(gè)實(shí)際問(wèn)題一是功率曲線的非平穩(wěn)特性二是陣風(fēng)/甩負(fù)荷造成的沖擊項(xiàng)三是多步預(yù)測(cè)時(shí)的誤差累積。適合正在做風(fēng)電場(chǎng)功率申報(bào)、調(diào)峰調(diào)頻、以及 SCADA 數(shù)據(jù)二次開(kāi)發(fā)的工程師。下面的章節(jié)從建模原理講起一直落到定階、擬合、多步預(yù)測(cè)和六個(gè)真實(shí)的翻車現(xiàn)場(chǎng)。2. 先立住 AMRA 的建模邏輯自回歸、滑動(dòng)平均與預(yù)處理管線2.1 AMRA 的結(jié)構(gòu)拆解AR 項(xiàng)、MA 項(xiàng)和風(fēng)電場(chǎng)景下的變體風(fēng)電功率序列的典型表現(xiàn)是相鄰時(shí)刻相關(guān)性較強(qiáng)但疊加了陣風(fēng)、切機(jī)、限功率等隨機(jī)沖擊。AMRA 在這個(gè)場(chǎng)景里可以理解為帶滑動(dòng)平均修正的自回歸模型核心數(shù)學(xué)形式是y_t c Σ(φ_i * y_(t-i)) Σ(θ_j * ε_(tái)(t-j)) ε_(tái)t其中y_t是 t 時(shí)刻功率φ_i是自回歸項(xiàng)系數(shù)回想前 i 個(gè)時(shí)刻的功率對(duì)當(dāng)前時(shí)刻的影響θ_j是滑動(dòng)平均項(xiàng)系數(shù)對(duì)應(yīng)前 j 個(gè)時(shí)刻預(yù)測(cè)誤差對(duì)當(dāng)前預(yù)測(cè)的修正ε_(tái)t是當(dāng)前時(shí)刻不可解釋的隨機(jī)沖擊。風(fēng)電功率的特性決定了 AR 項(xiàng)能捕捉風(fēng)輪慣性和風(fēng)場(chǎng)平抑后的慢變趨勢(shì)MA 項(xiàng)則吸收陣風(fēng)波動(dòng)、AGC 指令變化等短時(shí)沖擊。選型理由也很直接相比 LSTM、Transformer 這類黑匣子AMRA 參數(shù)個(gè)數(shù)只有 pq1 個(gè)幾秒鐘就能完成擬合而且每個(gè)系數(shù)都有可解釋的物理對(duì)應(yīng)關(guān)系。對(duì)風(fēng)電場(chǎng)側(cè)的資源受限監(jiān)控終端來(lái)說(shuō)這個(gè)復(fù)雜度部署起來(lái)壓力很小。實(shí)際工程里不少風(fēng)場(chǎng)短期預(yù)測(cè)系統(tǒng)把“預(yù)測(cè)功率歸一化到額定容量后跑 ARMA(p,q)”作為核心模塊這是經(jīng)過(guò)工程檢驗(yàn)的通用做法。2.2 風(fēng)電原始數(shù)據(jù)的預(yù)處理異常點(diǎn)識(shí)別與缺失值插補(bǔ)直接從 SCADA 導(dǎo)出的功率序列沒(méi)法直接用。常見(jiàn)問(wèn)題有三個(gè)變槳限功率時(shí)段數(shù)據(jù)整體偏低、通信中斷產(chǎn)生長(zhǎng)段缺失、功率傳感器毛刺導(dǎo)致尖峰。我一般先用滑窗中位數(shù)做異常識(shí)別把偏離局部中位數(shù)超過(guò) 3 倍標(biāo)準(zhǔn)差的點(diǎn)標(biāo)記為異常做空值處理。缺失值插補(bǔ)分兩種場(chǎng)景單點(diǎn)缺失用線性插值長(zhǎng)段缺失超過(guò) 10 個(gè)采樣點(diǎn)用同時(shí)間段歷史平均替代。下面這段代碼實(shí)現(xiàn)了異常點(diǎn)識(shí)別和插補(bǔ)import pandas as pd import numpy as np def preprocess_wind_power(df, colpower, window12, zscore_thresh3.0): data df[col].copy() # 滑窗中位數(shù)與標(biāo)準(zhǔn)差 rolling_median data.rolling(windowwindow, centerTrue).median() rolling_std data.rolling(windowwindow, centerTrue).std() # 標(biāo)記異常點(diǎn)偏離局部中位數(shù)過(guò)大 diff (data - rolling_median).abs() anomaly diff (zscore_thresh * rolling_std) # 異常點(diǎn)置空再做插補(bǔ) data[anomaly] np.nan # 不超過(guò)10個(gè)點(diǎn)的缺失用線性插補(bǔ) if data.isna().sum() 10: data data.interpolate(methodlinear) else: # 長(zhǎng)段缺失用同點(diǎn)位歷史平均填充 hist_mean df[col].groupby(df.index.hour).transform(mean) data data.fillna(hist_mean) return data這段代碼里window12對(duì)應(yīng) 10 分鐘采樣下的 2 小時(shí)窗口覆蓋風(fēng)電功率的自然波動(dòng)周期zscore_thresh3.0是經(jīng)驗(yàn)閾值限功率時(shí)段的出力平臺(tái)段因?yàn)槌掷m(xù)偏低不會(huì)被誤判為異常而通信尖峰會(huì)明顯偏離局部中位數(shù)會(huì)被摘出來(lái)。長(zhǎng)段缺失用groupby(df.index.hour)的好處是保留日內(nèi)的風(fēng)功率規(guī)律避免填充值破壞序列的時(shí)序結(jié)構(gòu)。預(yù)處理之后還要做一次可視化確認(rèn)把原始曲線和清洗后的曲線疊加重點(diǎn)看爬坡段有沒(méi)有被插補(bǔ)抹平。風(fēng)電預(yù)測(cè)最怕的就是把爬坡特征抹掉那樣模型學(xué)不到有用的動(dòng)態(tài)信息。2.3 平穩(wěn)性檢驗(yàn)與差分ADF 與一階差分AMRA 的前提是序列平穩(wěn)。風(fēng)電功率原始序列有明顯的天氣尺度趨勢(shì)和日內(nèi)波動(dòng)直接用會(huì)導(dǎo)致偽回歸也就是擬合優(yōu)度很高、預(yù)測(cè)卻完全失效。工程上先用 ADFAugmented Dickey-Fuller檢驗(yàn)做平穩(wěn)性判斷。from statsmodels.tsa.stattools import adfuller def check_stationarity(series): adf_stat, p_value, used_lag, nobs, crit_values, icbest adfuller( series, regressionc, autolagAIC ) print(fADF Statistic: {adf_stat:.4f}) print(fp-value: {p_value:.4f}) for key, value in crit_values.items(): print(fCritical value ({key}): {value:.4f}) if p_value 0.05: print(結(jié)論序列平穩(wěn)可直接建模。) return 0 else: print(結(jié)論非平穩(wěn)需要差分。) return 1判斷標(biāo)準(zhǔn)看 p-value小于 0.05 拒絕非平穩(wěn)假設(shè)序列可以直接建模大于 0.05 則需要做一階差分。風(fēng)電功率在多數(shù)情況下不是一次差分就完全平穩(wěn)的因?yàn)樘鞖膺^(guò)程的移入移出會(huì)讓均值和方差緩慢漂移但一階差分后的序列通常能通過(guò)檢驗(yàn)。差分次數(shù)不要貪多差分一次后用 ACF/PACF 看一眼拖尾形態(tài)如果還算收斂就停在一階差分過(guò)度差分會(huì)把低頻能量抹掉反而讓模型在預(yù)測(cè)時(shí)失去方向感。3. AMRA 建模仿真的完整流程定階、參數(shù)擬合與滾動(dòng)預(yù)測(cè)3.1 數(shù)據(jù)劃分與歸一化訓(xùn)練集、驗(yàn)證集和反歸一化風(fēng)電功率建模的樣本劃分必須按時(shí)間順序不能隨機(jī)打亂。原因是序列存在自相關(guān)打亂會(huì)讓訓(xùn)練集泄漏未來(lái)信息驗(yàn)證集指標(biāo)虛高。我常用的劃分比例是前 70% 做訓(xùn)練中間 15% 做驗(yàn)證最后 15% 做測(cè)試并且測(cè)試段必須包含至少一次完整的風(fēng)速爬坡和切機(jī)事件否則預(yù)測(cè)能力沒(méi)有說(shuō)服力。歸一化這里有個(gè)工程細(xì)節(jié)用 MinMaxScaler 把功率縮放到 [0,1]但每一天都要監(jiān)控訓(xùn)練集的最大值。風(fēng)電場(chǎng)的額定容量是已知的我一般直接用額定功率做分母而不是用訓(xùn)練集最大值。因?yàn)橛?xùn)練集最大值可能來(lái)自限功率前的高風(fēng)時(shí)段用它做歸一化會(huì)把正常范圍的功率壓縮到很小區(qū)間預(yù)測(cè)誤差被放大。反歸一化時(shí)對(duì)應(yīng)乘回額定功率即可。from sklearn.preprocessing import MinMaxScaler import numpy as np def build_train_test(series, train_ratio0.7, val_ratio0.15): total len(series) train_end int(total * train_ratio) val_end int(total * (train_ratio val_ratio)) df pd.DataFrame({power: series}) scaler MinMaxScaler(feature_range(0, 1)) # 使用額定容量歸一化而不是訓(xùn)練集最大值 df[power_scaled] df[power] / 1500.0 # 假設(shè)額定功率1500kW train df.iloc[:train_end] val df.iloc[train_end:val_end] test df.iloc[val_end:] return train, val, test, scaler注意注釋里寫(xiě)了額定功率 1500kW 的例子實(shí)際項(xiàng)目里直接把風(fēng)機(jī)銘牌功率填進(jìn)去。分段后的訓(xùn)練集和驗(yàn)證集都保留了完全的時(shí)間順序后續(xù)擬合時(shí)不交叉驗(yàn)證結(jié)果才可信。反歸一化就是把預(yù)測(cè)值乘回 1500.0不做這個(gè)操作模型輸出的 RMSE 會(huì)小得離譜但那是假象。3.2 基于 ACF/PACF 與 AIC/BIC 的模型定階定階是 AMRA 建模最依賴經(jīng)驗(yàn)的一步。ACF自相關(guān)函數(shù)決定 MA 項(xiàng)的階數(shù) qPACF偏自相關(guān)函數(shù)決定 AR 項(xiàng)的階數(shù) p。風(fēng)電功率序列的典型表現(xiàn)是ACF 緩慢衰減說(shuō)明序列即便差分后仍帶較強(qiáng)的持續(xù)性PACF 在滯后 1 或 2 處出現(xiàn)截尾后跌入置信區(qū)間。不過(guò)只靠看圖定階不保險(xiǎn)。遇到實(shí)際工程數(shù)據(jù)我更常用 AIC/BIC 在候選區(qū)間內(nèi)掃描。候選范圍按經(jīng)驗(yàn)設(shè)置p 在 0~5q 在 0~5。掃描代碼import itertools from statsmodels.tsa.arima.model import ARIMA import warnings warnings.filterwarnings(ignore) def select_order(train_series, max_p5, max_q5): results [] for p, q in itertools.product(range(max_p 1), range(max_q 1)): try: model ARIMA(train_series, order(p, 0, q)) fit model.fit() results.append({ p: p, q: q, AIC: fit.aic, BIC: fit.bic }) except Exception: continue df_res pd.DataFrame(results).sort_values(AIC) return df_res.head(10)運(yùn)行后輸出 AIC/BIC 排前三的組合再結(jié)合 ACF/PACF 圖的直觀判斷做最終選擇。經(jīng)驗(yàn)法則是如果 AIC 最小和政治家次序的 p、q 之間差異小于 2選參數(shù)更少的那組如果 BIC 和 AIC 的最優(yōu)結(jié)果不一致優(yōu)先信 BIC因?yàn)?BIC 對(duì)參數(shù)個(gè)數(shù)懲罰更重更不容易過(guò)擬合。風(fēng)電數(shù)據(jù)樣本量通常不算大BIC 的保守傾向更貼合工程現(xiàn)實(shí)。3.3 參數(shù)擬合與單步預(yù)測(cè)最小二乘與殘差檢查定階完成后進(jìn)入擬合階段。statsmodels 的 ARIMA 在order(p, d, q)中指定差分階數(shù)這里d0是因?yàn)閿?shù)據(jù)已經(jīng)做了預(yù)處理和差分。擬合完成后立刻檢查兩件事擬合殘差是否接近白噪聲、以及單步預(yù)測(cè)的 RMSE 是否在可接受區(qū)間。def fit_arma_and_predict(train_series, val_series, p2, q2, forecast_steps24): model ARIMA(train_series, order(p, 0, q)) fit model.fit() # 單步滾動(dòng)預(yù)測(cè)驗(yàn)證 history list(train_series) predictions [] for t in range(len(val_series)): model ARIMA(history, order(p, 0, q)) fit model.fit() yhat fit.forecast(steps1)[0] predictions.append(yhat) history.append(val_series.iloc[t]) rmse np.sqrt(np.mean((np.array(predictions) - val_series.values) ** 2)) return fit, predictions, rmse這段代碼里forecast_steps1做單步滾動(dòng)預(yù)測(cè)每一步都把真實(shí)值重新放進(jìn)歷史序列。這種“每次只預(yù)測(cè)下一步、用真值更新”的方式用于驗(yàn)證模型的單步能力實(shí)際生產(chǎn)里如果要做未來(lái) 4 小時(shí)預(yù)測(cè)則換成多步預(yù)測(cè)策略。誤差指標(biāo)只看 RMSE 并不夠還要對(duì)比 MAPE 和預(yù)測(cè)偏差方向。如果模型系統(tǒng)性偏低或偏高多半是訓(xùn)練集里限功率樣本占比失衡這會(huì)在第 5 章詳述。擬合后務(wù)必打印殘差 ACF 圖如果滯后 1 處出現(xiàn)顯著自相關(guān)說(shuō)明 p 或 q 階數(shù)不夠需要回頭加階。4. 從單步到多步預(yù)測(cè)窗口、誤差修正與區(qū)間估計(jì)4.1 多步預(yù)測(cè)的三種策略遞推、直接和多輸出風(fēng)電功率預(yù)測(cè)真正要解決的是未來(lái) 1~4 小時(shí)甚至 24 小時(shí)的功率曲線。多步預(yù)測(cè)的工程策略有三種遞推法、直接法和多輸出法。遞推法就是把第 h 步的預(yù)測(cè)當(dāng)作已知輸入一步步向后推做法簡(jiǎn)單但誤差會(huì)累積直接法是為每個(gè)預(yù)測(cè)步長(zhǎng)單獨(dú)訓(xùn)練一個(gè)模型誤差不傳遞但需要維護(hù)多套模型多輸出法用一個(gè)模型同時(shí)輸出多個(gè)時(shí)點(diǎn)的預(yù)測(cè)效率最高但模型復(fù)雜度上升。三者的取舍如下表。策略優(yōu)勢(shì)劣勢(shì)推薦場(chǎng)景遞推法實(shí)現(xiàn)簡(jiǎn)單、模型量少誤差隨步長(zhǎng)累積預(yù)測(cè)窗口小于 6 步直接法每步誤差獨(dú)立需要訓(xùn)練 12/24 個(gè)模型工程繁瑣預(yù)測(cè)窗口 12 步以上多輸出法一次建模、效率高模型內(nèi)部相關(guān)性處理復(fù)雜步長(zhǎng)固定且調(diào)度系統(tǒng)要求嚴(yán)格實(shí)盤里我常用直接法和遞推法的混合方案前 6 步用遞推第 7 步到第 48 步切成若干個(gè)直接法模型。這樣做既避免了前期誤差快速膨脹又讓遠(yuǎn)期的預(yù)測(cè)不至于完全偏離。代碼上遞推法就是上一節(jié)fit_arma_and_predict里把forecast_steps1改成forecast_stepsh然后每次把預(yù)測(cè)結(jié)果拼到歷史序列末尾。4.2 殘差補(bǔ)償讓預(yù)測(cè)曲線不再“平坦化”多步預(yù)測(cè)到了第 12 步以后ARMA 模型會(huì)逐漸向序列均值收斂預(yù)測(cè)曲線變成一條接近水平線的狀態(tài)這就是所謂的“平坦化”。原因是 AR 項(xiàng)的系數(shù)經(jīng)過(guò)多次迭代后遠(yuǎn)期狀態(tài)對(duì)初始信息的敏感度指數(shù)衰減。緩解辦法不是調(diào)高階數(shù)而是對(duì)殘差做二次建模。具體做法擬合訓(xùn)練集殘差序列提取其中仍然帶自相關(guān)的部分用 EWMA指數(shù)加權(quán)移動(dòng)平均擬合殘差的趨勢(shì)項(xiàng)疊加到預(yù)測(cè)值上。實(shí)現(xiàn)如下def ewma_error_correction(predictions, resid_series, alpha0.3): error_model resid_series.ewm(alphaalpha, adjustFalse).mean() error_forecast error_model.iloc[-1] corrected [] for pred in predictions: corrected.append(pred error_forecast) error_forecast * (1 - alpha) return np.array(corrected)alpha0.3表示對(duì)近期殘差變化的敏感度數(shù)值越接近 1補(bǔ)償項(xiàng)跟隨殘差越快風(fēng)電功率預(yù)測(cè)中 alpha 取 0.2~0.3 比較穩(wěn)因?yàn)闅埐钪邪拇蟛糠质请S機(jī)噪聲過(guò)高的 alpha 會(huì)把噪聲也當(dāng)成趨勢(shì)補(bǔ)償進(jìn)去反而增加方差。這個(gè)技巧在爬坡段的預(yù)測(cè)效果尤其明顯能推遲曲線趨平的時(shí)間點(diǎn)大約 3~5 個(gè)步長(zhǎng)。4.3 預(yù)測(cè)區(qū)間給調(diào)度留出裕度調(diào)度側(cè)要的不是一條單值預(yù)測(cè)曲線而是一個(gè)可信區(qū)間。風(fēng)電功率的預(yù)測(cè)誤差不是均勻分布的低風(fēng)速段誤差小、高風(fēng)速段誤差大區(qū)間寬度也應(yīng)該隨之調(diào)整。工程常用做法是把殘差按功率水平分段統(tǒng)計(jì)每個(gè)段的殘差標(biāo)準(zhǔn)差預(yù)測(cè)時(shí)按當(dāng)前功率點(diǎn)查對(duì)應(yīng)段的標(biāo)準(zhǔn)差構(gòu)造 90% 區(qū)間。def prediction_interval(predictions, actuals, power_bins, prob0.90): z_score 1.645 df pd.DataFrame({pred: predictions, actual: actuals}) df[bin] pd.cut(df[pred], binspower_bins, labelsFalse) std_map df.groupby(bin)[actual].apply( lambda x: np.sqrt(np.mean((x - df.loc[x.index, pred]) ** 2)) ) intervals [] for i, pred in enumerate(predictions): bin_idx pd.cut([pred], binspower_bins, labelsFalse)[0] std_val std_map.get(bin_idx, 0.05) intervals.append((pred - z_score * std_val, pred z_score * std_val)) return intervals這里的power_bins建議按額定功率的 0~0.2、0.2~0.4、0.4~0.6、0.6~0.8、0.8~1.0 五檔切分。每組的標(biāo)準(zhǔn)差單獨(dú)計(jì)算如果某組樣本太少比如低風(fēng)速段長(zhǎng)期缺數(shù)據(jù)就用全局標(biāo)準(zhǔn)差兜底。調(diào)度側(cè)拿到 90% 區(qū)間后做備用容量申報(bào)既不會(huì)過(guò)度預(yù)留也不至于風(fēng)險(xiǎn)裸奔。5. AMRA 風(fēng)電預(yù)測(cè)中的常見(jiàn)坑六個(gè)翻車現(xiàn)場(chǎng)與排查建議5.1 數(shù)據(jù)側(cè)的坑訓(xùn)練集混入限功率樣本現(xiàn)象模型在驗(yàn)證集上的損失看起來(lái)很漂亮但實(shí)際預(yù)測(cè)出的功率總是偏低尤其在正常出力時(shí)段預(yù)報(bào)值比實(shí)際值低 10%~15%。原因訓(xùn)練集里混入大量限功率和棄風(fēng)時(shí)段的樣本模型學(xué)習(xí)到的“平均出力水平”被拉低。限功率時(shí)段的功率是調(diào)度指令壓低的結(jié)果不是氣象驅(qū)動(dòng)的真實(shí)功率把它們當(dāng)作正常樣本訓(xùn)練模型就把“低出力”當(dāng)成了常態(tài)。解決在預(yù)處理階段把限功率樣本識(shí)別出來(lái)直接剔除或單獨(dú)打標(biāo)記。識(shí)別方法是檢查同一時(shí)刻的槳距角、變流器有功指令如果功率持續(xù)保持在限值附近且風(fēng)速明顯高于該功率對(duì)應(yīng)的等效風(fēng)速判定為限功率。剔除后重新統(tǒng)計(jì)訓(xùn)練集的風(fēng)速-功率分布確保覆蓋完整的出力區(qū)間。5.2 定階側(cè)的坑差分過(guò)度把信號(hào)差成噪聲現(xiàn)象一階差分后發(fā)現(xiàn) ACF 還是拖尾機(jī)械地再做一次差分然后把所有階數(shù)交給 AIC 自動(dòng)搜索。結(jié)果模型擬合得很好但預(yù)測(cè)輸出幾乎是一條直線。原因第二次差分把序列中本來(lái)就弱的低頻趨勢(shì)徹底抹掉模型面對(duì)的是一個(gè)近似白噪聲的序列自回歸項(xiàng)無(wú)從學(xué)習(xí)預(yù)測(cè)值自然回歸到均值附近。解決差分次數(shù)最多不要超過(guò)一次。第二次差分后需要重新繪制序列圖確認(rèn)曲線仍然具有可辨識(shí)的波動(dòng)結(jié)構(gòu)如果看起來(lái)純隨機(jī)就回到一階差分后的數(shù)據(jù)建模不要為了過(guò)平穩(wěn)性檢驗(yàn)而反復(fù)差分。5.3 定階側(cè)的坑AIC 選出的階數(shù)過(guò)擬合現(xiàn)象AIC 自動(dòng)掃描給出 p5、q5 的組合訓(xùn)練集誤差顯著下降但驗(yàn)證集誤差升高模型對(duì)新數(shù)據(jù)的適應(yīng)能力變差。原因AIC 對(duì)參數(shù)數(shù)量的懲罰在樣本量較小時(shí)太弱風(fēng)電數(shù)據(jù)樣本通常只有幾千個(gè)點(diǎn)參數(shù)一多就發(fā)生過(guò)擬合。解決把 AIC 換成 BIC 做最終決策或在 AIC 結(jié)果上強(qiáng)加 pq 上限不超過(guò) 5 的經(jīng)驗(yàn)約束。對(duì)比多組階數(shù)的驗(yàn)證集 RMSE選擇驗(yàn)證誤差最小而不是訓(xùn)練誤差最小的組合。5.4 多步預(yù)測(cè)側(cè)的坑遞推誤差累積導(dǎo)致曲線趨平現(xiàn)象用遞推法預(yù)測(cè)未來(lái) 24 個(gè)點(diǎn)前 6 步誤差在可接受范圍第 10 步之后預(yù)測(cè)值不再隨實(shí)際波動(dòng)穩(wěn)定在同一水平線上。原因每一步預(yù)測(cè)誤差都會(huì)作為下一步的輸入模型對(duì)噪聲的放大效應(yīng)在持續(xù)疊加最終壓制了信號(hào)成分預(yù)測(cè)均值回歸到序列歷史均值。解決改用直接法為每個(gè)預(yù)測(cè)步長(zhǎng)建立獨(dú)立模型或者用第 4.2 節(jié)的 EWMA 殘差補(bǔ)償。同時(shí)檢查預(yù)測(cè)窗口長(zhǎng)度是否合理超過(guò)模型有效記憶范圍的預(yù)測(cè)要直接放棄改用統(tǒng)計(jì)爬坡概率的方式補(bǔ)充。5.5 評(píng)估側(cè)的坑統(tǒng)一用 MAPE 在低功率時(shí)段失真現(xiàn)象MAPE 指標(biāo)很差但視覺(jué)上看預(yù)測(cè)曲線跟實(shí)際貼合調(diào)度也沒(méi)意見(jiàn)。反過(guò)來(lái)另一份報(bào)告的 MAPE 很好看預(yù)測(cè)效果實(shí)際一塌糊涂。原因MAPE 在功率接近零的時(shí)段夜間低風(fēng)速會(huì)因分母極小被放大個(gè)別離群點(diǎn)會(huì)拉爆整個(gè)指標(biāo)。風(fēng)電功率在 0 附近常駐直接算 MAPE 容易誤判模型質(zhì)量。解決按功率區(qū)間分段評(píng)估重點(diǎn)只看 20%~80% 額定功率區(qū)間的預(yù)測(cè)誤差低功率區(qū)間用 MAE 代替同時(shí)統(tǒng)一所有對(duì)比模型的評(píng)估口徑避免 A 用容量歸一化、B 用實(shí)際功率做分母二者結(jié)果不可比。5.6 評(píng)估側(cè)的坑殘差自相關(guān)明顯但模型“通過(guò)”現(xiàn)象RMSE 和 MAE 都達(dá)標(biāo)但殘差序列的自相關(guān)函數(shù)在滯后 1~5 處仍然顯著非零模型看起來(lái)通過(guò)了所有數(shù)值指標(biāo)。原因ARMA 模型的理論假設(shè)是殘差為白噪聲殘差還有自相關(guān)說(shuō)明模型的動(dòng)態(tài)結(jié)構(gòu)沒(méi)有完全捕獲p、q 階數(shù)偏低或者存在周期性未處理。解決擬合后強(qiáng)制生成殘差 ACF/PACF 圖并做 Ljung-Box 檢驗(yàn)p 值小于 0.05 時(shí)必須回到定階環(huán)節(jié)重新調(diào)整。這個(gè)步驟不能省它是判斷模型是否合格的唯一可靠依據(jù)。6. 最后一步驗(yàn)證滾動(dòng)回測(cè)與殘差白噪聲檢驗(yàn)6.1 滾動(dòng)回測(cè)框架模型上線前用滾動(dòng)回測(cè)完整模擬一遍未來(lái)多步預(yù)測(cè)過(guò)程。做法是把測(cè)試集按窗口滑動(dòng)每次只取過(guò)去 N 個(gè)點(diǎn)訓(xùn)練模型預(yù)測(cè)未來(lái) H 個(gè)點(diǎn)然后窗口前移反復(fù)執(zhí)行。這樣可以確保模型評(píng)估不是在“看過(guò)答案”的情況下進(jìn)行的。代碼框架def rolling_backtest(series, p, q, h12, window240): errors [] for start in range(0, len(series) - window - h, h): train series.iloc[start:start window] test series.iloc[start window:start window h] model ARIMA(train, order(p, 0, q)).fit() pred model.forecast(stepsh) rmse np.sqrt(np.mean((pred - test.values) ** 2)) errors.append(rmse) return np.mean(errors), np.std(errors)window240對(duì)應(yīng) 10 分鐘粒度下 40 小時(shí)的歷史訓(xùn)練數(shù)據(jù)比較符合風(fēng)電功率預(yù)測(cè)對(duì)記憶長(zhǎng)度的需求steph表示每預(yù)測(cè)完一輪就跳過(guò) H 個(gè)點(diǎn)減少計(jì)算量同時(shí)保留不重疊驗(yàn)證的統(tǒng)計(jì)獨(dú)立性。最終輸出均值和標(biāo)準(zhǔn)差均值代表整體精度標(biāo)準(zhǔn)差反映預(yù)測(cè)性能在不同天氣狀態(tài)下的穩(wěn)定性后者往往比前者更值得關(guān)注。6.2 Ljung-Box 殘差白噪聲檢驗(yàn)?zāi)P秃细衽c否最終看殘差是否變成白噪聲。Ljung-Box 檢驗(yàn)統(tǒng)計(jì)殘差序列在給定滯后范圍內(nèi)的自相關(guān)總和p 值高于 0.05 表示沒(méi)有顯著自相關(guān)模型信息提取干凈。from statsmodels.stats.diagnostic import acorr_ljungbox def check_residual_whiteness(resid, lags10): lb_value, lb_pvalue acorr_ljungbox(resid, lags[lags], return_dfTrue).values[0] print(fLjung-Box p-value: {lb_pvalue:.4f}) return lb_pvalue 0.05這步配合滾動(dòng)回測(cè)一起做每隔幾輪就取一段預(yù)測(cè)殘差跑一次檢驗(yàn)。我做風(fēng)電功率預(yù)測(cè)項(xiàng)目時(shí)吃過(guò)一次虧當(dāng)時(shí)模型的 RMSE 比基線模型低了 12%以為勝券在握結(jié)果 Ljung-Box 檢驗(yàn)發(fā)現(xiàn)殘差在滯后 3 處有顯著自相關(guān)說(shuō)明還有一個(gè)日內(nèi)周期沒(méi)建模。后來(lái)在預(yù)處理里加了小時(shí)級(jí)差分才把殘差漂白。從那以后我每次切換數(shù)據(jù)集都強(qiáng)制走一遍 ADF 檢驗(yàn)、Ljung-Box 檢驗(yàn)和滾動(dòng)回測(cè)三件套少一個(gè)都不敢上線。這套流程放到你的 amra 風(fēng)電功率預(yù)測(cè)項(xiàng)目里同樣能幫你少踩兩個(gè)坑。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取