二級(jí)域名網(wǎng)站怎么投廣告百度seo優(yōu)化規(guī)則
目錄
- 一、Pmdarima實(shí)現(xiàn)單變量序列預(yù)測(cè)
- 1.1 核心功能與特性
- 1.2 技術(shù)優(yōu)勢(shì)對(duì)比
- 1.3 python案例
- 1.3.1 時(shí)間序列交叉驗(yàn)證
- 1.3.1.1 滾動(dòng)交叉驗(yàn)證
- 1.3.1.2 滑窗交叉驗(yàn)證
時(shí)間序列相關(guān)參考文章:
時(shí)間序列預(yù)測(cè)算法—ARIMA
基于VARMAX模型的多變量時(shí)序數(shù)據(jù)預(yù)測(cè)
基于機(jī)器學(xué)習(xí)時(shí)序庫(kù)pmdarima實(shí)現(xiàn)時(shí)序預(yù)測(cè)
時(shí)間序列預(yù)測(cè)算法—Prophet
時(shí)間序列預(yù)測(cè)算法—LSTM
長(zhǎng)時(shí)間序列預(yù)測(cè)算法—Informer
時(shí)間序列分類任務(wù)—tsfresh
有季節(jié)效應(yīng)的非平穩(wěn)序列分析
python時(shí)間序列處理
時(shí)間序列異常值檢測(cè)方法
時(shí)間序列異常值處理方法
一、Pmdarima實(shí)現(xiàn)單變量序列預(yù)測(cè)
??pmdarima 是 Python 生態(tài)中專注于時(shí)間序列預(yù)測(cè)的高階工具庫(kù),基于 ARIMA/SARIMA 模型框架,能夠處理平穩(wěn)性、季節(jié)性、周期性等問(wèn)題,可以執(zhí)行差分、交叉驗(yàn)證等運(yùn)算,通過(guò)自動(dòng)化建模流程降低時(shí)序分析門檻。其核心設(shè)計(jì)理念為 “自動(dòng)化” 與 “兼容性”,旨在為開(kāi)發(fā)者提供簡(jiǎn)潔、工業(yè)級(jí)的時(shí)序預(yù)測(cè)解決方案。
官方文檔
源碼倉(cāng)庫(kù)
1.1 核心功能與特性
- 自動(dòng)化建模引擎
參數(shù)自動(dòng)搜索:通過(guò) auto_arima() 函數(shù)一鍵完成模型參數(shù)(p, d, q 及季節(jié)性參數(shù) P, D, Q, m)的智能搜索,無(wú)需手動(dòng)調(diào)參。內(nèi)置 ADF檢驗(yàn)(Augmented Dickey-Fuller Test)自動(dòng)確定差分階數(shù) d,解決非平穩(wěn)序列問(wèn)題。
季節(jié)性處理:支持季節(jié)性差分與傅里葉項(xiàng)分解,自動(dòng)檢測(cè)季節(jié)性周期 m(如月、季度、年周期)。 - 工程化接口設(shè)計(jì)
sklearn 兼容性:遵循 scikit-learn API 規(guī)范(fit()、predict()、score()),無(wú)縫接入機(jī)器學(xué)習(xí)流水線。支持 Pipeline 集成與 GridSearchCV 超參數(shù)優(yōu)化。
擴(kuò)展功能:模型持久化(pickle 序列化)、置信區(qū)間計(jì)算、殘差診斷(白噪聲檢驗(yàn))。 - 性能優(yōu)化
并行計(jì)算:通過(guò) n_jobs 參數(shù)啟用多核并行加速模型搜索。
大樣本支持:分塊(Chunking)處理超長(zhǎng)時(shí)序數(shù)據(jù),避免內(nèi)存溢出。
1.2 技術(shù)優(yōu)勢(shì)對(duì)比
特性 | pmdarima | 傳統(tǒng) ARIMA 實(shí)現(xiàn)(如 statsmodels) |
---|---|---|
參數(shù)自動(dòng)化 | ? 全自動(dòng)搜索 (p,d,q,P,D,Q,m) | ? 需手動(dòng)指定所有參數(shù) |
季節(jié)性支持 | ? 內(nèi)置季節(jié)差分與傅里葉分解 | ?? 需手動(dòng)配置季節(jié)差分項(xiàng) |
API 易用性 | ? 類 sklearn 接口(fit/predict) | ?? 需調(diào)用專用函數(shù)(如 ARIMA() ) |
非平穩(wěn)性處理 | ? 自動(dòng)執(zhí)行ADF檢驗(yàn)確定差分階數(shù)d | ? 需手動(dòng)運(yùn)行平穩(wěn)性檢驗(yàn) |
計(jì)算效率 | ? 并行搜索 (n_jobs )、分塊處理 | ? 單線程計(jì)算為主 |
生產(chǎn)集成 | ? 兼容sklearn流水線與超參數(shù)優(yōu)化 | ?? 需額外封裝才能接入ML系統(tǒng) |
模型診斷 | ? 內(nèi)置殘差檢驗(yàn)與置信區(qū)間計(jì)算 | ?? 需調(diào)用其他工具輔助驗(yàn)證 |
1.3 python案例
??load_wineind 是pmdarima 庫(kù)中經(jīng)典的季節(jié)性時(shí)間序列數(shù)據(jù)集,時(shí)間范圍為1980 年 1 月至 1994 年 8 月(共 176 個(gè)月度觀測(cè)點(diǎn)),反映澳大利亞葡萄酒產(chǎn)業(yè)的月度銷量。
import pmdarima as pm
from pmdarima import model_selection
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
import warnings
warnings.filterwarnings("ignore")data = pm.datasets.load_wineind()
fig = plt.figure(figsize=(16,5))
plt.plot(range(data.shape[0]),data)
plt.grid()
#使用pm分割數(shù)據(jù),遵循時(shí)序規(guī)則,不會(huì)打亂時(shí)間順序
train, test = model_selection.train_test_split(data, train_size=152)
#自動(dòng)化建模,只支持SARIMAX混合模型,不支持VARMAX系列模型
arima = pm.auto_arima(train, trace=True, #訓(xùn)練數(shù)據(jù),是否打印訓(xùn)練過(guò)程error_action='ignore', #設(shè)置為'ignore'將會(huì)忽略錯(cuò)誤并繼續(xù),其他選項(xiàng)包括'warn'、'raise'、'trace'等。 suppress_warnings=True, #無(wú)視警告和錯(cuò)誤maxiter=5, #允許的最大迭代次數(shù)seasonal=True,#是否考慮季節(jié)性因素。設(shè)置為True表示模型將包含季節(jié)性成分。m=12 #季節(jié)性的周期數(shù))
#預(yù)測(cè) - n_periods向未來(lái)預(yù)測(cè),無(wú)法對(duì)訓(xùn)練的時(shí)間進(jìn)行預(yù)測(cè)
preds = arima.predict(n_periods=test.shape[0])
preds #按照測(cè)試集的日期進(jìn)行預(yù)測(cè)
fig = plt.figure(figsize=(16,5))
plt.plot(range(test.shape[0]),test)
plt.plot(range(test.shape[0]),preds)
plt.grid()
#評(píng)估指標(biāo) - 可共用sklearn的評(píng)估指標(biāo),也可調(diào)用特定的時(shí)序指標(biāo)AIC
np.sqrt(mean_squared_error(test, preds)) #rmse 輸出:2550.8824550311906
arima.aic() #aic 輸出:2946.1506587987415
arima.summary()
??傻瓜式搜索合適的參數(shù),從效率角度來(lái)說(shuō)遠(yuǎn)遠(yuǎn)超過(guò)statsmodel,遺憾的是,從上述代碼不難看出,pmdarima的代碼思路是更靠近機(jī)器學(xué)習(xí)而不是統(tǒng)計(jì)學(xué)的,因此pmd.auto_arima跑出的結(jié)果往往無(wú)法滿足統(tǒng)計(jì)學(xué)上的各類檢驗(yàn)要求,因此泛化能力無(wú)法被保證。同時(shí)我們也很容易發(fā)現(xiàn),由于數(shù)據(jù)集分割的緣故,autoarima選擇出的最佳模型可能無(wú)法被復(fù)現(xiàn),例如我們使用autoarima選擇出的最佳模型建立模型:
model = pm.ARIMA(order=(2,1,1),seasonal_order=(1,0,1,12), max_iter=500)
model.fit(train)
np.sqrt(mean_squared_error(test, model.predict(n_periods = test.shape[0]))) #RMSE:2983.19明顯高于auto_arima:2550.88的結(jié)果
model.aic() #AIC:2936.459卻低于auto_arima:2946.15的結(jié)果,所以AIC并不能作為唯一標(biāo)準(zhǔn)的評(píng)估指標(biāo)fig = plt.figure(figsize=(16,5))
plt.plot(range(test.shape[0]),test)
plt.plot(range(test.shape[0]),model.predict(n_periods = test.shape[0]))
plt.grid()
1.3.1 時(shí)間序列交叉驗(yàn)證
??在時(shí)序模型的選擇過(guò)程中,可以借助交叉驗(yàn)證來(lái)幫助我們選擇更好的模型。時(shí)間序列的交叉驗(yàn)證非常特殊,因?yàn)闀r(shí)間序列數(shù)據(jù)必須遵守“過(guò)去預(yù)測(cè)未來(lái)”、“訓(xùn)練中時(shí)間順序不能打亂”等基本原則,因此傳統(tǒng)機(jī)器學(xué)習(xí)中的k折交叉驗(yàn)證肯定無(wú)法使用。在時(shí)間序列的世界中,有以下兩種常見(jiàn)的交叉驗(yàn)證方式:滾動(dòng)交叉驗(yàn)證和 滑窗交叉驗(yàn)證。
1.3.1.1 滾動(dòng)交叉驗(yàn)證
??滾動(dòng)交叉驗(yàn)證是一種針對(duì)時(shí)間序列數(shù)據(jù)的驗(yàn)證方法,其核心思想是在模型訓(xùn)練過(guò)程中不斷擴(kuò)展訓(xùn)練集,同時(shí)使驗(yàn)證集逐步向未來(lái)推進(jìn)。這種方式不僅確保了模型始終遵循“用過(guò)去預(yù)測(cè)未來(lái)”的原則,還能保證訓(xùn)練數(shù)據(jù)與預(yù)測(cè)目標(biāo)之間的時(shí)間間隔足夠接近,從而提高預(yù)測(cè)的現(xiàn)實(shí)性和有效性。
??相比傳統(tǒng)的“多步預(yù)測(cè)”方法,滾動(dòng)交叉驗(yàn)證避免了“誤差累積”問(wèn)題。由于訓(xùn)練過(guò)程中始終使用真實(shí)標(biāo)簽進(jìn)行擬合,模型不會(huì)受到前期預(yù)測(cè)誤差的傳遞影響,因此能夠更穩(wěn)定地評(píng)估未來(lái)數(shù)據(jù)的預(yù)測(cè)能力。對(duì)于時(shí)間序列任務(wù),滾動(dòng)交叉驗(yàn)證能夠更真實(shí)地模擬未來(lái)預(yù)測(cè)場(chǎng)景,從而提高模型的泛化性能。
??在pmdarima中,使用類RollingForecastCV
和cross_validate
來(lái)實(shí)現(xiàn)交叉驗(yàn)證。
model_selection.RollingForecastCV(h=1, step=1, initial=None)
h:驗(yàn)證集中的樣本數(shù)量,可以輸入[1, n_samples]的整數(shù)。
step:訓(xùn)練集中每次增加的樣本數(shù)量,必須為大于等于1的正整數(shù)。
initial:第一次交叉驗(yàn)證時(shí)的訓(xùn)練集樣本量,如果不填寫則按1/3處理。
cv = model_selection.RollingForecastCV(h=1, step=1, initial = 10)
cv_generator = cv.split(data)
next(cv_generator) #根據(jù)Initial初始訓(xùn)練集有10個(gè)樣本,驗(yàn)證集遵循參數(shù)h的設(shè)置,只包含一個(gè)樣本
next(cv_generator) #根據(jù)step的設(shè)置,訓(xùn)練集每次增加1個(gè)樣本,驗(yàn)證集繼續(xù)包含一個(gè)樣本
cv = model_selection.RollingForecastCV(h=5, step=10, initial = 10)
cv_generator = cv.split(data)
next(cv_generator) #驗(yàn)證集包含10個(gè)樣本
next(cv_generator)
??在pmdarima中實(shí)現(xiàn)滾動(dòng)交叉驗(yàn)證時(shí),驗(yàn)證集實(shí)際上是可以重復(fù)的,可以在有限的數(shù)據(jù)上進(jìn)行多輪驗(yàn)證集重合的交叉驗(yàn)證。
model = pm.ARIMA(order=(2,1,1),seasonal_order=(1,0,1,12),max_iter=500)
cv = model_selection.RollingForecastCV(h=24, step=12, initial=36)
predictions = model_selection.cross_validate(model, data,cv=cv, scoring = "mean_squared_error", verbose = 2, #控制日志輸出的詳細(xì)程度 0:無(wú)輸出1:僅顯示重要信息 2:詳 細(xì)日志,顯示每次滾動(dòng)交叉驗(yàn)證的進(jìn)度和結(jié)果error_score = "raise") #控制當(dāng)交叉驗(yàn)證過(guò)程中發(fā)生錯(cuò)誤時(shí)的行為:"raise":遇到錯(cuò)誤時(shí)直接報(bào)錯(cuò)np.nan:如果遇到錯(cuò)誤,則該次評(píng)估返回 NaN,不會(huì)影響整個(gè)交叉驗(yàn)證流程
predictions
np.sqrt(predictions["test_score"]) #rmse
??交叉驗(yàn)證的測(cè)試集中得到的RMSE大部分都大于我們之前自動(dòng)化建模時(shí)得到的RMSE,并且訓(xùn)練數(shù)據(jù)越少時(shí),測(cè)試集上的RMSE會(huì)越大,這可能說(shuō)明在前幾折交叉驗(yàn)證時(shí),訓(xùn)練集的數(shù)據(jù)量太少,我們可以考慮增大initial當(dāng)中的設(shè)置來(lái)避免這個(gè)問(wèn)題。
1.3.1.2 滑窗交叉驗(yàn)證
??與滾動(dòng)交叉驗(yàn)證類似,滑窗交叉驗(yàn)證中的驗(yàn)證集既可以是單一樣本,也可以包含多個(gè)時(shí)間步數(shù)據(jù)。相較于滾動(dòng)交叉驗(yàn)證,滑窗交叉驗(yàn)證的核心優(yōu)勢(shì)在于訓(xùn)練集大小保持恒定, 每次訓(xùn)練時(shí)僅使用理論上對(duì)當(dāng)前驗(yàn)證集最有效的信息。這避免了訓(xùn)練集無(wú)限增長(zhǎng)所帶來(lái)的計(jì)算開(kāi)銷,同時(shí)確保模型始終基于最新的歷史數(shù)據(jù)進(jìn)行訓(xùn)練,提高對(duì)近期趨勢(shì)的適應(yīng)性。然而,這一特性也帶來(lái)了潛在問(wèn)題:由于訓(xùn)練集較小,模型需要進(jìn)行 更多次訓(xùn)練,導(dǎo)致計(jì)算量大幅增加,使得交叉驗(yàn)證過(guò)程異常緩慢。特別是在高頻時(shí)間序列或大規(guī)模數(shù)據(jù)集上,滑窗交叉驗(yàn)證的計(jì)算成本可能成為實(shí)際應(yīng)用中的限制因素。
??在pmdarima當(dāng)中,使用SlidingWindowForecastCV
來(lái)完成滑窗交叉驗(yàn)證:
model_selection.SlidingWindowForecastCV(h=1, step=1, window_size=None)
h:驗(yàn)證集中的樣本數(shù)量,可以輸入[1, n_samples]的整數(shù)。
step:每次向未來(lái)滑窗的樣本數(shù)量,必須為大于等于1的正整數(shù)。
window_size:滑窗的尺寸大小,如果填寫None則按照樣本量整除5得到的數(shù)來(lái)決定。
cv = model_selection.SlidingWindowForecastCV(h=1, step=1, window_size = 10)
cv_generator = cv.split(data)
next(cv_generator)
next(cv_generator)
cv = model_selection.SlidingWindowForecastCV(h=5, step=10, window_size = 10)
cv_generator = cv.split(data)
next(cv_generator)
next(cv_generator)
model = pm.ARIMA(order=(2,1,1),seasonal_order=(1,0,1,12),max_iter=500)
cv = model_selection.SlidingWindowForecastCV(h=24, step=12, window_size=36) #簡(jiǎn)單粗暴
predictions = model_selection.cross_validate(model,data, cv=cv, scoring = "mean_squared_error", verbose = 2, error_score = "raise")
predictions
np.sqrt(predictions["test_score"])
??從結(jié)果來(lái)看,使用更少的訓(xùn)練集進(jìn)行訓(xùn)練后,模型輸出的RMSE大幅上升了,并且也沒(méi)有變得更穩(wěn)定,這說(shuō)明當(dāng)前模型下更大的訓(xùn)練集會(huì)更有利于模型的訓(xùn)練。
cv = model_selection.SlidingWindowForecastCV(h=24, step=1, window_size=132)
predictions = model_selection.cross_validate(model, data,cv=cv, scoring = "mean_squared_error", verbose = 2, error_score = "raise")
np.sqrt(predictions["test_score"])
??此時(shí)RMSE的均值大幅下降了,但是模型還是不穩(wěn)定,這說(shuō)明當(dāng)前時(shí)間序列各時(shí)間段上的差異較大,當(dāng)前模型的擬合結(jié)果一般。雖然通過(guò)增加訓(xùn)練集的數(shù)據(jù)量可以讓模型表現(xiàn)提升,但極其不穩(wěn)定的結(jié)果展示當(dāng)前模型的泛化能力是缺失的。當(dāng)然,和使用AIC時(shí)一樣,我們只能選擇表現(xiàn)更好的時(shí)序模型(只能擇優(yōu)),而無(wú)法選擇完美的時(shí)序模型。當(dāng)我們將auto_arima選出的最佳參數(shù)放棄、而選擇帶有其他參數(shù)的模型,說(shuō)不定得到的結(jié)果會(huì)更加不穩(wěn)定。