序數(shù)據(jù)趨勢(shì)預(yù)測(cè)實(shí)操指南)
1. 從一組時(shí)序數(shù)據(jù)到趨勢(shì)預(yù)測(cè)我為什么盯上了 TimechoAI手頭有一批設(shè)備傳感器采集的時(shí)序數(shù)據(jù)采樣頻率不高大概每十分鐘一個(gè)點(diǎn)攢了幾個(gè)月量級(jí)在幾十萬條左右。業(yè)務(wù)側(cè)的需求很直接能不能基于歷史走勢(shì)給出未來一段時(shí)間的趨勢(shì)預(yù)測(cè)哪怕只是一個(gè)大致的走向判斷也好過每次開會(huì)都靠人拍腦袋。我一開始想的是走傳統(tǒng)路線用統(tǒng)計(jì)模型或者機(jī)器學(xué)習(xí)那一套但真正上手才發(fā)現(xiàn)時(shí)序預(yù)測(cè)這件事門檻不在模型本身而在數(shù)據(jù)預(yù)處理、特征工程、模型調(diào)參這一整條鏈路上。光是缺失值填補(bǔ)和異常點(diǎn)剔除就夠折騰好幾天。后來接觸到 TimechoAI它的定位是面向時(shí)序數(shù)據(jù)的智能分析平臺(tái)核心能力之一就是時(shí)序大模型驅(qū)動(dòng)的趨勢(shì)預(yù)測(cè)。簡(jiǎn)單說你把時(shí)序數(shù)據(jù)整理好丟進(jìn)去它幫你完成建模、訓(xùn)練、預(yù)測(cè)這一整套流程輸出未來趨勢(shì)的預(yù)測(cè)結(jié)果。我實(shí)測(cè)下來從數(shù)據(jù)準(zhǔn)備到拿到預(yù)測(cè)曲線整個(gè)過程壓縮到了幾分鐘級(jí)別這個(gè)效率對(duì)于我這種不想在建模細(xì)節(jié)上耗太多精力的人來說吸引力很大。這篇文章就是把我這次實(shí)操的完整過程、踩過的坑、以及一些參數(shù)選擇上的思考整理出來適合手頭有時(shí)序數(shù)據(jù)、想做趨勢(shì)預(yù)測(cè)但不想從零搭建模型管線的朋友參考。不管你是做設(shè)備運(yùn)維、能耗分析還是業(yè)務(wù)指標(biāo)監(jiān)控只要涉及時(shí)間序列這套思路都能借鑒。2. 時(shí)序數(shù)據(jù)趨勢(shì)預(yù)測(cè)的整體思路拆解2.1 為什么不用傳統(tǒng)統(tǒng)計(jì)模型硬扛?jìng)鹘y(tǒng)時(shí)序預(yù)測(cè)里ARIMA、指數(shù)平滑這類方法用得很多它們對(duì)平穩(wěn)性有要求遇到有明顯趨勢(shì)和季節(jié)性的數(shù)據(jù)得先做差分、分解參數(shù)還得靠ACF、PACF圖去人工判斷。我試過用ARIMA跑這批數(shù)據(jù)光確定差分階數(shù)就來回試了好幾輪而且它對(duì)突變點(diǎn)的響應(yīng)很遲鈍一旦設(shè)備工況發(fā)生變化預(yù)測(cè)結(jié)果就明顯跑偏。機(jī)器學(xué)習(xí)方法比如XGBoost做時(shí)序預(yù)測(cè)需要自己構(gòu)造滯后特征、滑動(dòng)窗口統(tǒng)計(jì)量特征工程的工作量不小而且模型泛化能力依賴特征質(zhì)量換個(gè)場(chǎng)景就得重來一遍。時(shí)序大模型的出現(xiàn)本質(zhì)上是把“特征工程模型選擇調(diào)參”這些環(huán)節(jié)用預(yù)訓(xùn)練的方式內(nèi)化掉了。TimechoAI背后的時(shí)序大模型在海量時(shí)序數(shù)據(jù)上做過預(yù)訓(xùn)練對(duì)趨勢(shì)、周期性、突變這些模式有天然的感知能力你只需要把數(shù)據(jù)喂進(jìn)去它就能給出預(yù)測(cè)。這就好比以前做菜得自己種菜、切菜、配料現(xiàn)在直接給你一個(gè)半成品料理包加熱就能上桌。當(dāng)然料理包也有局限后面我會(huì)講到什么情況下它可能不如自己從頭做。2.2 TimechoAI 的預(yù)測(cè)能力適合什么場(chǎng)景從我的使用體驗(yàn)看TimechoAI的趨勢(shì)預(yù)測(cè)比較適合這幾類場(chǎng)景一是設(shè)備運(yùn)行指標(biāo)的短期走勢(shì)預(yù)判比如溫度、振動(dòng)、電流這些用來做預(yù)警二是業(yè)務(wù)指標(biāo)的周期性預(yù)測(cè)比如日活、訂單量、能耗用來做資源調(diào)度三是傳感器數(shù)據(jù)的補(bǔ)全和外推比如某些時(shí)段數(shù)據(jù)缺失用預(yù)測(cè)值臨時(shí)填補(bǔ)。它不太適合的場(chǎng)景是數(shù)據(jù)量極少比如只有幾十個(gè)點(diǎn)、數(shù)據(jù)本身沒有明顯規(guī)律純隨機(jī)噪聲、或者對(duì)預(yù)測(cè)精度要求極高到需要定制化建模的程度。這幾點(diǎn)在后面實(shí)操部分我會(huì)結(jié)合具體數(shù)據(jù)再展開。2.3 整體流程長(zhǎng)什么樣我把這次實(shí)操的流程拆成四步數(shù)據(jù)準(zhǔn)備、接入TimechoAI、配置預(yù)測(cè)任務(wù)、結(jié)果解讀與驗(yàn)證。數(shù)據(jù)準(zhǔn)備階段主要是把原始時(shí)序數(shù)據(jù)整理成平臺(tái)能識(shí)別的格式包括時(shí)間戳對(duì)齊、缺失值處理、異常值標(biāo)記。接入階段通過Python SDK完成這也是熱詞里提到的Python SDK的用武之地。配置預(yù)測(cè)任務(wù)時(shí)需要指定預(yù)測(cè)步長(zhǎng)、時(shí)間粒度這些參數(shù)。最后拿到預(yù)測(cè)結(jié)果后不能直接信得做回測(cè)驗(yàn)證看看模型在歷史數(shù)據(jù)上的表現(xiàn)如何。這四步里第一步最耗時(shí)后面三步反而很快這也是我標(biāo)題里說“幾分鐘跑出預(yù)測(cè)”的前提——數(shù)據(jù)得先整理干凈。3. 數(shù)據(jù)準(zhǔn)備把原始時(shí)序數(shù)據(jù)整理成能用的樣子3.1 時(shí)間戳對(duì)齊與重采樣原始數(shù)據(jù)來自不同設(shè)備時(shí)間戳格式不統(tǒng)一有的精確到秒有的精確到毫秒還有的帶時(shí)區(qū)偏移。第一步就是統(tǒng)一時(shí)間戳格式全部轉(zhuǎn)成標(biāo)準(zhǔn)的時(shí)間對(duì)象。我用的是Python的pandas把時(shí)間列轉(zhuǎn)成datetime類型然后設(shè)置成索引。這里有個(gè)細(xì)節(jié)如果數(shù)據(jù)里有重復(fù)時(shí)間戳需要去重保留最后一條或者取平均具體看業(yè)務(wù)含義。比如傳感器偶爾會(huì)重復(fù)上報(bào)那就保留最后一條如果是多個(gè)傳感器同一時(shí)刻的數(shù)據(jù)那就得先聚合。重采樣是另一個(gè)關(guān)鍵動(dòng)作。原始數(shù)據(jù)采樣頻率可能不一致有的設(shè)備一分鐘一個(gè)點(diǎn)有的十分鐘一個(gè)點(diǎn)。TimechoAI對(duì)輸入數(shù)據(jù)的采樣間隔有一定要求最好是等間隔的。我的做法是統(tǒng)一重采樣到十分鐘粒度用均值聚合。如果某個(gè)時(shí)間窗口內(nèi)沒有數(shù)據(jù)就會(huì)產(chǎn)生缺失值這時(shí)候先標(biāo)記出來后面統(tǒng)一處理。重采樣的代碼大概長(zhǎng)這樣import pandas as pd df pd.read_csv(sensor_data.csv) df[timestamp] pd.to_datetime(df[timestamp]) df df.set_index(timestamp).sort_index() df df[~df.index.duplicated(keeplast)] df_resampled df.resample(10T).mean()這段代碼里resample(10T)表示按十分鐘重采樣mean()是聚合方式。如果你的數(shù)據(jù)是累計(jì)值比如電表讀數(shù)那就不能用均值得用差分或者取最后一個(gè)值。這個(gè)選擇直接影響后續(xù)預(yù)測(cè)的合理性不能隨便選。3.2 缺失值處理別急著填先搞清楚為什么缺缺失值處理是時(shí)序數(shù)據(jù)里最容易被忽視的環(huán)節(jié)。很多人一看到缺失就直接往前填充或者插值但缺失的原因不同處理方式也應(yīng)該不同。我一般先統(tǒng)計(jì)缺失比例如果某個(gè)字段缺失超過30%那這個(gè)字段基本沒法用直接放棄。如果缺失比例在5%以內(nèi)可以考慮插值。插值方法有線性插值、前向填充、樣條插值等我常用的是線性插值因?yàn)樗鼘?duì)趨勢(shì)的扭曲最小。但有一種情況要特別注意如果缺失是成段出現(xiàn)的比如設(shè)備停機(jī)了三天那這三天的數(shù)據(jù)不是“缺失”而是“不存在”強(qiáng)行插值會(huì)引入虛假趨勢(shì)。我的做法是給這段數(shù)據(jù)打上標(biāo)記在后續(xù)預(yù)測(cè)時(shí)告訴模型這段不可信。TimechoAI的SDK支持傳入一個(gè)質(zhì)量標(biāo)記列用來標(biāo)識(shí)數(shù)據(jù)點(diǎn)的可信度這個(gè)功能很實(shí)用后面會(huì)講到怎么用。3.3 異常值識(shí)別與處理異常值識(shí)別我用了兩種方法結(jié)合一種是基于統(tǒng)計(jì)的比如3σ原則超過均值加減三倍標(biāo)準(zhǔn)差的點(diǎn)標(biāo)記為異常另一種是基于業(yè)務(wù)規(guī)則的比如溫度不可能超過某個(gè)閾值超過了就是傳感器故障。兩種方法取并集標(biāo)記出所有可疑點(diǎn)。標(biāo)記之后不是直接刪除而是先替換成缺失值再走缺失值處理流程。這樣做的好處是保留時(shí)間連續(xù)性避免刪除后時(shí)間軸出現(xiàn)空洞。這里有個(gè)經(jīng)驗(yàn)異常值處理寧可不處理也不要過度處理。我見過有人把波動(dòng)大的點(diǎn)全當(dāng)異常刪了結(jié)果數(shù)據(jù)變得過于平滑預(yù)測(cè)出來的曲線毫無參考價(jià)值。時(shí)序數(shù)據(jù)本身就有波動(dòng)波動(dòng)不等于異常。判斷標(biāo)準(zhǔn)應(yīng)該是這個(gè)點(diǎn)的偏離是否超出了正常業(yè)務(wù)范圍而不是它是否偏離了統(tǒng)計(jì)均值。4. 通過 Python SDK 接入 TimechoAI 的完整實(shí)操4.1 環(huán)境準(zhǔn)備與SDK安裝接入TimechoAI的第一步是裝SDK。官方提供了Python包直接pip安裝就行。我用的Python版本是3.9實(shí)測(cè)兼容性沒問題。安裝命令很簡(jiǎn)單pip install timechoai-sdk裝完之后需要在代碼里初始化客戶端。初始化需要兩個(gè)東西一個(gè)是服務(wù)地址一個(gè)是訪問憑證。服務(wù)地址在你開通TimechoAI服務(wù)后會(huì)拿到訪問憑證一般是一串密鑰。這兩個(gè)信息不要硬編碼在代碼里建議放到環(huán)境變量或者配置文件里避免泄露。初始化代碼大概是這樣from timechoai import Client client Client( endpointyour_endpoint_here, api_keyyour_api_key_here )初始化完成后可以調(diào)一個(gè)簡(jiǎn)單的方法驗(yàn)證連接是否正常比如獲取服務(wù)狀態(tài)或者列出可用模型。這一步別跳過我一開始就是沒驗(yàn)證后面?zhèn)鲾?shù)據(jù)報(bào)錯(cuò)排查了半天結(jié)果發(fā)現(xiàn)是憑證配錯(cuò)了。4.2 數(shù)據(jù)上傳與格式要求TimechoAI對(duì)上傳的數(shù)據(jù)格式有要求核心是三點(diǎn)時(shí)間戳列、數(shù)值列、可選的標(biāo)記列。時(shí)間戳列必須是標(biāo)準(zhǔn)格式數(shù)值列可以是多個(gè)字段標(biāo)記列用來標(biāo)識(shí)數(shù)據(jù)質(zhì)量。上傳方式有兩種一種是通過SDK直接傳DataFrame另一種是先導(dǎo)出成CSV再上傳。我推薦第一種因?yàn)槭∪チ宋募x寫的麻煩而且SDK會(huì)自動(dòng)做類型檢查。上傳代碼大概長(zhǎng)這樣import pandas as pd df pd.read_csv(cleaned_data.csv, index_coltimestamp, parse_datesTrue) response client.upload_timeseries( dataset_namedevice_sensor_01, datadf, time_columntimestamp, value_columns[temperature, vibration], quality_columnquality_flag ) print(response.status)這里有幾個(gè)細(xì)節(jié)值得說。dataset_name是數(shù)據(jù)集名稱后續(xù)預(yù)測(cè)任務(wù)會(huì)引用這個(gè)名字所以命名要有意義別用默認(rèn)的隨機(jī)字符串。value_columns指定哪些列是數(shù)值列如果DataFrame里還有其他列不會(huì)被上傳。quality_column是可選的如果你在數(shù)據(jù)準(zhǔn)備階段標(biāo)記了不可信數(shù)據(jù)點(diǎn)就通過這個(gè)列傳進(jìn)去。上傳成功后SDK會(huì)返回一個(gè)狀態(tài)確認(rèn)數(shù)據(jù)已經(jīng)入庫(kù)。4.3 預(yù)測(cè)任務(wù)配置步長(zhǎng)、粒度與模型選擇數(shù)據(jù)上傳完成后就可以配置預(yù)測(cè)任務(wù)了。核心參數(shù)有三個(gè)預(yù)測(cè)步長(zhǎng)、時(shí)間粒度、模型類型。預(yù)測(cè)步長(zhǎng)是指你要預(yù)測(cè)未來多少個(gè)時(shí)間點(diǎn)比如你的數(shù)據(jù)是十分鐘粒度你想預(yù)測(cè)未來24小時(shí)那就是144個(gè)點(diǎn)。時(shí)間粒度一般跟輸入數(shù)據(jù)保持一致如果輸入是十分鐘輸出也是十分鐘。模型類型方面TimechoAI提供了幾種預(yù)置模型有偏重短期預(yù)測(cè)的有偏重長(zhǎng)期趨勢(shì)的還有自動(dòng)選擇的。我一般先用自動(dòng)選擇看看效果如果效果不理想再手動(dòng)指定。配置代碼示例forecast client.create_forecast( dataset_namedevice_sensor_01, target_columntemperature, horizon144, frequency10T, model_typeauto )horizon144就是預(yù)測(cè)未來144個(gè)點(diǎn)frequency10T表示十分鐘粒度model_typeauto讓平臺(tái)自動(dòng)選模型。創(chuàng)建任務(wù)后SDK會(huì)返回一個(gè)任務(wù)ID你可以用這個(gè)ID去查詢?nèi)蝿?wù)狀態(tài)和結(jié)果。整個(gè)預(yù)測(cè)過程是異步的提交后不用干等可以去做別的事過幾分鐘回來查結(jié)果就行。5. 預(yù)測(cè)結(jié)果解讀與回測(cè)驗(yàn)證5.1 拿到預(yù)測(cè)結(jié)果后先看什么預(yù)測(cè)任務(wù)完成后SDK會(huì)返回一個(gè)結(jié)果對(duì)象里面包含預(yù)測(cè)值、置信區(qū)間、以及一些模型診斷信息。我拿到結(jié)果后第一件事不是看預(yù)測(cè)曲線而是看置信區(qū)間。置信區(qū)間寬不寬直接反映了模型對(duì)這次預(yù)測(cè)的信心。如果置信區(qū)間特別寬說明模型也不確定那這個(gè)預(yù)測(cè)結(jié)果就只能當(dāng)參考不能當(dāng)決策依據(jù)。第二件事是看模型診斷信息里面會(huì)告訴你用了哪個(gè)模型、訓(xùn)練時(shí)的誤差指標(biāo)是多少。這些信息幫你判斷這次預(yù)測(cè)靠不靠譜。預(yù)測(cè)結(jié)果的可視化也很重要。我一般會(huì)把歷史數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)畫在同一張圖上歷史用實(shí)線預(yù)測(cè)用虛線置信區(qū)間用陰影表示。這樣一眼就能看出預(yù)測(cè)趨勢(shì)是否合理。如果預(yù)測(cè)曲線跟歷史趨勢(shì)明顯脫節(jié)比如歷史一直在漲預(yù)測(cè)突然掉頭向下那就要警惕了可能是數(shù)據(jù)有問題或者模型選錯(cuò)了。5.2 回測(cè)驗(yàn)證用歷史數(shù)據(jù)檢驗(yàn)預(yù)測(cè)能力預(yù)測(cè)結(jié)果不能直接信得做回測(cè)?;販y(cè)的思路很簡(jiǎn)單把歷史數(shù)據(jù)切成兩段前一段用來訓(xùn)練后一段用來驗(yàn)證。比如你有1000個(gè)點(diǎn)用前800個(gè)點(diǎn)訓(xùn)練預(yù)測(cè)后200個(gè)點(diǎn)然后跟真實(shí)值對(duì)比算誤差指標(biāo)。TimechoAI的SDK支持回測(cè)模式你只需要指定回測(cè)的起始點(diǎn)它會(huì)自動(dòng)完成訓(xùn)練和驗(yàn)證。回測(cè)的誤差指標(biāo)我主要看兩個(gè)MAE平均絕對(duì)誤差和MAPE平均絕對(duì)百分比誤差。MAE反映的是絕對(duì)誤差大小MAPE反映的是相對(duì)誤差。如果MAPE在10%以內(nèi)我覺得就可以接受如果在5%以內(nèi)那就算相當(dāng)準(zhǔn)了。當(dāng)然這個(gè)標(biāo)準(zhǔn)因場(chǎng)景而異有些場(chǎng)景對(duì)精度要求極高那就得另說?;販y(cè)代碼示例backtest client.run_backtest( dataset_namedevice_sensor_01, target_columntemperature, train_ratio0.8, horizon200 ) print(backtest.metrics)train_ratio0.8表示用80%的數(shù)據(jù)訓(xùn)練20%用于驗(yàn)證?;販y(cè)完成后backtest.metrics里會(huì)有MAE、MAPE等指標(biāo)。如果指標(biāo)不理想可以調(diào)整模型類型或者預(yù)測(cè)步長(zhǎng)再試。5.3 預(yù)測(cè)結(jié)果怎么用到實(shí)際業(yè)務(wù)里預(yù)測(cè)結(jié)果拿到后怎么用是個(gè)問題。我的做法是短期預(yù)測(cè)比如未來幾小時(shí)用來做實(shí)時(shí)預(yù)警如果預(yù)測(cè)值超過閾值就提前通知運(yùn)維中期預(yù)測(cè)比如未來幾天用來做資源調(diào)度比如提前準(zhǔn)備備件或者調(diào)整負(fù)載長(zhǎng)期預(yù)測(cè)比如未來幾周用來做趨勢(shì)判斷輔助決策。不同時(shí)間尺度的預(yù)測(cè)對(duì)精度的要求不一樣短期預(yù)測(cè)要求準(zhǔn)長(zhǎng)期預(yù)測(cè)看趨勢(shì)就行。還有一點(diǎn)預(yù)測(cè)結(jié)果要定期更新。時(shí)序數(shù)據(jù)是不斷產(chǎn)生的模型也需要定期用新數(shù)據(jù)重新訓(xùn)練。TimechoAI支持定時(shí)任務(wù)你可以設(shè)置每天或每周自動(dòng)跑一次預(yù)測(cè)這樣預(yù)測(cè)結(jié)果始終基于最新數(shù)據(jù)。這個(gè)功能對(duì)于長(zhǎng)期監(jiān)控場(chǎng)景很實(shí)用省去了手動(dòng)觸發(fā)的麻煩。6. 實(shí)操中踩過的坑與常見問題排查6.1 數(shù)據(jù)上傳報(bào)錯(cuò)格式問題的排查思路數(shù)據(jù)上傳報(bào)錯(cuò)是最常見的問題我遇到過的報(bào)錯(cuò)大概有這么幾類時(shí)間戳格式不對(duì)、數(shù)值列里有非數(shù)值內(nèi)容、數(shù)據(jù)量太大超限。時(shí)間戳格式問題最好解決用pandas的to_datetime轉(zhuǎn)一下就行但要注意時(shí)區(qū)問題如果原始數(shù)據(jù)帶時(shí)區(qū)轉(zhuǎn)的時(shí)候要統(tǒng)一。數(shù)值列里有非數(shù)值內(nèi)容通常是數(shù)據(jù)里混了空字符串或者特殊符號(hào)用pd.to_numeric加errorscoerce可以強(qiáng)制轉(zhuǎn)成數(shù)值轉(zhuǎn)不了的變成NaN再走缺失值處理。數(shù)據(jù)量太大超限的話可以分批上傳SDK支持分片上傳具體看文檔。排查的時(shí)候我習(xí)慣先把數(shù)據(jù)在本地做一遍校驗(yàn)檢查時(shí)間戳是否連續(xù)、數(shù)值列是否有異常、數(shù)據(jù)量是否在限制內(nèi)。本地校驗(yàn)通過后再上傳能避免大部分報(bào)錯(cuò)。另外SDK的報(bào)錯(cuò)信息一般比較詳細(xì)會(huì)告訴你哪一列哪一行有問題順著提示排查就行。6.2 預(yù)測(cè)結(jié)果偏差大可能的原因與調(diào)整方法預(yù)測(cè)結(jié)果偏差大原因可能出在數(shù)據(jù)、模型、參數(shù)三個(gè)層面。數(shù)據(jù)層面可能是缺失值處理不當(dāng)、異常值沒清理干凈、或者數(shù)據(jù)本身就沒有規(guī)律。模型層面可能是模型類型選錯(cuò)了比如數(shù)據(jù)有明顯季節(jié)性但用了不適合季節(jié)性的模型。參數(shù)層面可能是預(yù)測(cè)步長(zhǎng)設(shè)得太長(zhǎng)超出了模型的能力范圍。我的排查順序是先看數(shù)據(jù)質(zhì)量再看模型選擇最后調(diào)參數(shù)。數(shù)據(jù)質(zhì)量方面我會(huì)把歷史數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)畫在一起看看預(yù)測(cè)起點(diǎn)附近的數(shù)據(jù)是否正常。如果歷史數(shù)據(jù)在預(yù)測(cè)起點(diǎn)附近有突變那預(yù)測(cè)偏差大是正常的因?yàn)槟P蜎]法預(yù)知突變。模型選擇方面我會(huì)試幾種不同的模型類型對(duì)比回測(cè)指標(biāo)選最好的那個(gè)。參數(shù)方面我會(huì)把預(yù)測(cè)步長(zhǎng)縮短看看短期預(yù)測(cè)是否準(zhǔn)確如果短期準(zhǔn)長(zhǎng)期不準(zhǔn)那就是步長(zhǎng)設(shè)太長(zhǎng)了。6.3 常見問題速查表問題現(xiàn)象可能原因排查方法解決建議上傳報(bào)錯(cuò)“時(shí)間戳格式無效”時(shí)間戳列不是標(biāo)準(zhǔn)格式檢查時(shí)間戳列的數(shù)據(jù)類型用pd.to_datetime轉(zhuǎn)換統(tǒng)一時(shí)區(qū)上傳報(bào)錯(cuò)“數(shù)值列包含非數(shù)值”數(shù)據(jù)里混有空字符串或符號(hào)檢查數(shù)值列的unique值用pd.to_numeric強(qiáng)制轉(zhuǎn)換errorscoerce預(yù)測(cè)結(jié)果是一條直線數(shù)據(jù)沒有明顯趨勢(shì)或模型未收斂檢查歷史數(shù)據(jù)是否有波動(dòng)確認(rèn)數(shù)據(jù)質(zhì)量嘗試手動(dòng)指定模型類型預(yù)測(cè)偏差隨時(shí)間增大預(yù)測(cè)步長(zhǎng)過長(zhǎng)對(duì)比短期和長(zhǎng)期回測(cè)指標(biāo)縮短預(yù)測(cè)步長(zhǎng)或改用偏重長(zhǎng)期趨勢(shì)的模型置信區(qū)間特別寬數(shù)據(jù)噪聲大或模型不確定查看模型診斷信息增加訓(xùn)練數(shù)據(jù)量或做更嚴(yán)格的異常值處理回測(cè)指標(biāo)很好但實(shí)際預(yù)測(cè)不準(zhǔn)過擬合或數(shù)據(jù)分布變化對(duì)比回測(cè)期和實(shí)際預(yù)測(cè)期的數(shù)據(jù)分布定期重新訓(xùn)練模型加入最新數(shù)據(jù)這張表是我在實(shí)際操作中總結(jié)出來的基本上覆蓋了八成以上的常見問題。遇到問題先查表查不到再去看文檔或者提工單。7. 一些參數(shù)選擇上的經(jīng)驗(yàn)與思考7.1 預(yù)測(cè)步長(zhǎng)怎么定才合理預(yù)測(cè)步長(zhǎng)的設(shè)定核心原則是不要超過數(shù)據(jù)本身可支撐的范圍。舉個(gè)例子你的數(shù)據(jù)是十分鐘粒度一天有144個(gè)點(diǎn)如果你要預(yù)測(cè)未來七天那就是1008個(gè)點(diǎn)。這么長(zhǎng)的預(yù)測(cè)步長(zhǎng)模型很難保證精度因?yàn)闀r(shí)間越長(zhǎng)不確定性越大。我的經(jīng)驗(yàn)是預(yù)測(cè)步長(zhǎng)不要超過訓(xùn)練數(shù)據(jù)長(zhǎng)度的十分之一。比如你有10000個(gè)訓(xùn)練點(diǎn)那預(yù)測(cè)步長(zhǎng)控制在1000以內(nèi)比較穩(wěn)妥。如果業(yè)務(wù)上確實(shí)需要更長(zhǎng)的預(yù)測(cè)那就分段預(yù)測(cè)每段短一點(diǎn)然后拼接起來。另外預(yù)測(cè)步長(zhǎng)跟數(shù)據(jù)本身的周期性也有關(guān)。如果數(shù)據(jù)有明顯的日周期那預(yù)測(cè)步長(zhǎng)最好是周期的整數(shù)倍這樣預(yù)測(cè)結(jié)果能覆蓋完整的周期避免出現(xiàn)半截周期導(dǎo)致趨勢(shì)判斷失誤。7.2 時(shí)間粒度選擇粗一點(diǎn)還是細(xì)一點(diǎn)時(shí)間粒度選擇是個(gè)權(quán)衡。粒度越細(xì)數(shù)據(jù)點(diǎn)越多模型能捕捉到的細(xì)節(jié)越多但噪聲也越大而且計(jì)算量也越大。粒度越粗?jǐn)?shù)據(jù)越平滑趨勢(shì)越明顯但可能丟失短期波動(dòng)信息。我的做法是先看業(yè)務(wù)需求如果業(yè)務(wù)關(guān)注的是日內(nèi)波動(dòng)那就用細(xì)粒度比如分鐘級(jí)如果關(guān)注的是長(zhǎng)期趨勢(shì)那就用粗粒度比如小時(shí)級(jí)或天級(jí)。如果不確定可以先試兩種粒度對(duì)比回測(cè)指標(biāo)選效果好的那個(gè)。還有一個(gè)技巧如果原始數(shù)據(jù)粒度很細(xì)但噪聲很大可以先聚合到粗粒度做一次預(yù)測(cè)再把預(yù)測(cè)結(jié)果插值回細(xì)粒度。這樣既能利用粗粒度的穩(wěn)定性又能得到細(xì)粒度的輸出。當(dāng)然插值會(huì)引入誤差具體是否采用要看場(chǎng)景。7.3 模型自動(dòng)選擇與手動(dòng)指定的取舍TimechoAI的自動(dòng)模型選擇在大多數(shù)情況下夠用它會(huì)在幾個(gè)預(yù)置模型里選一個(gè)最適合當(dāng)前數(shù)據(jù)的。但自動(dòng)選擇不是萬能的有些場(chǎng)景下手動(dòng)指定效果更好。比如你的數(shù)據(jù)有很強(qiáng)的季節(jié)性那手動(dòng)指定一個(gè)擅長(zhǎng)季節(jié)性的模型可能比自動(dòng)選擇更準(zhǔn)。再比如你的數(shù)據(jù)量特別大自動(dòng)選擇可能會(huì)選一個(gè)計(jì)算量很大的模型導(dǎo)致預(yù)測(cè)時(shí)間變長(zhǎng)這時(shí)候手動(dòng)指定一個(gè)輕量模型更合適。我的建議是先用自動(dòng)選擇跑一遍看看回測(cè)指標(biāo)。如果指標(biāo)滿意就用自動(dòng)的如果不滿意再手動(dòng)試幾個(gè)模型對(duì)比指標(biāo)。手動(dòng)指定模型時(shí)SDK會(huì)返回每個(gè)模型的診斷信息你可以根據(jù)這些信息判斷哪個(gè)模型更適合你的數(shù)據(jù)。8. 從這次實(shí)操中我總結(jié)出的幾條硬經(jīng)驗(yàn)第一條經(jīng)驗(yàn)數(shù)據(jù)準(zhǔn)備的時(shí)間要留夠。我這次實(shí)操數(shù)據(jù)準(zhǔn)備花了大概兩個(gè)小時(shí)預(yù)測(cè)本身只花了幾分鐘。很多人看到“幾分鐘跑出預(yù)測(cè)”就以為整個(gè)過程都很快其實(shí)不然前面的數(shù)據(jù)清洗和整理才是大頭。如果你手頭的數(shù)據(jù)很干凈那確實(shí)幾分鐘就能出結(jié)果如果數(shù)據(jù)很亂那時(shí)間主要花在整理上。第二條經(jīng)驗(yàn)回測(cè)不能省。我見過有人直接拿預(yù)測(cè)結(jié)果去匯報(bào)結(jié)果被問“你這個(gè)預(yù)測(cè)準(zhǔn)不準(zhǔn)”就答不上來?;販y(cè)就是回答這個(gè)問題的?;◣追昼娕軅€(gè)回測(cè)拿到MAE和MAPE心里有底匯報(bào)的時(shí)候也有依據(jù)。第三條經(jīng)驗(yàn)預(yù)測(cè)結(jié)果要結(jié)合業(yè)務(wù)判斷。模型給出的預(yù)測(cè)是基于歷史數(shù)據(jù)的它不知道未來會(huì)發(fā)生什么。如果業(yè)務(wù)上你知道下周有促銷活動(dòng)那預(yù)測(cè)結(jié)果就要相應(yīng)調(diào)整。模型是輔助工具不是決策替代品。第四條經(jīng)驗(yàn)定期更新模型。時(shí)序數(shù)據(jù)的分布會(huì)隨時(shí)間變化今天準(zhǔn)的模型過幾個(gè)月可能就不準(zhǔn)了。設(shè)置定時(shí)任務(wù)定期用新數(shù)據(jù)重新訓(xùn)練能保持預(yù)測(cè)的準(zhǔn)確性。這個(gè)習(xí)慣一旦養(yǎng)成后面就省心了。最后分享一個(gè)小技巧如果你不確定預(yù)測(cè)步長(zhǎng)設(shè)多少合適可以先設(shè)一個(gè)較短的步長(zhǎng)比如24個(gè)點(diǎn)跑一次看看效果。如果效果好再逐步增加步長(zhǎng)直到回測(cè)指標(biāo)開始明顯下降為止。這樣能找到當(dāng)前數(shù)據(jù)支撐的最大預(yù)測(cè)步長(zhǎng)避免盲目設(shè)太長(zhǎng)導(dǎo)致結(jié)果不可用。這個(gè)試錯(cuò)過程很快因?yàn)槊看晤A(yù)測(cè)也就幾分鐘試幾輪就能找到合適的參數(shù)。