據(jù)分析實(shí)戰(zhàn)指南:從時(shí)空數(shù)據(jù)處理到建模避坑)
氣象數(shù)據(jù)分析這幾年在數(shù)據(jù)圈子里熱度一直不低但真正動(dòng)手做過的人都知道它和普通的“跑個(gè)模型調(diào)個(gè)參”完全不是一回事。這個(gè)方向最大的特點(diǎn)是數(shù)據(jù)量大、時(shí)空關(guān)聯(lián)強(qiáng)、質(zhì)量參差不齊而且業(yè)務(wù)上對(duì)精度的要求往往很具體——不是“預(yù)測(cè)明天 20 度”這種一句話能糊弄過去的。我在實(shí)際項(xiàng)目中啃過站點(diǎn)觀測(cè)數(shù)據(jù)、衛(wèi)星反演產(chǎn)品、再分析資料也搭過從清洗到建模再到可視化的完整流程今天把這些經(jīng)驗(yàn)整理出來希望能給準(zhǔn)備入坑的朋友一些參考。這個(gè)方向適合三類人一是剛接觸數(shù)據(jù)科學(xué)、想找一個(gè)有深度又不浮夸的實(shí)戰(zhàn)領(lǐng)域的人二是已在做時(shí)序或空間數(shù)據(jù)分析、想往氣象場(chǎng)景遷移的從業(yè)者三是氣象相關(guān)專業(yè)出身、想把數(shù)據(jù)科學(xué)方法用起來的同學(xué)。無論哪一類這篇文章的核心目標(biāo)只有一個(gè)讓你理解氣象數(shù)據(jù)在整個(gè)數(shù)據(jù)科學(xué)鏈路里的特殊性并且能動(dòng)手完成一個(gè)有參考價(jià)值的分析任務(wù)。1. 氣象大數(shù)據(jù)分析的技術(shù)地圖先看全局再動(dòng)手1.1 氣象數(shù)據(jù)的四副面孔做氣象數(shù)據(jù)科學(xué)的第一步是分清手里拿的到底是哪一類數(shù)據(jù)。很多人一上來就堆模型結(jié)果連數(shù)據(jù)的基本屬性都沒搞清后續(xù)全部白做。常見的數(shù)據(jù)形態(tài)有四類我在不同項(xiàng)目里都接觸過這里逐一說明它們的特點(diǎn)。第一類是站點(diǎn)觀測(cè)數(shù)據(jù)。這是最直觀的一類來自各氣象站點(diǎn)的自動(dòng)觀測(cè)記錄包含溫度、濕度、氣壓、風(fēng)速、降水等要素通常按小時(shí)或分鐘頻次記錄。它的優(yōu)點(diǎn)是時(shí)間連續(xù)性好、精度較高缺點(diǎn)是空間上只是“離散的點(diǎn)”一個(gè)省份可能就幾十個(gè)國(guó)家級(jí)站點(diǎn)稀疏程度遠(yuǎn)超想象。處理這類數(shù)據(jù)時(shí)要格外關(guān)注站點(diǎn)元數(shù)據(jù)比如經(jīng)緯度、海拔、遷移歷史這些信息會(huì)直接影響后續(xù)的空間分析。第二類是格點(diǎn)數(shù)據(jù)常見來源是數(shù)值天氣預(yù)報(bào)模式的輸出或再分析資料比如全球再分析產(chǎn)品。這類數(shù)據(jù)的特點(diǎn)是覆蓋均勻、變量豐富溫度、風(fēng)場(chǎng)、位勢(shì)高度等一應(yīng)俱全但空間分辨率通常從幾十公里到上百公里不等對(duì)局地小尺度現(xiàn)象的表達(dá)能力有限。格點(diǎn)數(shù)據(jù)大多采用 NetCDF 或 GRIB 格式存儲(chǔ)需要用專門的庫(kù)來解析。第三類是遙感數(shù)據(jù)包括衛(wèi)星反演產(chǎn)品和雷達(dá)回波數(shù)據(jù)。衛(wèi)星數(shù)據(jù)覆蓋面廣、更新頻繁但反演過程會(huì)引入誤差雷達(dá)數(shù)據(jù)時(shí)間分辨率高能捕捉強(qiáng)對(duì)流過程但受地形遮擋影響明顯。這兩類數(shù)據(jù)在實(shí)際項(xiàng)目中一般作為站點(diǎn)數(shù)據(jù)的補(bǔ)充用于刻畫降水的空間結(jié)構(gòu)或云系演變。第四類是模式輸出數(shù)據(jù)也就是通過數(shù)值模式模擬得到的未來預(yù)測(cè)場(chǎng)。這類數(shù)據(jù)天然具有“預(yù)測(cè)”屬性但存在系統(tǒng)性偏差直接拿來用往往效果不好需要經(jīng)過統(tǒng)計(jì)訂正或偏差校正才能喂給下游模型。1.2 為什么說它是“大數(shù)據(jù)的硬骨頭”氣象數(shù)據(jù)被歸入大數(shù)據(jù)領(lǐng)域不是因?yàn)樗募筮@么簡(jiǎn)單而是它同時(shí)踩中了四個(gè)難點(diǎn)。第一個(gè)難點(diǎn)是強(qiáng)時(shí)空相關(guān)性。氣象要素在空間上是連續(xù)演變的在時(shí)間上又有明顯的日循環(huán)、季節(jié)循環(huán)和年際變化。普通的機(jī)器學(xué)習(xí)假設(shè)樣本獨(dú)立但氣象數(shù)據(jù)里一個(gè)站點(diǎn)的溫度與周邊站點(diǎn)的溫度高度相關(guān)昨天的溫度與今天的溫度高度相關(guān)。這種相關(guān)性如果處理不好模型評(píng)估時(shí)容易出現(xiàn)“看起來很高實(shí)際上沒用”的假象。第二個(gè)難點(diǎn)是非平穩(wěn)性。氣候系統(tǒng)本身在變化加上城市熱島、地形、環(huán)流異常等影響氣象序列的統(tǒng)計(jì)特征會(huì)隨時(shí)間改變。今天擬合的模型半年后可能就失效了。所以氣象建模不能只做一次訓(xùn)練要考慮滑動(dòng)窗口的更新策略。第三個(gè)難點(diǎn)是多尺度過程。天氣現(xiàn)象從分鐘級(jí)的雷暴到月尺度的大氣環(huán)流異常時(shí)間尺度跨越很大空間上從幾百米的局地對(duì)流到幾千公里的天氣系統(tǒng)又是另一個(gè)維度的跨度。沒有哪個(gè)單一模型能表達(dá)所有尺度實(shí)際項(xiàng)目中必須先明確目標(biāo)尺度再選擇數(shù)據(jù)和方法。第四個(gè)難點(diǎn)是噪聲與誤差交織。觀測(cè)儀器故障、傳輸損耗、站點(diǎn)搬遷、人為錄入錯(cuò)誤都會(huì)讓數(shù)據(jù)里混入各種離群值。再分析資料和衛(wèi)星反演產(chǎn)品雖然看著“干凈”但誤差結(jié)構(gòu)復(fù)雜。不做好質(zhì)量控制模型學(xué)到的可能不是天氣規(guī)律而是數(shù)據(jù)噪聲。所以我的經(jīng)驗(yàn)是氣象數(shù)據(jù)分析項(xiàng)目的核心工作量往往不在模型訓(xùn)練而在于數(shù)據(jù)理解、清洗和特征構(gòu)造上。誰(shuí)能把數(shù)據(jù)理順誰(shuí)就贏了一大半。2. 數(shù)據(jù)獲取與預(yù)處理氣象分析的“隱形工作量”2.1 數(shù)據(jù)源選擇與格式解析數(shù)據(jù)源的選擇直接影響后續(xù)的預(yù)處理工作量。我第一次做降水預(yù)測(cè)的時(shí)候圖省事直接下載了某個(gè)再分析產(chǎn)品的網(wǎng)格數(shù)據(jù)結(jié)果發(fā)現(xiàn)它的降水變量和站點(diǎn)觀測(cè)存在系統(tǒng)性偏差偏差最大的區(qū)域差值能超過百分之五十。后來老老實(shí)實(shí)加了站點(diǎn)數(shù)據(jù)做融合效果才正常。如果你是新手我建議按照“站點(diǎn)觀測(cè)打底、再分析補(bǔ)空間、雷達(dá)衛(wèi)星看過程”的思路來選數(shù)據(jù)。站點(diǎn)觀測(cè)是“真值”空間覆蓋由再分析或格點(diǎn)產(chǎn)品來補(bǔ)雷達(dá)衛(wèi)星資料用于分析具體天氣過程的演變。不同來源數(shù)據(jù)的變量名、單位、坐標(biāo)系、時(shí)間標(biāo)準(zhǔn)都可能不一樣第一步就是把它們統(tǒng)一到一個(gè)標(biāo)準(zhǔn)上。格式解析方面不同數(shù)據(jù)類型的處理工具差異很大。站點(diǎn)觀測(cè)一般是 CSV、Excel 或數(shù)據(jù)庫(kù)表用常見的數(shù)據(jù)處理庫(kù)就能搞定NetCDF 和 GRIB 格式則要用專門的氣象數(shù)據(jù)處理庫(kù)來讀取有幾個(gè)常用庫(kù)可以關(guān)注下讀取 NetCDF 用 netCDF4處理格點(diǎn)場(chǎng)用 xarray讀取 GRIB 用其他專用庫(kù)如 cfgrib。還有一個(gè)容易忽略的點(diǎn)時(shí)刻標(biāo)準(zhǔn)。很多再分析產(chǎn)品用的是 UTC 時(shí)間而站點(diǎn)觀測(cè)往往是本地時(shí)間做時(shí)序分析前必須先統(tǒng)一時(shí)間基準(zhǔn)否則早晚高峰的特征會(huì)被錯(cuò)誤對(duì)齊。2.2 質(zhì)量控制建模前的第一道防線我見過不少分析項(xiàng)目建模代碼寫得花團(tuán)錦簇但數(shù)據(jù)里甚至還有氣溫 80 攝氏度的記錄——這種明顯是儀器故障或傳輸錯(cuò)誤不處理的話模型會(huì)莫名其妙地學(xué)出錯(cuò)誤規(guī)則。質(zhì)量控制必須放在建模之前而且要有層次地做。第一層是氣候極值檢查。每個(gè)站點(diǎn)、每個(gè)月份的氣溫、降水都有合理的物理范圍超出范圍的記錄直接標(biāo)記。比如某站點(diǎn) 7 月氣溫低于零下 20 攝氏度基本可以斷定是錯(cuò)誤。這個(gè)閾值可以根據(jù)該站歷史分位數(shù)來設(shè)定而不是拍腦袋寫死。第二層是內(nèi)部一致性檢查。氣象要素之間是相互制約的比如相對(duì)濕度過高而溫度過低時(shí)往往意味著其中一個(gè)記錄有問題。再比如有降水記錄時(shí)相對(duì)濕度不應(yīng)該低于某個(gè)下限。這類規(guī)則不需要復(fù)雜的算法基于常識(shí)就能實(shí)現(xiàn)但能過濾掉很多“看起來正常其實(shí)錯(cuò)誤”的數(shù)據(jù)。第三層是鄰站對(duì)比。單個(gè)站點(diǎn)的異常很難被發(fā)現(xiàn)但如果與周邊站點(diǎn)的同期記錄做差值就不難判斷了。比如某站點(diǎn)氣溫比周邊所有站點(diǎn)高 15 度以上且持續(xù)多時(shí)次那很可能是儀器故障或站點(diǎn)遷移導(dǎo)致需要做斷點(diǎn)檢測(cè)和修正。質(zhì)量控制做完之后有一個(gè)重要的副產(chǎn)品一套完整的數(shù)據(jù)質(zhì)量標(biāo)記。不要直接把異常數(shù)據(jù)刪掉就完事建議保留原始數(shù)據(jù)和質(zhì)量標(biāo)記列后續(xù)分析無論是做插值還是建模都能根據(jù)需要靈活選擇數(shù)據(jù)。2.3 缺失值與時(shí)空插值補(bǔ)得聰明而不是補(bǔ)得隨意氣象數(shù)據(jù)幾乎不可能沒有缺失值。儀器停機(jī)、通信故障、極端天氣損壞設(shè)備都會(huì)造成時(shí)間或空間上的數(shù)據(jù)空洞。補(bǔ)缺失值的方法要分場(chǎng)景討論。先說時(shí)間序列上的缺失。短時(shí)間缺失比如一兩個(gè)小時(shí)可以用時(shí)間插值線性插值通常就夠如果缺失持續(xù)幾天甚至幾周線性插值就不合適了可以考慮用同期歷史平均或建立站點(diǎn)自身的時(shí)間序列模型來估算。我踩過一個(gè)坑某旅游城市的數(shù)據(jù)在旅游旺季經(jīng)常出現(xiàn)連續(xù)缺失直接做時(shí)間插值后溫度序列變得非常平滑整個(gè)日變化特征都被抹掉了模型自然也就學(xué)不到日變規(guī)律。再說空間上的缺失。當(dāng)某個(gè)站點(diǎn)整體缺測(cè)或數(shù)據(jù)質(zhì)量太差時(shí)要用周邊站點(diǎn)的數(shù)據(jù)來空間插值。常用的方法有反距離權(quán)重插值、克里金插值以及基于機(jī)器學(xué)習(xí)的空間插值。反距離權(quán)重插值簡(jiǎn)單高效但對(duì)站點(diǎn)分布敏感克里金插值能給出誤差估計(jì)但需要擬合變異函數(shù)調(diào)參成本不低機(jī)器學(xué)習(xí)插值比如隨機(jī)森林或梯度提升機(jī)可以加入地形、經(jīng)緯度、海拔等輔助變量效果往往最好但要小心過擬合。我自己的習(xí)慣是常規(guī)補(bǔ)值用反距離權(quán)重插值作為基線精度要求高且輔助變量充分時(shí)用機(jī)器學(xué)習(xí)插值同時(shí)用留一交叉驗(yàn)證來評(píng)估插值誤差而不是拍腦袋決定用哪個(gè)方法。插值后的數(shù)據(jù)也要打上標(biāo)記方便建模時(shí)意識(shí)到哪些是實(shí)測(cè)、哪些是估算。2.4 特征工程把時(shí)間變成特征氣象預(yù)測(cè)建模中原始觀測(cè)值本身往往不是最好的模型輸入。我常用的特征有三類。第一類是滯后特征。當(dāng)前時(shí)刻的天氣與過去幾小時(shí)、過去幾天的天氣密切相關(guān)把前 6 小時(shí)、前 24 小時(shí)的溫度、降水作為特征加入模型通常能顯著提升預(yù)測(cè)精度。這里有個(gè)經(jīng)驗(yàn)滯后期數(shù)的選擇要看具體要素的時(shí)間記憶長(zhǎng)度溫度和氣壓的記憶較長(zhǎng)降水較短不要一刀切。第二類是周期特征。氣象有非常強(qiáng)的日周期和年周期直接用時(shí)間戳的數(shù)字比如 15喂給模型模型很難學(xué)到周期性。更穩(wěn)妥的做法是用正弦余弦編碼比如把一天內(nèi)的小時(shí)數(shù)轉(zhuǎn)換為 sin(2πh/24)、cos(2πh/24)把一年內(nèi)的日期同理編碼。這樣模型能自然理解“午夜”和“正午”的相似性。第三類是空間與地形特征。經(jīng)緯度、海拔、坡度、坡向、離海岸線距離這些對(duì)局地氣候有顯著影響。如果你在處理站點(diǎn)數(shù)據(jù)這些特征直接作為靜態(tài)特征加入模型即可如果你在處理格點(diǎn)數(shù)據(jù)則要額外計(jì)算一些派生變量比如地形起伏度。特征工程做完以后建議做一次簡(jiǎn)單的相關(guān)性分析和特征重要性排序把無關(guān)特征剔除掉而不是一股腦全扔進(jìn)模型。這樣做不僅能減少計(jì)算量也能降低過擬合風(fēng)險(xiǎn)。3. 建模實(shí)踐從統(tǒng)計(jì)模型到深度學(xué)習(xí)的進(jìn)階路線3.1 先建立基線線性回歸和 ARIMA 的價(jià)值很多人建模一上來就上深度學(xué)習(xí)這是最容易翻車的方式。深度學(xué)習(xí)模型對(duì)數(shù)據(jù)量和數(shù)據(jù)質(zhì)量的要求很高氣象數(shù)據(jù)雖然量大但有效樣本往往并不充足尤其是站點(diǎn)尺度的預(yù)測(cè)任務(wù)。我的建議是先做簡(jiǎn)單模型建立一個(gè)可靠的基線。線性回歸是第一個(gè)值得做的模型。把滯后特征、周期特征、空間特征拼起來做一個(gè)線性回歸雖然預(yù)測(cè)能力有限但可以提供以下信息特征方向是否合理、哪些特征重要、數(shù)據(jù)是否存在明顯的線性關(guān)系。如果線性回歸的效果慘不忍睹那大概率是特征構(gòu)造出了問題而不是模型不夠先進(jìn)。時(shí)序方面ARIMA 類模型是經(jīng)典選擇。它特別適合單變量、平穩(wěn)性較好的序列比如某個(gè)站點(diǎn)的日平均溫度預(yù)測(cè)。用 ARIMA 做基線的好處是它完全基于統(tǒng)計(jì)理論能給出可解釋的預(yù)測(cè)區(qū)間。但它的局限也很明顯難以加入外生變量空間信息幾乎用不上遇到強(qiáng)非線性過程就顯得吃力。基線模型存在的意義在于它給后續(xù)所有復(fù)雜模型提供了一個(gè)比較基準(zhǔn)。如果 XGBoost 比線性回歸只提升了不到百分之五你就要反思是不是特征沒做好或者數(shù)據(jù)本身就沒有更多可學(xué)的信號(hào)。相反如果某個(gè)模型顯著超過基線你才能確信提升是真實(shí)的。3.2 機(jī)器學(xué)習(xí)模型梯度提升樹的實(shí)戰(zhàn)要點(diǎn)在氣象預(yù)測(cè)任務(wù)里梯度提升樹可能是性價(jià)比最高的模型。它不需要做太多的數(shù)據(jù)標(biāo)準(zhǔn)化對(duì)缺失值有較好的容忍度能自動(dòng)處理特征交互。我最常用的幾個(gè)訓(xùn)練要點(diǎn)這里多說幾句。第一個(gè)要點(diǎn)是時(shí)序交叉驗(yàn)證。普通機(jī)器學(xué)習(xí)習(xí)慣用隨機(jī)劃分來訓(xùn)練和驗(yàn)證但氣象數(shù)據(jù)是強(qiáng)時(shí)序數(shù)據(jù)隨機(jī)劃分會(huì)導(dǎo)致數(shù)據(jù)泄漏模型在訓(xùn)練時(shí)見過驗(yàn)證集相鄰時(shí)刻的樣本評(píng)估結(jié)果會(huì)虛高。正確做法是按時(shí)序劃分比如用前 70% 的時(shí)間做訓(xùn)練、后 30% 做驗(yàn)證或者用滾動(dòng)窗口的方式。這是判斷模型真實(shí)效果的核心點(diǎn)我在第五部分會(huì)展開講。第二個(gè)要點(diǎn)是滑動(dòng)窗口構(gòu)造樣本。預(yù)測(cè)未來某個(gè)時(shí)刻的氣象量時(shí)要把過去一段時(shí)間的序列數(shù)據(jù)整理成樣本矩陣。舉個(gè)例子如果預(yù)測(cè)未來 6 小時(shí)的溫度你可以把過去 72 小時(shí)的溫度、濕度、氣壓序列作為特征輸入輸出未來 6 小時(shí)的溫度值。窗口長(zhǎng)度的選擇沒有定論我一般通過小范圍搜索來定而不是經(jīng)驗(yàn)拍板。第三個(gè)要點(diǎn)是處理樣本不平衡和時(shí)間權(quán)重。氣象事件里極端降水、高溫?zé)崂硕际巧贅颖臼录P吞烊粌A向預(yù)測(cè)“普通天氣”。如果業(yè)務(wù)目標(biāo)就是捕捉極端事件需要在損失函數(shù)或樣本權(quán)重上做文章比如給極端樣本加權(quán)或者使用分位數(shù)損失而非均方誤差。還有一個(gè)容易被忽略的細(xì)節(jié)是特征的時(shí)間對(duì)齊。做預(yù)測(cè)時(shí)特征必須全部來自過去時(shí)刻絕不能混入未來信息。我在早期項(xiàng)目里犯過這個(gè)錯(cuò)把當(dāng)天觀測(cè)的降水量當(dāng)成特征去預(yù)測(cè)當(dāng)天的降水量評(píng)估時(shí)效果出奇地好上線后立刻被打臉。3.3 深度學(xué)習(xí)模型什么場(chǎng)景真正需要深度學(xué)習(xí)和機(jī)器學(xué)習(xí)模型最大的差異在于深度學(xué)習(xí)擅長(zhǎng)自動(dòng)提取時(shí)空特征特別是處理圖像類、序列類的數(shù)據(jù)。如果你手頭只有稀疏的站點(diǎn)觀測(cè)用深度學(xué)習(xí)反而可能不如梯度提升樹但如果你面對(duì)的是格點(diǎn)數(shù)據(jù)或雷達(dá)圖像深度學(xué)習(xí)就有明顯優(yōu)勢(shì)了。LSTM 是處理時(shí)間序列的常用選擇適合捕捉較長(zhǎng)時(shí)段內(nèi)的依賴關(guān)系。在站點(diǎn)溫度預(yù)測(cè)任務(wù)上如果數(shù)據(jù)長(zhǎng)度足夠、特征構(gòu)造合理LSTM 通常能逼近甚至超過梯度提升樹的效果但訓(xùn)練成本高出不少。我的經(jīng)驗(yàn)是先做梯度提升樹如果它已經(jīng)無法再提升再考慮 LSTM。ConvLSTM 這類時(shí)空卷積模型則更適合空間場(chǎng)預(yù)測(cè)。它能把雷達(dá)回波的連續(xù)幀作為輸入學(xué)習(xí)云團(tuán)的移動(dòng)和演變常用于短時(shí)強(qiáng)降水預(yù)報(bào)這類任務(wù)。但這類模型訓(xùn)練起來非常吃算力數(shù)據(jù)預(yù)處理也復(fù)雜不是新手入門該碰的第一站。還有一個(gè)趨勢(shì)值得關(guān)注Transformer 結(jié)構(gòu)也被用于氣象時(shí)序建模。它的優(yōu)勢(shì)在于能建模長(zhǎng)距離依賴但需要的數(shù)據(jù)量和調(diào)參工作量都比較大。我的建議是不要盲目追新先判斷任務(wù)的輸入輸出形態(tài)再?zèng)Q定用哪類模型。圖表型的任務(wù)可以考慮梯度提升樹和 LSTM圖像型的任務(wù)再考慮時(shí)空卷積類模型。4. 實(shí)戰(zhàn)復(fù)盤搭一個(gè)站點(diǎn)溫度預(yù)測(cè) Demo 的完整流程4.1 業(yè)務(wù)目標(biāo)與評(píng)估指標(biāo)先定義清楚“怎樣算好”任何數(shù)據(jù)科學(xué)項(xiàng)目的第一步都是把問題定義清楚。我拿一個(gè)典型的任務(wù)舉例基于某地區(qū)過去 5 年的站點(diǎn)觀測(cè)數(shù)據(jù)預(yù)測(cè)未來 24 小時(shí)的逐小時(shí)氣溫序列。這個(gè)問題看似簡(jiǎn)單但有幾個(gè)細(xì)節(jié)要定清楚預(yù)測(cè)時(shí)效是 24 小時(shí)這一個(gè)點(diǎn)還是滾動(dòng)預(yù)測(cè) 24 個(gè)時(shí)次輸出是單站點(diǎn)還是多站點(diǎn)是否需要給出預(yù)測(cè)區(qū)間這些決策直接影響數(shù)據(jù)構(gòu)造和模型選擇。評(píng)估指標(biāo)方面常用的是平均絕對(duì)誤差MAE和均方根誤差RMSE。MAE 直觀易懂RMSE 對(duì)大的誤差更敏感。在氣象業(yè)務(wù)里還有一個(gè)??吹闹笜?biāo)是趨勢(shì)命中率也就是預(yù)測(cè)的變化方向和實(shí)際是否一致。不要在論文里只挑對(duì)自己有利的指標(biāo)實(shí)踐項(xiàng)目中通常多個(gè)指標(biāo)一起看。我個(gè)人的習(xí)慣是先定義好主指標(biāo)和輔助指標(biāo)寫清楚完整的數(shù)據(jù)流再開始寫代碼。這個(gè)習(xí)慣幫我省下了大量返工時(shí)間。4.2 從原始數(shù)據(jù)到模型輸入的完整鏈路這里我用一個(gè)簡(jiǎn)化版的代碼流程來演示假設(shè)我們有一張小時(shí)級(jí)站點(diǎn)觀測(cè)表字段包含站點(diǎn)編號(hào)、時(shí)間戳、氣溫、相對(duì)濕度、風(fēng)速、氣壓。目標(biāo)是建立預(yù)測(cè)模型輸入過去 72 小時(shí)各要素輸出未來 1 小時(shí)的氣溫。第一步是加載數(shù)據(jù)和時(shí)間標(biāo)準(zhǔn)統(tǒng)一。這個(gè)步驟雖然簡(jiǎn)單但我特別強(qiáng)調(diào)一下所有時(shí)間統(tǒng)一成 UTC 存儲(chǔ)展示時(shí)再轉(zhuǎn)本地時(shí)間這是避免跨站點(diǎn)時(shí)間錯(cuò)位的標(biāo)準(zhǔn)做法。第二步是清洗和質(zhì)量控制。剔除明顯異常值用站點(diǎn)歷史分位數(shù)標(biāo)記離群點(diǎn)將缺失值標(biāo)記而不急著填充建模時(shí)讓模型自行處理或采用前向填充。第三步是特征構(gòu)造。生成時(shí)間特征小時(shí)正弦余弦、日期正弦余弦、滯后特征過去 72 小時(shí)的溫度滯后序列、滾動(dòng)統(tǒng)計(jì)特征過去 6 小時(shí)溫度均值、過去 24 小時(shí)溫度標(biāo)準(zhǔn)差再加上靜態(tài)特征站點(diǎn)海拔、經(jīng)緯度。第四步是構(gòu)造訓(xùn)練集和驗(yàn)證集。按時(shí)間順序切分前 80% 時(shí)間窗口做訓(xùn)練后 20% 做驗(yàn)證。注意驗(yàn)證集絕不能混入訓(xùn)練集之后的信息。下面是一個(gè)參考用的代碼框架它展示的是特征構(gòu)造和時(shí)序切分的核心邏輯具體實(shí)現(xiàn)需要根據(jù)你的數(shù)據(jù)字段來調(diào)整import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import mean_absolute_error # 假設(shè) df 已加載包含列station, time, temp, hum, wind, pres df df.sort_values([station, time]).reset_index(dropTrue) def add_time_features(df): df df.copy() t pd.to_datetime(df[time]) df[hour_sin] np.sin(2 * np.pi * t.dt.hour / 24) df[hour_cos] np.cos(2 * np.pi * t.dt.hour / 24) df[doy_sin] np.sin(2 * np.pi * t.dt.dayofyear / 365) df[doy_cos] np.cos(2 * np.pi * t.dt.dayofyear / 365) return df def add_lag_features(df, lags): df df.copy() for lag in lags: df[ftemp_lag_{lag}] df.groupby(station)[temp].shift(lag) return df df add_time_features(df) df add_lag_features(df, lags[1, 3, 6, 12, 24, 48, 72]) # 預(yù)測(cè)目標(biāo)未來1小時(shí)溫度即當(dāng)前時(shí)間點(diǎn)的temp df[target] df[temp] # 按時(shí)間排序切分前80%訓(xùn)練后20%驗(yàn)證 cut_idx int(len(df) * 0.8) train df.iloc[:cut_idx] valid df.iloc[cut_idx:] feature_cols [hour_sin, hour_cos, doy_sin, doy_cos, temp_lag_1, temp_lag_3, temp_lag_6, temp_lag_12, temp_lag_24, temp_lag_48, temp_lag_72, hum, wind, pres] X_train, y_train train[feature_cols], train[target] X_valid, y_valid valid[feature_cols], valid[target] model GradientBoostingRegressor( n_estimators500, max_depth5, learning_rate0.05, random_state42 ) model.fit(X_train.dropna(), y_train.dropna()) y_pred model.predict(X_valid.dropna()) valid_clean valid.dropna(subsetfeature_cols [target]) mae mean_absolute_error(valid_clean[target], y_pred) print(valid_clean.shape[0], mae)注意上面代碼里的一個(gè)細(xì)節(jié)shift 操作會(huì)造成序列前幾個(gè)時(shí)刻出現(xiàn) NaNdropna 之后樣本量會(huì)減少這是正常的。如果數(shù)據(jù)量緊張可以縮小滯后窗口或補(bǔ)充插值但原則是不能把缺失值不做標(biāo)記就硬喂給模型。4.3 結(jié)果分析與“多走一步”的價(jià)值模型跑完不是終點(diǎn)結(jié)果分析才是真正漲經(jīng)驗(yàn)的地方。我會(huì)做三件事。第一件是畫殘差圖。把預(yù)測(cè)值和真實(shí)值的差值按時(shí)間畫出來觀察殘差是否有明顯的周期性。如果每天的同一個(gè)時(shí)段殘差都特別大說明時(shí)間特征沒有encode好。如果殘差在某個(gè)站點(diǎn)系統(tǒng)性偏大說明該站點(diǎn)的數(shù)據(jù)質(zhì)量或代表性有問題。第二件是按季節(jié)和天氣過程分組評(píng)估。全樣本的 MAE 為 1.2 攝氏度聽起來不錯(cuò)但分開看會(huì)發(fā)現(xiàn)冬季冷空氣過程期間 MAE 可能到了 2.5 攝氏度夏季雷暴過程則更大。這樣的分組評(píng)估能幫你定位模型的薄弱環(huán)節(jié)下一步才能有針對(duì)性地改進(jìn)。第三件是做誤差溯源。預(yù)測(cè)某個(gè)站點(diǎn)、某個(gè)時(shí)刻誤差大去翻一下原始數(shù)據(jù)是不是站點(diǎn)在那個(gè)時(shí)段缺測(cè)嚴(yán)重是不是上游特征本身就缺了一大半誤差不完全來自模型本身很多時(shí)候是數(shù)據(jù)和特征的問題。在這個(gè)基礎(chǔ)上我建議“多走一步”把結(jié)果和簡(jiǎn)單的氣候態(tài)基線做對(duì)比比如“今天的氣溫等于歷史同日平均”的預(yù)測(cè)誤差。如果復(fù)雜模型連這個(gè)基線都打不過那說明建模思路有問題而不是模型不夠強(qiáng)。這一步能讓你看清模型的真實(shí)增量?jī)r(jià)值。5. 避坑指南氣象數(shù)據(jù)建模的五個(gè)隱藏陷阱5.1 陷阱一時(shí)間泄漏讓模型“未卜先知”時(shí)間泄漏是氣象時(shí)序建模里最隱蔽、也最致命的錯(cuò)誤。常見的泄漏方式有兩種一種是把未來時(shí)刻的觀測(cè)值誤當(dāng)作特征比如用目標(biāo)時(shí)刻的風(fēng)速字段來預(yù)測(cè)同一時(shí)刻的溫度而實(shí)際業(yè)務(wù)里你拿不到未來的風(fēng)速另一種是在特征工程中用了全局統(tǒng)計(jì)量比如用整個(gè)數(shù)據(jù)集計(jì)算出的均值或標(biāo)準(zhǔn)差來做標(biāo)準(zhǔn)化這樣驗(yàn)證集的信息已經(jīng)污染了訓(xùn)練過程。判斷是否泄漏有一個(gè)笨辦法把特征矩陣?yán)锼辛械臅r(shí)序位置檢查一遍確保每一列相對(duì)于目標(biāo)時(shí)刻都是“過去”的信息。我每次做新項(xiàng)目都會(huì)專門跑一次這個(gè)檢查吃過虧之后再也不敢跳過這一步。5.2 陷阱二隨機(jī)切分導(dǎo)致評(píng)估虛高時(shí)序數(shù)據(jù)切分必須用時(shí)間順序這一點(diǎn)我在前面反復(fù)強(qiáng)調(diào)過。隨機(jī)切分在氣象場(chǎng)景下幾乎沒有正當(dāng)性因?yàn)橄噜彆r(shí)刻的樣本高度相似隨機(jī)把一部分樣本分到驗(yàn)證集會(huì)帶來信息泄漏導(dǎo)致驗(yàn)證誤差遠(yuǎn)低于真實(shí)場(chǎng)景誤差。更穩(wěn)健的做法是阻塞式時(shí)序驗(yàn)證也就是用一個(gè)完整的時(shí)間段做驗(yàn)證比如訓(xùn)練用去年及以前的數(shù)據(jù)驗(yàn)證用今年的數(shù)據(jù)。如果數(shù)據(jù)量夠還可以做滾動(dòng)驗(yàn)證逐月向前推進(jìn)模擬真實(shí)的在線更新場(chǎng)景。雖然這樣訓(xùn)練成本更高但算出的誤差可信度完全不同。5.3 陷阱三站點(diǎn)稀疏帶來的偽空間規(guī)律站點(diǎn)數(shù)據(jù)在空間上往往分布不均城市周邊站點(diǎn)密集偏遠(yuǎn)地區(qū)可能幾百公里才有一個(gè)站點(diǎn)。插值出來的空間場(chǎng)只是近似不代表真實(shí)天氣。模型如果在這些插值數(shù)據(jù)上訓(xùn)練會(huì)把插值算法的誤差當(dāng)作真實(shí)的空間規(guī)律學(xué)進(jìn)去。一個(gè)典型的例子是用反距離權(quán)重插值生成高分辨率溫度場(chǎng)然后訓(xùn)練模型結(jié)果模型輸出了許多不自然的“牛眼”結(jié)構(gòu)也就是圍繞站點(diǎn)的環(huán)形等值線。這種結(jié)果看起來很精細(xì)實(shí)際上是插值偽影。解決方法是要么明確模型分辨率與站點(diǎn)密度的關(guān)系要么在訓(xùn)練時(shí)給插值置信度低的區(qū)域降低權(quán)重。5.4 陷阱四評(píng)估指標(biāo)的季節(jié)性偽裝氣象要素有明顯的季節(jié)變化冬天冷夏天暖如果模型只是學(xué)會(huì)了“冬天溫度低夏天溫度高”這個(gè)粗略規(guī)律全年平均誤差看起來也不會(huì)太差。但這種模型在實(shí)際預(yù)測(cè)極端天氣時(shí)毫無用處。要拆穿這個(gè)假象需要做兩項(xiàng)分析一是按季節(jié)、甚至按月分組計(jì)算誤差看模型在過渡季節(jié)的表現(xiàn)二是計(jì)算異常事件期間的技能分?jǐn)?shù)比如寒潮、熱浪期間模型的誤差是否顯著拉大。如果模型只在氣候態(tài)層面“表現(xiàn)良好”在異常過程中誤差飆升那它就不是一個(gè)合格的預(yù)測(cè)模型。5.5 陷阱五坐標(biāo)系與時(shí)間基準(zhǔn)的混亂最后一個(gè)坑看起來低級(jí)但實(shí)際項(xiàng)目里概率極高。不同來源數(shù)據(jù)的坐標(biāo)系可能不同格點(diǎn)數(shù)據(jù)的經(jīng)緯度基準(zhǔn)、投影方式、變量單位都可能不一致。還有一個(gè)常被忽略的問題是時(shí)間基準(zhǔn)地區(qū)本地時(shí)間、UTC、地方平太陽(yáng)時(shí)混在一起如果不做統(tǒng)一任何時(shí)序模型都會(huì)出錯(cuò)。我的處理習(xí)慣是在項(xiàng)目開始時(shí)建立一張“數(shù)據(jù)字典”記錄每個(gè)數(shù)據(jù)源的名稱、變量、單位、坐標(biāo)系統(tǒng)、時(shí)間基準(zhǔn)和更新頻次。后續(xù)所有處理步驟都以這張字典為準(zhǔn)。項(xiàng)目越往后這張字典的價(jià)值越大因?yàn)樗鼙苊饽阍谝欢选案杏X對(duì)但不確定”的數(shù)據(jù)里反復(fù)試錯(cuò)。常見問題典型現(xiàn)象排查思路預(yù)防手段時(shí)間泄漏驗(yàn)證集誤差異常低上線后誤差飆升逐列檢查特征時(shí)間位置確認(rèn)無未來信息建立特征時(shí)間索引寫自動(dòng)化檢查隨機(jī)切分評(píng)估指標(biāo)遠(yuǎn)好于業(yè)務(wù)實(shí)測(cè)改用時(shí)間順序切分或滾動(dòng)驗(yàn)證在管線里固化時(shí)序切分邏輯插值偽影空間場(chǎng)出現(xiàn)環(huán)繞站點(diǎn)的牛眼對(duì)比不同插值方法與站點(diǎn)原始值降低低置信度區(qū)域的權(quán)重季節(jié)性偽裝全年誤差低極端事件誤差大按月、按過程分組評(píng)估誤差極端事件單獨(dú)設(shè)置評(píng)估目標(biāo)坐標(biāo)時(shí)間混亂模型輸出明顯不合理核對(duì)坐標(biāo)系與時(shí)間基準(zhǔn)建立數(shù)據(jù)字典統(tǒng)一標(biāo)準(zhǔn)以下小技巧是按我個(gè)人經(jīng)驗(yàn)總結(jié)的對(duì)于梯度提升樹一類的模型不過度標(biāo)準(zhǔn)化數(shù)據(jù)完全沒問題但如果用神經(jīng)網(wǎng)絡(luò)輸入特征的尺度統(tǒng)一就特別重要否則訓(xùn)練會(huì)非常不穩(wěn)定。這一類差異在項(xiàng)目早期就應(yīng)該通過模型選型明確下來。氣象數(shù)據(jù)分析這個(gè)方向做得越久越會(huì)感覺到它的復(fù)雜性。數(shù)字看起來簡(jiǎn)單但背后涉及數(shù)據(jù)、物理、統(tǒng)計(jì)、工程的交叉任何一個(gè)環(huán)節(jié)掉鏈子都會(huì)影響最終結(jié)果。這篇文章里寫的每一條經(jīng)驗(yàn)幾乎都是從實(shí)際項(xiàng)目中踩坑踩出來的。如果你正準(zhǔn)備開始自己的氣象數(shù)據(jù)分析項(xiàng)目希望這些內(nèi)容能幫你少走一些彎路把時(shí)間花在真正重要的地方——理解數(shù)據(jù)理解場(chǎng)景然后才是跑模型。