序預(yù)測(cè)實(shí)戰(zhàn):從ARIMA到LSTM的完整方案與避坑指南)
簡(jiǎn)介基于Transformer架構(gòu)的北京天氣時(shí)間序列預(yù)測(cè)項(xiàng)目面向有一定Python和深度學(xué)習(xí)基礎(chǔ)的開(kāi)發(fā)者解決多變量輸入、單變量輸出的氣象預(yù)報(bào)問(wèn)題兼顧模型訓(xùn)練與推理應(yīng)用兩部分。資源包共4個(gè)文件約99.77MB包含2個(gè)Python腳本、1份Excel氣象數(shù)據(jù)和1個(gè)PyTorch模型權(quán)重其中模型權(quán)重保存了訓(xùn)練中的最優(yōu)參數(shù)腳本分別負(fù)責(zé)加載模型完成預(yù)測(cè)、數(shù)據(jù)預(yù)處理與效果評(píng)估Excel數(shù)據(jù)文件則提供日期、溫度、濕度、風(fēng)速等原始?xì)庀笥涗洝D壳耙延?664人學(xué)習(xí)是深度學(xué)習(xí)愛(ài)好者將注意力機(jī)制落地到真實(shí)場(chǎng)景的直觀參考。讀者可直接借助最優(yōu)權(quán)重快速生成預(yù)測(cè)結(jié)果也可沿腳本逐步復(fù)盤(pán)天氣數(shù)據(jù)清洗、時(shí)間特征提取、模型訓(xùn)練及指標(biāo)驗(yàn)證等關(guān)鍵環(huán)節(jié)通過(guò)調(diào)整輸入輸出配置還能擴(kuò)展為其他變量的時(shí)序預(yù)報(bào)實(shí)驗(yàn)適合用來(lái)入門(mén)或深入研究Transformer在時(shí)間序列領(lǐng)域的應(yīng)用。 去年接手一個(gè)氣象數(shù)據(jù)可視化的項(xiàng)目客戶(hù)最開(kāi)始的需求只是把過(guò)去十年的溫度曲線(xiàn)畫(huà)出來(lái)。真正聊深了之后需求變成了能不能預(yù)測(cè)未來(lái)三天甚至一周的最高最低氣溫。于是我開(kāi)始系統(tǒng)性地做時(shí)間序列預(yù)測(cè)天氣數(shù)據(jù)這件事。折騰下來(lái)最大的感受是天氣預(yù)測(cè)和股票預(yù)測(cè)、流量預(yù)測(cè)這些時(shí)序問(wèn)題有相似之處但又有它非常特殊的一面——周期性極強(qiáng)、噪聲極大、極端值無(wú)法避免。這篇文章沒(méi)有空談原理全部是我在一個(gè)真實(shí)項(xiàng)目里踩過(guò)、試過(guò)、改過(guò)的方案和代碼希望能給準(zhǔn)備碰時(shí)序預(yù)測(cè)的人省點(diǎn)彎路。1. 天氣數(shù)據(jù)到底適合哪種時(shí)序模型1.1 線(xiàn)性方法為什么不能直接套用網(wǎng)上很多入門(mén)教程喜歡拿 ARIMA 講時(shí)間序列預(yù)測(cè)天氣數(shù)據(jù)因?yàn)?ARIMA 對(duì)平穩(wěn)序列表現(xiàn)不錯(cuò)數(shù)學(xué)上也優(yōu)雅。但我先說(shuō)實(shí)話(huà)溫度序列從來(lái)不是平穩(wěn)的。一天之內(nèi)有晝夜溫差一年之內(nèi)有季節(jié)溫差再加上寒潮、副熱帶高壓這些氣候系統(tǒng)的擾動(dòng)均值、方差都在變。你可以把溫度序列想象成一條帶著巨大波浪的河流ARIMA 這種線(xiàn)性工具就像在河面上畫(huà)直線(xiàn)它抓得住短期一小段趨勢(shì)卻扛不住季節(jié)性的周期性擺動(dòng)。做差分可以消除一部分非平穩(wěn)但差分的階數(shù)、季節(jié)周期長(zhǎng)度這些參數(shù)在你面對(duì)不同城市、不同氣候帶的站點(diǎn)時(shí)調(diào)一次就想放棄。初始數(shù)據(jù)我只拿了某個(gè)南方城市近五年逐小時(shí)氣溫ARIMA 調(diào)參后的第一版預(yù)測(cè)在未來(lái) 24 小時(shí)內(nèi)的誤差還能看一旦往 72 小時(shí)以外推預(yù)測(cè)曲線(xiàn)幾乎變成一根橫線(xiàn)——因?yàn)榫€(xiàn)性模型本質(zhì)上只會(huì)記住均值。如果你就是想跑個(gè)基線(xiàn)ARIMA 可以當(dāng)參照物但別指望它扛大梁。1.2 Prophet、LSTM、Transformer 的取舍真正在項(xiàng)目里挑模型時(shí)我對(duì)比了三類(lèi)方案模型優(yōu)點(diǎn)缺點(diǎn)適合場(chǎng)景Prophet添加季節(jié)項(xiàng)和假期項(xiàng)很快對(duì)缺失值容忍度高使用難度低對(duì)復(fù)雜非線(xiàn)性交互表達(dá)有限多變量擴(kuò)展偏弱快速做一輪基線(xiàn)預(yù)測(cè)業(yè)務(wù)匯報(bào)用LSTM能捕捉非線(xiàn)性時(shí)序依賴(lài)適合中等長(zhǎng)度歷史序列調(diào)參成本高數(shù)據(jù)量不夠時(shí)容易過(guò)擬合訓(xùn)練時(shí)間長(zhǎng)有兩年以上逐小時(shí)數(shù)據(jù)做24~72小時(shí)預(yù)測(cè)Transformer近年時(shí)序預(yù)測(cè)的強(qiáng)手能處理長(zhǎng)程依賴(lài)和多變量特征實(shí)現(xiàn)成本高小數(shù)據(jù)集上優(yōu)勢(shì)不明顯容易在推理階段出詭異結(jié)果數(shù)據(jù)規(guī)模大、特征多有多站點(diǎn)聯(lián)合建模需求我當(dāng)時(shí)沒(méi)直接上 Transformer原因是項(xiàng)目數(shù)據(jù)量有限一個(gè)站點(diǎn)也就幾萬(wàn)行訓(xùn)練集還沒(méi)有大到能讓注意力機(jī)制充分發(fā)揮。最后的生產(chǎn)方案是雙軌制基線(xiàn)輸出用 Prophet正式輸出用 LSTM。Transformer 留到后面如果接入?yún)^(qū)域網(wǎng)格數(shù)據(jù)再升級(jí)。真實(shí)經(jīng)驗(yàn)是模型不是越復(fù)雜越好而是跟你的數(shù)據(jù)量、業(yè)務(wù)精度要求匹配才對(duì)。客戶(hù)要的是未來(lái)三天趨勢(shì)大概準(zhǔn)而不是論文里的SOTA數(shù)字。2. 從原始?xì)庀髷?shù)據(jù)到可訓(xùn)練樣本的清洗過(guò)程2.1 缺失值與異常站點(diǎn)的處理天氣數(shù)據(jù)不會(huì)干干凈凈躺在數(shù)據(jù)庫(kù)里等你。我拿到的 CSV 里最普遍的問(wèn)題有三個(gè)傳感器離線(xiàn)導(dǎo)致的整段缺失、自動(dòng)站維護(hù)期間產(chǎn)生的重復(fù)記錄、還有極端天氣下記錄到明顯超出物理范圍的值。比如某站某個(gè)小時(shí)內(nèi)氣溫突跳 30 度這種基本可以判定為采集異常。處理順序我建議固定成一套管道按時(shí)間戳排序后去除完全重復(fù)的行對(duì)每個(gè)站點(diǎn)單獨(dú)做范圍校驗(yàn)比如溫度設(shè)在 -50℃~60℃ 區(qū)間超出直接標(biāo)空缺失值先不做插補(bǔ)而是先看缺失比例。如果某個(gè)站點(diǎn)缺失超過(guò) 30%這個(gè)站點(diǎn)我不太建議硬留直接剔除對(duì)短時(shí)間缺失用前后 6 小時(shí)滑動(dòng)均值補(bǔ)千萬(wàn)別用全序列均值補(bǔ)——那會(huì)直接吃掉晝夜波動(dòng)的特征。這里有一個(gè)容易犯的錯(cuò)先插補(bǔ)再劃分訓(xùn)練集和測(cè)試集。標(biāo)準(zhǔn)做法是先劃分再插補(bǔ)。否則你在插補(bǔ)時(shí)已經(jīng)偷用了未來(lái)窗口的信息后面評(píng)估出來(lái)的指標(biāo)全是虛高。2.2 特征拆解讓模型“看到”天氣的周期性溫度不是隨機(jī)的它強(qiáng)烈依賴(lài)一天中的時(shí)刻和一年中的哪天。但模型不認(rèn)識(shí)6月15日14點(diǎn)這種格式它們更喜歡連續(xù)數(shù)字。所以我把時(shí)間特征拆成這樣hour_sin、hour_cos對(duì)一天內(nèi)小時(shí)做正弦/余弦編碼dayofyear_sin、dayofyear_cos對(duì)一年內(nèi)天數(shù)做正弦/余弦編碼is_weekend周末和工作日對(duì)城市氣溫有影響滯后特征temp_lag_1h、temp_lag_24h、temp_lag_168h一周前的同一時(shí)刻。為什么不直接用數(shù)字 0~23 表示小時(shí)因?yàn)閷?duì)模型來(lái)說(shuō)0 點(diǎn)和 23 點(diǎn)在數(shù)值上差距很大但物理上它們只隔 1 小時(shí)。正弦余弦編碼能把循環(huán)這個(gè)信息真正表達(dá)出來(lái)。用生活類(lèi)比來(lái)解釋小時(shí)編碼就像鐘表盤(pán)你關(guān)心的是指針角度而不是表盤(pán)刻度上的數(shù)字差。直接喂 0~23 等于把凌晨和深夜硬生生切成兩個(gè)互不相鄰的孤島。2.3 訓(xùn)練集與驗(yàn)證集的切分策略時(shí)間序列的切分不能用隨機(jī)打亂。隨機(jī)打亂等于把未來(lái)的信息混進(jìn)訓(xùn)練集模型會(huì)作弊驗(yàn)證結(jié)果會(huì)好看到不真實(shí)。我采用的切分方式是前 36 個(gè)月作為訓(xùn)練集接下來(lái) 3 個(gè)月作為驗(yàn)證集最后 3 個(gè)月作為測(cè)試集用滾動(dòng)起點(diǎn)的方式做模型調(diào)參時(shí)的交叉驗(yàn)證每次訓(xùn)練窗口后移 7 天驗(yàn)證窗口也跟著移。這段邏輯我寫(xiě)成代碼后長(zhǎng)這樣偽代碼邏輯def rolling_split(df, train_days36*30, val_days90, step_days7): folds [] start 0 while start train_days val_days len(df): train df[start: start train_days] val df[start train_days: start train_days val_days] folds.append((train, val)) start step_days return folds這樣每一折都是嚴(yán)格按時(shí)間順序來(lái)的模型永遠(yuǎn)看不到未來(lái)數(shù)據(jù)。3. 搭建預(yù)測(cè)模型從零起步的完整代碼3.1 基線(xiàn)模型先用線(xiàn)性回歸探底不要一上來(lái)就堆 LSTM。我先用最簡(jiǎn)單的線(xiàn)性回歸跑了一版目的是確定最笨的方案能到什么水平。這一步非常重要后續(xù)所有復(fù)雜模型都要跟這個(gè)底線(xiàn)比如果 LSTM 連線(xiàn)性回歸都打不過(guò)說(shuō)明要么特征沒(méi)做對(duì)要么數(shù)據(jù)量不夠。我用了多步預(yù)測(cè)策略要預(yù)測(cè)未來(lái) 24 小時(shí)就構(gòu)造一個(gè)以當(dāng)前時(shí)刻為基準(zhǔn)、特征里包含過(guò)去 168 小時(shí)滑動(dòng)統(tǒng)計(jì)均值、最大值、最小值的回歸模型目標(biāo)值是未來(lái) 1~24 小時(shí)的溫度序列拆成 24 個(gè)輸出頭。from sklearn.linear_model import LinearRegression from sklearn.multioutput import MultiOutputRegressor X feature_engineering(df) # 自定義函數(shù)生成上面提到的特征 y df[[temp_t1, temp_t2, ..., temp_t24]].values model MultiOutputRegressor(LinearRegression()) model.fit(X_train, y_train)線(xiàn)性回歸在這個(gè)任務(wù)上的測(cè)試集 MAE平均絕對(duì)誤差大概是 2.3℃。這個(gè)結(jié)果其實(shí)已經(jīng)能支撐不少日常業(yè)務(wù)場(chǎng)景比如明天最高溫大致在什么范圍。但它的問(wèn)題也很明顯——它對(duì)突然冷空氣過(guò)境幾乎毫無(wú)反應(yīng)因?yàn)樗粚W(xué)到了歷史時(shí)刻與未來(lái)時(shí)刻的平均關(guān)系沒(méi)有學(xué)到天氣系統(tǒng)的動(dòng)態(tài)演化。3.2 輕量級(jí)方案以 Prophet 快速出結(jié)果如果只是做業(yè)務(wù)演示或者快速驗(yàn)證Prophet 的投入產(chǎn)出比很高。它的接口很簡(jiǎn)潔from prophet import Prophet prophet_df df.rename(columns{datetime: ds, temperature: y}) model Prophet( yearly_seasonalityTrue, daily_seasonalityTrue, weekly_seasonalityFalse ) model.add_country_holidays(country_nameCN) model.fit(prophet_df) future model.make_future_dataframe(periods72, freqH) forecast model.predict(future)Prophet 有個(gè)對(duì)天氣時(shí)序特別友好的特性它把節(jié)假日作為一種額外影響因子。國(guó)慶、春節(jié)這些大假期間城市熱島效應(yīng)和出行結(jié)構(gòu)變化會(huì)影響溫度觀測(cè)加上節(jié)假日參數(shù)后春節(jié)期間誤差確實(shí)降了一些。不過(guò) Prophet 對(duì)多變量特征比如濕度、氣壓的支持比較弱。你想加入前 24 小時(shí)的平均氣壓這種特征時(shí)得手動(dòng)加到額外回歸變量里處理起來(lái)不如神經(jīng)網(wǎng)絡(luò)靈活。3.3 LSTM 怎么構(gòu)造輸入序列LSTM 需要的是三維輸入(樣本數(shù), 時(shí)間步長(zhǎng), 特征數(shù))。我設(shè)定時(shí)間步長(zhǎng)為 168也就是用過(guò)去 7 天的逐小時(shí)數(shù)據(jù)預(yù)測(cè)未來(lái) 24 小時(shí)。構(gòu)造滑動(dòng)窗口的核心邏輯def create_sequences(data, input_steps168, output_steps24): X, y [], [] for i in range(len(data) - input_steps - output_steps): X.append(data[i: i input_steps]) y.append(data[i input_steps: i input_steps output_steps, 0]) # 0 是溫度列 return np.array(X), np.array(y)模型主體我搭了三層 LSTM 加兩層全連接model Sequential([ LSTM(64, return_sequencesTrue, input_shape(168, n_features)), Dropout(0.2), LSTM(64, return_sequencesFalse), Dropout(0.2), Dense(32, activationrelu), Dense(24) ]) model.compile(optimizeradam, lossmae)訓(xùn)練時(shí)我用了早停EarlyStopping和模型檢查點(diǎn)ModelCheckpoint。早停的 patience 設(shè)置為 10 個(gè) epoch意思是連續(xù) 10 輪驗(yàn)證集誤差不再下降就終止訓(xùn)練防止過(guò)擬合。LSTM 在這個(gè)數(shù)據(jù)集上把測(cè)試集 MAE 降到了 1.7℃左右比線(xiàn)性回歸的 2.3℃ 好不少。這里要說(shuō)一個(gè)很多人栽過(guò)的坑LSTM 對(duì)輸入特征的量綱非常敏感。溫度、氣壓、濕度不在一個(gè)數(shù)量級(jí)直接塞進(jìn)網(wǎng)絡(luò)會(huì)讓梯度爆炸。我用了 scikit-learn 的StandardScaler做標(biāo)準(zhǔn)化并且在訓(xùn)練完成后預(yù)測(cè)結(jié)果要用同一個(gè) scaler 做逆變換才能得到真實(shí)的溫度值。這個(gè)逆變換很容易被遺忘特別是你保存模型之后重新加載時(shí)。4. 評(píng)估預(yù)測(cè)效果時(shí)容易被忽略的那些坑4.1 指標(biāo)選擇MAE、RMSE 還是 MAPE天氣預(yù)測(cè)領(lǐng)域MAE 是我最常用的指標(biāo)因?yàn)樗庇^平均差 1.7℃意思就是平均每次預(yù)測(cè)偏了 1.7℃。RMSE 對(duì)極端誤差更敏感偶爾一次冷空氣漏報(bào)RMSE 會(huì)被拉高M(jìn)AE 相對(duì)穩(wěn)定。MAPE 在溫度預(yù)測(cè)里我不建議用因?yàn)闇囟刃蛄袝?huì)有接近 0℃ 的情況除以一個(gè)接近零的實(shí)際值MAPE 直接爆炸。看一個(gè)具體的驗(yàn)證集輸出日期實(shí)際最高溫(℃)預(yù)測(cè)最高溫(℃)絕對(duì)誤差(℃)2024-03-0118.219.51.32024-03-0221.020.10.92024-03-0315.412.82.62024-03-0413.715.92.22024-03-0517.517.10.4從單點(diǎn)誤差看不出系統(tǒng)性偏差所以我又額外畫(huà)了誤差分布直方圖。真實(shí)的誤差分布基本符合均值為 0 的正態(tài)分布但尾巴略厚說(shuō)明極端天氣來(lái)了誤差會(huì)明顯增大。4.2 防止數(shù)據(jù)泄漏天氣預(yù)測(cè)里的“未來(lái)信息”數(shù)據(jù)泄漏是時(shí)間序列預(yù)測(cè)里最隱蔽的坑。典型場(chǎng)景是你想預(yù)測(cè)未來(lái) 24 小時(shí)結(jié)果特征工程時(shí)不小心把未來(lái) 24 小時(shí)的平均氣壓也加進(jìn)去了。訓(xùn)練時(shí)模型會(huì)發(fā)現(xiàn)哦只要知道未來(lái)的氣壓溫度就很好猜驗(yàn)證集精度飛起一旦上線(xiàn)后你拿不到未來(lái)數(shù)據(jù)模型立刻變廢物。我的檢查方法是每加一個(gè)特征就把這個(gè)特征在真實(shí)預(yù)測(cè)時(shí)刻能不能拿到這個(gè)問(wèn)題重新問(wèn)一遍。滯后特征可以當(dāng)日累計(jì)降雨量如果統(tǒng)計(jì)截止時(shí)間早于預(yù)測(cè)時(shí)刻可以但任何來(lái)自未來(lái)窗口的統(tǒng)計(jì)量堅(jiān)決不用。還有一層泄漏更隱蔽標(biāo)準(zhǔn)化用的均值和方差。StandardScaler如果是在全量數(shù)據(jù)上 fit 的它已經(jīng)偷看了測(cè)試集的信息。正確做法是只對(duì)訓(xùn)練集 fit再分別 transform 驗(yàn)證集和測(cè)試集。4.3 滾動(dòng)預(yù)測(cè)的長(zhǎng)期穩(wěn)定性我在項(xiàng)目里還做了滾動(dòng)預(yù)測(cè)實(shí)驗(yàn)每次預(yù)測(cè)未來(lái) 24 小時(shí)然后真實(shí)值每更新 1 小時(shí)就重新預(yù)測(cè)一次。這樣連續(xù)跑 7 天得到的是一個(gè)滾動(dòng)誤差曲線(xiàn)。結(jié)果讓我很清醒滾動(dòng)預(yù)測(cè)的誤差并不是平穩(wěn)的在某些時(shí)段會(huì)突然惡化比如強(qiáng)對(duì)流天氣前后誤差能到 4~5℃。這也是時(shí)間序列預(yù)測(cè)天氣數(shù)據(jù)和股票預(yù)測(cè)最大的不同——股票價(jià)格在很多假設(shè)下是隨機(jī)游走天氣至少在短時(shí)間尺度上有很強(qiáng)的持續(xù)性今天的溫度大概率接近明天。但強(qiáng)對(duì)流系統(tǒng)會(huì)打破這種持續(xù)性模型看到的是歷史模式的延續(xù)而大氣實(shí)際已經(jīng)切換到了另一種狀態(tài)。5. 實(shí)測(cè)經(jīng)驗(yàn)?zāi)男耙馔狻弊畛3霈F(xiàn)在天氣時(shí)序預(yù)測(cè)里5.1 極端天氣讓模型全面失靈有一次模型在寒潮來(lái)臨前給出了未來(lái) 24 小時(shí) 20℃ 的預(yù)測(cè)實(shí)際上第二天最高溫只有 8℃。這讓我意識(shí)到所有訓(xùn)練數(shù)據(jù)里的極端事件都只是少數(shù)樣本神經(jīng)網(wǎng)絡(luò)對(duì)少數(shù)樣本的記憶很弱。寒潮、臺(tái)風(fēng)、暴雨這些轉(zhuǎn)折性天氣本來(lái)時(shí)序模型就很難捕捉因?yàn)樗鼈儽举|(zhì)上是非線(xiàn)性系統(tǒng)里的強(qiáng)擾動(dòng)。后來(lái)我加了一個(gè)突變檢測(cè)的前置模塊計(jì)算最近 6 小時(shí)溫度斜率、氣壓變化率如果指標(biāo)超過(guò)歷史 95 分位數(shù)就在預(yù)測(cè)結(jié)果后面加一條不確定性標(biāo)記提醒業(yè)務(wù)方未來(lái) 24 小時(shí)內(nèi)可能有轉(zhuǎn)折性天氣。這是工程上的妥協(xié)——模型做不了的事用規(guī)則來(lái)兜底。5.2 站點(diǎn)遷移與觀測(cè)儀器更換的數(shù)據(jù)斷層這個(gè)坑很少有人提前想到。某個(gè)城市的氣象站從舊站址遷到新站址后周邊環(huán)境從開(kāi)闊郊區(qū)變成了城區(qū)建筑群同一天的觀測(cè)溫度平均偏高 1℃ 左右。整個(gè)序列像突然被抬升了一段。模型去學(xué)歷史規(guī)律時(shí)會(huì)把前期偏低后期偏高理解成一種長(zhǎng)期升溫趨勢(shì)導(dǎo)致未來(lái)預(yù)測(cè)持續(xù)偏高。處理這個(gè)問(wèn)題的標(biāo)準(zhǔn)做法是分段建?;蛘咦稣军c(diǎn)均一化。我把站點(diǎn)遷移日期找出來(lái)把遷移前的數(shù)據(jù)作為獨(dú)立樣本遷移后的數(shù)據(jù)作另一段或者在特征里加一個(gè)is_new_site的啞變量。加上后預(yù)測(cè)誤差下降了不少。5.3 多步預(yù)測(cè)的誤差累積做 1 小時(shí)預(yù)測(cè)LSTM 誤差能壓到 0.8℃但預(yù)測(cè)第 24 小時(shí)時(shí)誤差往往放大到 2℃ 以上。這是多步預(yù)測(cè)的通病——誤差會(huì)隨著步長(zhǎng)累積。我試過(guò)兩種策略遞歸預(yù)測(cè)把第 1 小時(shí)預(yù)測(cè)值作為輸入再去預(yù)測(cè)第 2 小時(shí)誤差會(huì)滾雪球不推薦直接多步輸出一次輸出 24 小時(shí)每個(gè)輸出頭共享同一個(gè) encoder 特征誤差雖有放大小但可控。我最終選了直接多步輸出從業(yè)務(wù)角度看也更好解釋模型一次性給出未來(lái) 24 小時(shí)的曲線(xiàn)比逐小時(shí)滾動(dòng)預(yù)測(cè)穩(wěn)定。6. 這套方案還能往哪些方向延伸6.1 加入外部因素氣壓、濕度與風(fēng)場(chǎng)的組合特征溫度從來(lái)不是被時(shí)間變量單獨(dú)決定的。后來(lái)我把氣壓、相對(duì)濕度、風(fēng)速、降水量的逐小時(shí)數(shù)據(jù)也加入特征矩陣LSTM 的 MAE 又從 1.7℃ 降到了 1.4℃。原因不復(fù)雜冷鋒過(guò)境前氣壓會(huì)明顯上升風(fēng)速加大這些信號(hào)出現(xiàn)在溫度驟降之前模型學(xué)會(huì)從這些前兆里預(yù)測(cè)轉(zhuǎn)折比單純看溫度歷史更有效。6.2 從單站點(diǎn)到區(qū)域網(wǎng)格預(yù)報(bào)如果業(yè)務(wù)需要覆蓋多個(gè)城市而不是某一個(gè)站可以考慮讓模型一次性學(xué)習(xí)整個(gè)區(qū)域的氣象場(chǎng)。把多個(gè)站點(diǎn)的溫度、氣壓、濕度作為一個(gè)矩陣輸入用 Transformer 或圖神經(jīng)網(wǎng)絡(luò)去建模站點(diǎn)之間的空間相關(guān)性。這一步我在項(xiàng)目里只做了預(yù)研沒(méi)有上生產(chǎn)。原因是客戶(hù)的數(shù)據(jù)覆蓋站點(diǎn)太少空間依賴(lài)學(xué)不出來(lái)。但如果你手上有一整個(gè)區(qū)域的氣象站網(wǎng)數(shù)據(jù)非常推薦試這個(gè)方向因?yàn)樘鞖獗举|(zhì)上是空間連續(xù)場(chǎng)單站點(diǎn)建模浪費(fèi)了鄰近站點(diǎn)的信息。最后說(shuō)點(diǎn)個(gè)人工具層面的體驗(yàn)。調(diào) LSTM 時(shí)我經(jīng)常用的優(yōu)化技巧是把learning_rate從默認(rèn)的 0.001 降到 0.0003訓(xùn)練輪數(shù)相應(yīng)增加收斂更慢但最終誤差更低。天氣預(yù)報(bào)項(xiàng)目不是比誰(shuí)跑得快而是比誰(shuí)結(jié)果穩(wěn)。我現(xiàn)在做時(shí)間序列預(yù)測(cè)天氣數(shù)據(jù)固定流程就是線(xiàn)性回歸探底 → Prophet 出業(yè)務(wù)基線(xiàn) → LSTM 精細(xì)化。遇到明顯非平穩(wěn)、強(qiáng)季節(jié)性的數(shù)據(jù)這套組合基本能覆蓋 80% 的需求。本文還有配套的精品資源點(diǎn)擊獲取