間序列預(yù)測(cè)實(shí)戰(zhàn):季節(jié)性模型參數(shù)搜索與調(diào)優(yōu)全解析)
簡(jiǎn)介這套壓縮包面向時(shí)間序列分析初學(xué)者與數(shù)據(jù)分析從業(yè)者提供基于SARIMA模型的完整實(shí)戰(zhàn)代碼與配套數(shù)據(jù)可用于掌握季節(jié)性數(shù)據(jù)的建模、調(diào)參與預(yù)測(cè)流程。包內(nèi)共7個(gè)文件以Python腳本、CSV數(shù)據(jù)集和IDE項(xiàng)目配置文件為主整體僅7KB體量輕便、便于快速下載使用。核心Python腳本覆蓋數(shù)據(jù)預(yù)處理、平穩(wěn)性檢查、參數(shù)搜索與模型選擇、訓(xùn)練評(píng)估及未來(lái)預(yù)測(cè)等關(guān)鍵環(huán)節(jié)CSV數(shù)據(jù)為典型的每日女性出生人數(shù)序列具有明顯季節(jié)性適合作為SARIMA建模練習(xí)樣例xml/iml等配置文件僅為開(kāi)發(fā)環(huán)境記錄不影響代碼運(yùn)行。資源已有978人學(xué)習(xí)下載通過(guò)對(duì)照代碼實(shí)操讀者能理解SARIMA中自回歸、差分、移動(dòng)平均及季節(jié)性成分的協(xié)同作用學(xué)會(huì)利用AIC/BIC等指標(biāo)篩選參數(shù)并可將這套方法遷移至銷(xiāo)量、客流等常見(jiàn)季節(jié)性預(yù)測(cè)場(chǎng)景具有較強(qiáng)的實(shí)踐參考價(jià)值。1. SARIMA 時(shí)間序列預(yù)測(cè)實(shí)戰(zhàn)為什么參數(shù)搜索才是真正的門(mén)檻把周一到周日的門(mén)店客流丟進(jìn) ARIMA擬合殘差里總有一周規(guī)律在跳動(dòng)——這就是 SARIMA 的出場(chǎng)時(shí)機(jī)。它比 ARIMA 多出來(lái)的那組參數(shù)專(zhuān)門(mén)負(fù)責(zé)把「整體趨勢(shì)」和「固定周期」拆開(kāi)建模適合日度、周度、月度數(shù)據(jù)里的季節(jié)規(guī)律明顯、但又需要快速出結(jié)果的業(yè)務(wù)場(chǎng)景。標(biāo)題里的「搜索調(diào)參」說(shuō)的是 p/d/q 和 P/D/Q 這 6 組滯后階數(shù)m 是周期長(zhǎng)度如周數(shù)據(jù) m7的確定方式六維網(wǎng)格手試太慢工程上常用自動(dòng)搜索在一個(gè)限定范圍內(nèi)跑再靠殘差診斷判斷能不能信。這套流程適合天天處理業(yè)務(wù)報(bào)表、用 pandas 洗數(shù)據(jù)但建模還靠人肉試參的從業(yè)者如果數(shù)據(jù)只有一兩個(gè)月SARIMA 的季節(jié)項(xiàng)會(huì)樣本不足這篇的排查清單也能幫你及時(shí)止損。2. SARIMA 參數(shù)體系拆解p/d/q 與 P/D/Q/m 各自在擬合什么2.1 多出來(lái)的一組參數(shù)在做什么從 ARIMA 到 SARIMAARIMA(p,d,q) 只做三件事p 用歷史觀測(cè)值d 做差分處理非平穩(wěn)趨勢(shì)q 用歷史誤差。它是把「昨天到今天」的慣性描述清楚。SARIMA 在此基礎(chǔ)上對(duì)「每隔 m 步」的關(guān)系再?gòu)?fù)制一套同樣的結(jié)構(gòu)寫(xiě)成 ARIMA(p,d,q)(P,D,Q)m。通俗點(diǎn)說(shuō)非季節(jié)部分處理的是相鄰數(shù)據(jù)點(diǎn)之間的慣性季節(jié)部分處理的是「上周三到今天周三」這種跨周期慣性。這兩套參數(shù)在擬合過(guò)程中是分開(kāi)計(jì)算的非季節(jié)項(xiàng)吸收趨勢(shì)和短周期波動(dòng)季節(jié)項(xiàng)吸收周期性重復(fù)。實(shí)際業(yè)務(wù)數(shù)據(jù)往往是兩者疊加——銷(xiāo)售額既跟著大環(huán)境緩慢上漲趨勢(shì)又跟著周末反復(fù)波動(dòng)周期。如果沒(méi)有季節(jié)項(xiàng)ARIMA 會(huì)把周期波動(dòng)誤當(dāng)成隨機(jī)噪聲的一部分導(dǎo)致殘差里留下明顯的周期性尖峰。怎么判斷數(shù)據(jù)需不需要 SARIMA最省事的方法是先跑一個(gè) ARIMA對(duì)殘差畫(huà) ACF 圖如果 lag7、14、21 附近出現(xiàn)明顯尖峰說(shuō)明周期沒(méi)被吃干凈。這個(gè)判斷不需要統(tǒng)計(jì)檢驗(yàn)肉眼掃一眼就夠。R 語(yǔ)言的 forecast 包里的 auto.arima 和 Python 的 pmdarima 用的是同一套搜索邏輯區(qū)別只在函數(shù)名和參數(shù)寫(xiě)法理解了這個(gè)模型結(jié)構(gòu)兩邊都能上手。2.2 季節(jié)周期 m 怎么定7、12 還是 52m 是 SARIMA 里唯一不靠搜索確定的參數(shù)它表示一個(gè)完整季節(jié)周期占多少個(gè)時(shí)間步。日度數(shù)據(jù)有周規(guī)律時(shí) m7月度數(shù)據(jù)有年度規(guī)律時(shí) m12小時(shí)數(shù)據(jù)有日內(nèi)規(guī)律時(shí) m24。這個(gè)映射看著簡(jiǎn)單出錯(cuò)率卻最高——很多人把「月」當(dāng)成季節(jié)單位直接填 30結(jié)果模型把 30 天當(dāng)成一個(gè)周期擬合出來(lái)的季節(jié)項(xiàng)完全沒(méi)有業(yè)務(wù)含義。選 m 之前先問(wèn)自己一個(gè)問(wèn)題這個(gè)序列里反復(fù)出現(xiàn)的規(guī)律間隔是多少個(gè)觀測(cè)點(diǎn)一個(gè)日度數(shù)據(jù)如果周一到周五高、周末低那間隔就是 7如果數(shù)據(jù)是每季度統(tǒng)計(jì)一次、每年有重復(fù)那間隔就是 4。m 給錯(cuò)整個(gè)季節(jié)項(xiàng)都在擬合一個(gè)不存在的關(guān)系。還有一個(gè)實(shí)操約束m 越大計(jì)算量越離譜。m52 的周數(shù)據(jù)年度模型里季節(jié)自回歸項(xiàng)會(huì)引入稀疏的大矩陣auto_arima 的搜索速度會(huì)明顯變慢。如果數(shù)據(jù)真有年度周期但只有兩三年歷史我會(huì)先考慮按周聚合數(shù)據(jù)而不是硬上一個(gè) m52 的季節(jié)模型。SARIMA 的季節(jié)項(xiàng)需要至少兩個(gè)完整周期才能估計(jì)出穩(wěn)定系數(shù)數(shù)據(jù)覆蓋不夠時(shí)季節(jié)項(xiàng)只是個(gè)擺設(shè)。2.3 平穩(wěn)化分工d 管趨勢(shì)D 管季節(jié)d 和 D 都叫差分干的活不一樣。d 是普通差分讓均值不再隨時(shí)間漂移D 是季節(jié)差分把上一個(gè)周期同位置的值減掉消除周期性帶來(lái)的均值偏移。一個(gè)序列如果既有上升趨勢(shì)又有周規(guī)律通常 d 取 1 或者 0D 取 0 或者 1很少需要大于 1。這兩個(gè)值不該交給自動(dòng)搜索器原因很直接差分過(guò)度會(huì)直接破壞信號(hào)。d2 時(shí)序列已經(jīng)被差了兩輪剩下的大多是噪聲D2 時(shí)季節(jié)信息被連續(xù)減掉兩次模型輸出的預(yù)測(cè)會(huì)快速退化成一條平線。我一般先用 statsmodels 里的 adfuller 測(cè)一下原序列的 p 值大于 0.05 就做一階差分再測(cè)確定 dD 的確定更簡(jiǎn)單對(duì)數(shù)據(jù)做一次 m 步季節(jié)差分看 ACF 在 lagm 附近是否還有尖峰沒(méi)有就取 0有就取 1。這個(gè)「先定平穩(wěn)化階數(shù)再搜延遲階數(shù)」的順序是搜索調(diào)參里性?xún)r(jià)比最高的一步。把 d 和 D 固定住搜索器只需要在 p/q/P/Q 四個(gè)維度里跑組合數(shù)從幾萬(wàn)降到幾百結(jié)果還更容易解釋。2.4 搜索之前先看兩張圖ACF/PACF 定 p、q 的粗邊界自動(dòng)搜索流行之后很多人已經(jīng)不畫(huà) ACF 和 PACF 了但這兩張圖仍然有價(jià)值——不是用來(lái)精確定階而是給搜索器劃定合理的搜索范圍。下表是傳統(tǒng)定階規(guī)則的簡(jiǎn)化版相關(guān)函數(shù)形態(tài)對(duì)應(yīng)模型階數(shù)取值A(chǔ)CF 拖尾PACF 在 p 階截尾AR(p)p 取截尾階數(shù)ACF 在 q 階截尾PACF 拖尾MA(q)q 取截尾階數(shù)ACF 與 PACF 都拖尾ARMAp 與 q 各取較小值自動(dòng)搜索不是萬(wàn)能的它只能在你給定的 max_p、max_q 范圍內(nèi)找最優(yōu)。如果業(yè)務(wù)數(shù)據(jù)特征明顯比如客流對(duì)昨天敏感把 max_p 設(shè)成 3、max_q 設(shè)成 3 就夠了沒(méi)必要給搜索器留一個(gè) p、q 上限各 9 的巨大空間。搜索范圍越大越容易搜出一個(gè) AIC 很低但系數(shù)極其復(fù)雜、根本無(wú)法解釋的模型——這種模型上線后往往最先翻車(chē)。把 ACF/PACF 當(dāng)作「搜索結(jié)果的事后驗(yàn)證工具」更實(shí)用auto_arima 搜出結(jié)果后回看原序列的 ACF/PACF如果搜索給出的階數(shù)和圖形判斷差得很遠(yuǎn)我會(huì)懷疑數(shù)據(jù)里有異常值或者周期設(shè)定有誤先去查數(shù)據(jù)而不是直接信搜索結(jié)果。3. 搜索調(diào)參跑通最小流程用 auto_arima 從數(shù)據(jù)拆分到模型落定3.1 數(shù)據(jù)準(zhǔn)備與訓(xùn)練測(cè)試拆分按時(shí)間切別隨機(jī)切時(shí)間序列預(yù)測(cè)的樣本拆分和普通機(jī)器學(xué)習(xí)完全不同。隨機(jī)切分會(huì)把未來(lái)數(shù)據(jù)混進(jìn)訓(xùn)練集模型等于提前看到了答案。正確做法是按時(shí)間順序把最后一段完整周期留作測(cè)試集。下面這段代碼生成兩年日度數(shù)據(jù)帶趨勢(shì)、周季節(jié)和噪聲按時(shí)間切成訓(xùn)練和測(cè)試兩部分import numpy as np import pandas as pd from pmdarima import auto_arima from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.stats.diagnostic import acorr_ljungbox from statsmodels.graphics.tsaplots import plot_acf # 生成兩年日度數(shù)據(jù)上行趨勢(shì) 周季節(jié) 隨機(jī)噪聲 np.random.seed(42) dates pd.date_range(2023-01-01, periods730, freqD) trend np.linspace(100, 130, 730) # 緩慢上行 season 5 * np.sin(2 * np.pi * np.arange(730) / 7) # 周季節(jié) noise np.random.normal(0, 2, 730) y trend season noise df pd.DataFrame({ds: dates, y: y}) # 按時(shí)間順序切分訓(xùn)練集 650 天測(cè)試集 80 天 train df.iloc[:650].copy() test df.iloc[650:].copy()切分時(shí)有一個(gè)容易被忽略的細(xì)節(jié)測(cè)試集長(zhǎng)度最好是周期長(zhǎng)度的整數(shù)倍。這里測(cè)試集取 80 天雖然不是 7 的倍數(shù)但已經(jīng)是 11 個(gè)完整周加 3 天足夠覆蓋完整的周季節(jié)模式。如果測(cè)試集只留 10 天剛好卡在周四那「周五高峰」這種特征在測(cè)試中的占比就會(huì)失真評(píng)估結(jié)果會(huì)和真實(shí)上線表現(xiàn)差很多。3.2 auto_arima 的搜索配置固定 d/D只搜 p/q/P/Q把上一章說(shuō)的方法落成代碼d 和 D 手動(dòng)固定搜索器只搜 p、q、P、Q。搜索范圍不要貪大p 和 q 上限給到 3季節(jié)項(xiàng) P 和 Q 上限給到 2已經(jīng)能覆蓋絕大多數(shù)業(yè)務(wù)數(shù)據(jù)。auto_model auto_arima( train[y], seasonalTrue, m7, # 周周期 d1, # 一階差分去趨勢(shì) D1, # 季節(jié)差分去周周期 max_p3, max_q3, max_P2, max_Q2, stepwiseTrue, # 貪心搜索速度快很多 information_criterionaic, traceTrue, # 打印搜索過(guò)程 error_actionignore, n_jobs-1 ) print(auto_model.order) # 非季節(jié)部分 (p, d, q) print(auto_model.seasonal_order) # 季節(jié)部分 (P, D, Q, m)關(guān)鍵參數(shù)說(shuō)明stepwiseTrue 是貪心策略每步只比較局部候選搜索幾秒到幾十秒stepwiseFalse 做全網(wǎng)格窮舉幾百個(gè)組合逐個(gè)擬合可能要跑幾小時(shí)。先用 stepwiseTrue 找候選方向再在小鄰域里細(xì)搜是效率最高的做法。information_criterion 選 aic 適合大多數(shù)場(chǎng)景樣本量小比如不足 200 條用 aicc 更穩(wěn)它會(huì)額外懲罰參數(shù)數(shù)量bic 懲罰最重適合你更在意模型簡(jiǎn)潔性的場(chǎng)合。error_actionignore 讓搜索自動(dòng)跳過(guò)擬合失敗的組合避免整個(gè)搜索中斷。n_jobs-1 表示用滿所有 CPU 核心。但注意某些組合在 statsmodels 底層不是純 Python 計(jì)算并行收益沒(méi)有想象中大別指望翻幾倍提速。搜索完成后打印的 order 和 seasonal_order 就是要用的最終參數(shù)。traceTrue 的輸出里能看到搜索器每一步比較了哪些候選、AIC 是多少這個(gè)日志建議保留一份后面排查模型異常時(shí)能派上用場(chǎng)。3.3 搜索完成后落到 statsmodels 手動(dòng)擬合pmdarima 的 auto_arima 本質(zhì)是搜索器它幫你選參數(shù)但不負(fù)責(zé)生產(chǎn)環(huán)境的擬合和預(yù)測(cè)。拿到結(jié)果后我會(huì)把參數(shù)傳到 statsmodels 的 SARIMAX 里重新擬一次這樣后續(xù)的殘差診斷、滾動(dòng)預(yù)測(cè)、系數(shù)顯著性檢驗(yàn)都更順手。best_order auto_model.order # 例如 (1, 1, 1) best_seasonal auto_model.seasonal_order # 例如 (1, 1, 0, 7) final_model SARIMAX( train[y], orderbest_order, seasonal_orderbest_seasonal, enforce_stationarityFalse, enforce_invertibilityFalse, ) fit final_model.fit(dispFalse) print(fit.summary())這里有兩個(gè)容易踩的參數(shù)enforce_stationarity 和 enforce_invertibility。默認(rèn) True 表示強(qiáng)制要求擬合出的模型滿足平穩(wěn)性和可逆性如果不滿足就報(bào)錯(cuò)。我設(shè) False 是為了讓擬合更容易收斂但這相當(dāng)于給模型解除了限制擬合完成后必須回看 summary 里的系數(shù)確認(rèn)模型沒(méi)有給出離譜的自回歸系數(shù)比如大于 1 的 AR 系數(shù)。summary 輸出里重點(diǎn)關(guān)注兩列coef 是系數(shù)值P|z| 是顯著性。如果一個(gè)滯后項(xiàng)的 p 值大于 0.1說(shuō)明這個(gè)參數(shù)基本沒(méi)用可以手動(dòng)收緊搜索范圍重跑而不是放任它留在模型里增加復(fù)雜度。記住一個(gè)原則auto_arima 給出的模型是「候選解」不是「最終答案」系數(shù)顯著性、殘差白噪聲都要人工確認(rèn)過(guò)才算走完搜索調(diào)參這一步。4. 搜完參數(shù)先別急著上線殘差診斷與滾動(dòng)多步預(yù)測(cè)4.1 殘差三件套殘差圖、ACF 與 Ljung-Box 檢驗(yàn)?zāi)P蛿M合好不好不是看訓(xùn)練集上的誤差有多小而是看殘差里還有沒(méi)有「可利用的信息」。理想殘差應(yīng)該像白噪聲一樣沒(méi)有趨勢(shì)、沒(méi)有周期、沒(méi)有自相關(guān)。三個(gè)檢查各看一個(gè)側(cè)面殘差圖看是否有波動(dòng)聚集或明顯偏移殘差 ACF 看是否存在周期性尖峰Ljung-Box 檢驗(yàn)給出一個(gè)可量化的結(jié)論。resid fit.resid plot_acf(resid, lags40) plt.show() # 計(jì)算 lag10 和 lag20 的 Ljung-Box 統(tǒng)計(jì)量 lb_test acorr_ljungbox(resid, lags[10, 20], return_dfTrue) print(lb_test)Ljung-Box 的原假設(shè)是殘差不存在自相關(guān)p 值大于 0.05 才算通過(guò)。報(bào)告時(shí)只選 lag10 和 20 兩個(gè)點(diǎn)不要一口氣報(bào) 40 個(gè) lag——lag 越多碰巧顯著的概率越高容易誤判。如果 ACF 在某個(gè) lag 上仍有明顯尖峰可以直接定位問(wèn)題lag7 處有尖峰說(shuō)明周季節(jié)沒(méi)拆干凈lag14 處有尖峰可能是雙周規(guī)律lag1 處有尖峰說(shuō)明非季節(jié)部分的滯后階數(shù)不夠。把這些信息帶回 auto_arima 重新調(diào)整搜索范圍比盲目改參數(shù)有效得多。4.2 滾動(dòng)多步預(yù)測(cè)預(yù)測(cè) 7 天就重訓(xùn)一次一次性預(yù)測(cè)整個(gè)測(cè)試集 80 天前幾步可能還正常越往后預(yù)測(cè)值越趨向季節(jié)均值誤差滾雪球式放大。真實(shí)業(yè)務(wù)不會(huì)這樣干——大多數(shù)場(chǎng)景是每周末用最新數(shù)據(jù)重訓(xùn)一次預(yù)測(cè)未來(lái) 7 天。滾動(dòng)預(yù)測(cè)模擬的正是這種使用方式評(píng)估結(jié)果更接近上線后的真實(shí)表現(xiàn)。horizon 7 window 180 preds [] data df[y].values # 每預(yù)測(cè) 7 天用最近 180 天數(shù)據(jù)重訓(xùn)一次 for start in range(0, len(test) - horizon 1, horizon): end_train len(train) start train_part data[end_train - window:end_train] m SARIMAX( train_part, orderbest_order, seasonal_orderbest_seasonal, enforce_stationarityFalse, enforce_invertibilityFalse ).fit(dispFalse) preds.append(m.forecast(horizon)) preds np.concatenate(preds) y_true data[len(train):len(train) len(preds)]窗口長(zhǎng)度 window180 是經(jīng)驗(yàn)值相當(dāng)于 26 個(gè)完整周足夠季節(jié)項(xiàng)穩(wěn)定估計(jì)又不會(huì)因?yàn)閿?shù)據(jù)太老而拖累時(shí)效。滾動(dòng)重訓(xùn)的代價(jià)是時(shí)間每次 fit 都要重新走一遍似然估計(jì)80 天測(cè)試集、7 天一步要重訓(xùn) 11 次。如果數(shù)據(jù)量大可以改成預(yù)測(cè) 14 天重訓(xùn)一次省一半時(shí)間評(píng)估結(jié)果仍然有效。4.3 評(píng)估指標(biāo)怎么選RMSE、MAE 與 MAPE 的適用邊界from sklearn.metrics import mean_absolute_error, mean_squared_error rmse np.sqrt(mean_squared_error(y_true, preds)) mae mean_absolute_error(y_true, preds) mape np.mean(np.abs((y_true - preds) / y_true)) * 100 print(fRMSE{rmse:.2f}, MAE{mae:.2f}, MAPE{mape:.2f}%)三個(gè)指標(biāo)各有用途RMSE 對(duì)大誤差敏感能暴露個(gè)別預(yù)測(cè)離譜的情況MAE 是平均偏差和業(yè)務(wù)方解釋「平均差多少」最直接MAPE 是百分比匯報(bào)時(shí)最直觀但分母接近 0 時(shí)會(huì)爆表日均流水幾百塊的場(chǎng)景里一個(gè)接近 0 的真實(shí)值就能把 MAPE 拉出天際。還有一點(diǎn)經(jīng)常被混淆搜索階段用 AIC 選模型評(píng)估階段用 RMSE/MAE 衡量上線效果兩者不能互相替代。AIC 回答的是「模型在信息量上的相對(duì)優(yōu)劣」業(yè)務(wù)指標(biāo)回答的是「預(yù)測(cè)誤差能不能被接受」。見(jiàn)過(guò)不只一次有人拿著 AIC 最低的模型上線結(jié)果 RMSE 比簡(jiǎn)單基線還差原因就是 AIC 只考慮似然和參數(shù)數(shù)量完全不關(guān)心預(yù)測(cè)誤差的形狀。5. 不只看搜索結(jié)果SARIMA 實(shí)戰(zhàn) 5 個(gè)高頻坑與排查5.1 坑一搜索很順預(yù)測(cè)卻是平線現(xiàn)象auto_arima 正常出參AIC 也不高但 forecast 出來(lái)的未來(lái) 10 天全是一個(gè)常數(shù)。 原因差分參數(shù)給大了。d2 加上 D1序列被差了兩輪以上原有的趨勢(shì)和周期信息基本被洗掉模型只能預(yù)測(cè)出均值。另一種可能是季節(jié)項(xiàng) P 和 Q 全部為 0季節(jié)信息完全沒(méi)被利用。 解決把 d 和 D 限制到 0 或 1重新固定后再搜檢查 seasonal_order 里的 P 和 Q 是否至少有一個(gè)不為 0看 summary 里季節(jié) AR/MA 系數(shù)的 p 值如果季節(jié)項(xiàng)系數(shù)不顯著問(wèn)題出在季節(jié)參數(shù)的約束上而不是搜索器本身。5.2 坑二Ljung-Box 永遠(yuǎn)不通過(guò)殘差還有結(jié)構(gòu)現(xiàn)象模型看起來(lái)一切正常預(yù)測(cè)曲線也像模像樣但 Ljung-Box 的 p 值一直在 0.05 以下殘差 ACF 里總有尖峰。 原因auto_arima 只用 AIC 選模型AIC 低不代表殘差是白噪聲。最常見(jiàn)的是季節(jié)周期判斷單一——數(shù)據(jù)同時(shí)存在「工作日-周末」雙周期和節(jié)假日脈沖只給一個(gè) m7 覆蓋不了所有規(guī)律。 解決先看殘差 ACF 尖峰落在哪個(gè) lag。落在 7 的倍數(shù)附近說(shuō)明周規(guī)律沒(méi)吃干凈檢查是否缺了額外的節(jié)假日周期如果數(shù)據(jù)里有明確的節(jié)日效應(yīng)就別用純 SARIMA改用 SARIMAX 加外生變量把節(jié)假日日期編成 0/1 的啞變量模型才能吸收非周期性脈沖。5.3 坑三m 給錯(cuò)季節(jié)項(xiàng)系數(shù)不顯著現(xiàn)象m7 設(shè)了seasonal 也開(kāi)成 True但輸出里季節(jié) AR/MA 系數(shù) p 值大于 0.1季節(jié)項(xiàng)形同虛設(shè)。 原因樣本不足或季節(jié)模式太弱。數(shù)據(jù)只有 3 個(gè)月時(shí)周季節(jié)只有 13 個(gè)周期季節(jié)項(xiàng)系數(shù)估計(jì)不穩(wěn)或者數(shù)據(jù)本身季節(jié)波動(dòng)幅度遠(yuǎn)小于噪聲季節(jié)項(xiàng)在似然函數(shù)里貢獻(xiàn)太小。 解決數(shù)據(jù)不足兩個(gè)完整季節(jié)周期時(shí)不要上季節(jié)項(xiàng)用純 ARIMA 反而更穩(wěn)如果季節(jié)波動(dòng)確實(shí)存在但幅度小先把分量圖的季節(jié)子序列畫(huà)出來(lái)看看周期性是否肉眼可見(jiàn)再?zèng)Q定是否值得為它付出樣本量。5.4 坑四預(yù)測(cè)窗口跨過(guò)周期切換點(diǎn)誤差突然放大現(xiàn)象訓(xùn)練集截止到 8 月底預(yù)測(cè) 9 月的某幾天誤差比平時(shí)大好幾倍而且翻車(chē)的位置每個(gè)月都在同一時(shí)間段附近。 原因SARIMA 只能建模固定周期節(jié)假日、大促、政策引起的脈沖不屬于季節(jié)周期模型會(huì)把這些事件當(dāng)成隨機(jī)噪聲。預(yù)測(cè)窗口越長(zhǎng)誤差累積越明顯剛好在事件附近時(shí)誤差會(huì)放大幾倍。 解決把預(yù)測(cè)窗口拆短7 天一步滾動(dòng)重訓(xùn)事件發(fā)生后立刻把新數(shù)據(jù)吸收進(jìn)去對(duì)已知的固定事件如每月的會(huì)員日用外生變量建模對(duì)一次性脈沖如短期促銷(xiāo)預(yù)測(cè)后做人工修正不要指望 SARIMA 自己學(xué)出來(lái)。5.5 坑五全網(wǎng)格搜索跑了幾小時(shí)結(jié)果是組合爆炸現(xiàn)象stepwiseFalse 跑了一個(gè)晚上沒(méi)出結(jié)果CPU 占用還不高像是卡死。 原因SARIMA 的組合數(shù)是乘積關(guān)系p、q、P、Q 各給 5 個(gè)候選再疊加 d 和 D 的可選項(xiàng)組合數(shù)瞬間變成幾千上萬(wàn)。每一步都要做似然估計(jì)季節(jié)項(xiàng)還讓計(jì)算量翻倍幾小時(shí)跑不完是常態(tài)。 解決先 stepwiseTrue 快速跑出候選參數(shù)再在這個(gè)候選周?chē)男∴徲虮热?p±1、q±1開(kāi)一個(gè)小范圍的窮舉控制 pq 之和不超過(guò) 5PQ 之和不超過(guò) 2這個(gè)邊界足夠覆蓋大多數(shù)業(yè)務(wù)序列。6. 給預(yù)測(cè)上保險(xiǎn)滾動(dòng)基線與殘差再建模的小技巧SARIMA 的參數(shù)搜索本質(zhì)是個(gè)黑匣子它給你一個(gè) AIC 最低的候選解但不保證業(yè)務(wù)上可用。我現(xiàn)在的工作習(xí)慣是任何模型上線前先跑一個(gè)「季節(jié)性樸素基線」——直接用上周同一天的值作為本周預(yù)測(cè)然后用 SARIMA 和它對(duì)比。如果 SARIMA 的滾動(dòng) RMSE 連這個(gè)不需要任何訓(xùn)練的基線都打不過(guò)那這組參數(shù)就是廢的省下的時(shí)間不如回去查數(shù)據(jù)。另一個(gè)值得試的技巧是殘差再建模。SARIMA 擬合完把殘差序列單獨(dú)拿出來(lái)跑一次 ACF如果發(fā)現(xiàn)某個(gè) lag 上還有殘余尖峰通常是 m/2 或 m 附近說(shuō)明季節(jié)項(xiàng)沒(méi)拆干凈。這時(shí)不必推翻整個(gè)模型返工可以直接對(duì)殘差擬合一個(gè)低階 AR 模型把殘差預(yù)測(cè)值疊回 SARIMA 的預(yù)測(cè)結(jié)果上。這個(gè)修正幅度通常很小但對(duì) RMSE 的改善經(jīng)常能擠出 5% 到 10%是所有提效手段里性?xún)r(jià)比最高的一個(gè)。做模型對(duì)照時(shí)也提醒一句拿 SARIMA 和 LSTM、Prophet 這類(lèi)模型橫向比較評(píng)估方式必須統(tǒng)一都走滾動(dòng)重?cái)M合格而不是 SARIMA 用滾動(dòng)、LSTM 用一次訓(xùn)練到底。評(píng)估口徑不一致時(shí)深度模型的對(duì)比結(jié)果幾乎沒(méi)有參考價(jià)值。SARIMA 的優(yōu)勢(shì)在于可解釋性——每個(gè)系數(shù)對(duì)應(yīng)一個(gè)滯后項(xiàng)出了問(wèn)題能查你把這份滾動(dòng)基線和殘差修正的流程固定下來(lái)之后再?lài)L試更復(fù)雜的模型時(shí)始終有一條可信的基準(zhǔn)線兜底。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取