【Python】Python中的经典时间序列预测模型总结
時間序列預測是機器學習中一個經常被忽視的重要領域。時間序列在觀察之間添加了顯式的順序依賴性:時間維度。這個額外的維度既是一個約束,也是一個提供額外信息來源的結構。
時間序列
時間序列分析
使用經典統計時,主要關注的是時間序列的分析。
時間序列分析涉及開發能夠最好地捕捉或描述觀察到的時間序列的模型,以了解根本原因。該研究領域尋求時間序列數據集背后的“為什么”。
時間序列預測
在時間序列數據的經典統計處理中,對未來進行預測稱為外推。更現代的領域關注該主題并將其稱為時間序列預測。預測涉及采用適合歷史數據的模型并使用它們來預測未來的觀察結果。
描述性模型可以借用未來(即平滑或去除噪聲),它們只尋求最好地描述數據。預測的一個重要區別是未來是完全不可用的,只能根據已經發生的事情來估計。
時間序列的組成部分
時間序列分析提供了一系列技術來更好地理解數據集。也許其中最有用的是將時間序列分解為 4 個組成部分:
等級?如果系列是直線,則為該系列的基線值。
趨勢?系列隨時間的可選且通常線性增加或減少的行為。
季節性?隨著時間的推移,可選的重復模式或行為循環。
噪音?模型無法解釋的觀測值中的可選變異性。
所有時間序列都有一個等級,大多數都有噪音,趨勢和季節性是可選的。
所有代碼示例均使用 Python 編寫并使用 Statsmodels 庫。
時間序列預測方法
本文主要參考11種經典時間序列預測方法[1]
自回歸 (Holt Winter,?AR)
移動平均線 (Moving Average,?MA)
自回歸移動平均線 (Autoregressive Moving Average,?ARMA)
自回歸綜合移動平均線 (Autoregressive Integrated Moving Average,?ARIMA)
季節性自回歸整合移動平均線 (Seasonal Autoregressive Integrated Moving-Average,?SARIMA)
具有外生回歸量的季節性自回歸整合移動平均線 (Seasonal Autoregressive Integrated Moving-Average with Exogenous Regressors,?SARIMAX)
向量自回歸 (Vector Autoregression,?VAR)
向量自回歸移動平均 (Vector Autoregression Moving-Average,?VARMA)
具有外源回歸量的向量自回歸移動平均值 (Vector Autoregression Moving-Average with Exogenous Regressors,?VARMAX)
簡單指數平滑 (Simple Exponential Smoothing, SES)
霍爾特·溫特的指數平滑 (Holt Winter’s Exponential Smoothing,?HWES)
01 自回歸 (AR)
自回歸 (AR) 方法將序列中的下一步建模為先前時間步長觀測值的線性函數。
模型的符號涉及指定模型??的階數作為 AR 函數的參數,例如 AR(p)。例如,AR(1) 是一階自回歸模型。
該方法適用于沒有趨勢和季節性成分的單變量時間序列。
定義
符號??表示??階的自回歸模型。模??型定義為:
在哪里??是模型的參數 ,?是一個常數,并且??是白噪聲。
在統計學、計量經濟學和信號處理中,自回歸 (AR) 模型是一種隨機過程的表示;因此,它用于描述自然界、經濟學等中的某些時變過程。自回歸模型指定輸出變量線性地取決于其自身先前的值和隨機項(不完全可預測的項);因此該模型采用隨機差分方程的形式(或不應與微分方程混淆的遞推關系)。
與移動平均 (MA) 模型一起,它是更一般的時間序列自回歸移動平均 (ARMA) 和自回歸綜合移動平均 (ARIMA) 模型的特例和關鍵組成部分,它們具有更復雜的隨機結構體; 它也是向量自回歸模型 (VAR) 的一個特例,它由一個包含多個互鎖隨機差分方程的系統組成,該系統包含多個演化隨機變量。
更多內容可參見維基百科上的自回歸模型[2]
Python代碼
#?AR?example from?statsmodels.tsa.ar_model?import?AutoReg from?random?import?random #?contrived?dataset data?=?[x?+?random()?for?x?in?range(1,?100)] #?fit?model model?=?AutoReg(data,?lags=1) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data)) print(yhat)02 移動平均線 (MA)
移動平均(MA)方法將序列中的下一步建模為來自先前時間步驟的平均過程的殘余誤差的線性函數。
移動平均模型與計算時間序列的移動平均值不同。模型的符號包括指定模型的順序??作為MA函數的參數,例如 MA(q)。例如,MA(1)是一階移動平均模型。該方法適用于沒有趨勢和季節性成分的單變量時間序列。
定義
符號??是指順序的移動平均模型?:
其中??是序列的平均值,θθ?是模型的參數,而??是白噪聲誤差項。?的值稱為 MA 模型的階數。
因此,移動平均模型在概念上是系列當前值與當前和先前(觀察到的)白噪聲誤差項或隨機沖擊的線性回歸。假設每個點的隨機沖擊是相互獨立的,并且來自相同的分布,通常是正態分布,位置為零且尺度不變。
在時間序列分析中,移動平均線(MA)模型是對單變量時間序列建模的常用方法。MA模型指定輸出變量線性取決于隨機(不完全可預測)項的當前值和各種過去值。
與自回歸 (AR) 模型 一起,MA模型是更一般的時間序列 ARMA 和 ARIMA 模型的特例和關鍵組件,它們具有更復雜的隨機結構。
與 AR 模型相反,有限 MA 模型始終是靜止的。
更多內容可參見?維基百科上的移動平均模型[3]
Python代碼
我們可以使用 ARIMA 類來創建 MA 模型并設置零階 AR 模型。我們必須在?order?參數中指定 MA 模型的順序。
#?MA?example from?statsmodels.tsa.arima.model?import?ARIMA from?random?import?random #?contrived?dataset data?=?[random()?for?x?in?range(1,?100)] #?fit?model model?=?ARIMA(data,?order=(0,?0,?1)) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data))03 自回歸移動平均線 (ARMA)
自回歸移動平均 (ARMA) 方法將序列中的下一步建模為之前時間步驟的觀測值和殘差的線性函數。
它結合了自回歸 (AR) 和移動平均 (MA) 模型。模型的符號涉及指定??和??模型的順序作為 ARMA 函數的參數,例如?。ARIMA 模型可用于開發 AR 或 MA 模型。
該方法適用于沒有趨勢和季節性成分的單變量時間序列。
定義
符號??指的是具有??個自回歸項和??個移動平均項的模型。該模型包含??和??模型,
在時間序列的統計分析中,自回歸移動平均( ARMA )模型根據兩個多項式提供了對(弱)平穩隨機過程的簡約描述,一個用于自回歸(AR),第二個用于移動平均(嘛)。一般ARMA模型在1951年的論文中被描述彼得·惠特爾,在時間序列分析假設檢驗,它是在1970年的書普及喬治EP盒和格威利姆·詹金斯。
給定數據X t的時間序列,ARMA 模型是一種用于理解和預測該系列未來值的工具。AR 部分涉及根據其自己的滯后(即過去)值對變量進行回歸。MA 部分涉及將誤差項建模為過去不同時間同時發生的誤差項的線性組合。
更多內容可參見維基百科上的自回歸移動平均模型[4]
Python代碼
#?ARMA?example from?statsmodels.tsa.arima.model?import?ARIMA from?random?import?random #?contrived?dataset data?=?[random()?for?x?in?range(1,?100)] #?fit?model model?=?ARIMA(data,?order=(2,?0,?1)) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data)) print(yhat)04 自回歸綜合移動平均線 (ARIMA)
自回歸整合移動平均(ARIMA)方法將序列中的下一步建模為先前時間步長的差異觀測值和殘差誤差的線性函數。
它結合了自回歸(AR)和移動平均(MA)模型以及序列的差分預處理步驟,使序列靜止,稱為積分(I)。
該模型的表示法涉及將?,?和??模型的順序指定為 ARIMA 函數的參數,例如 ARIMA 函數的參數。?。ARIMA 模型也可用于開發 AR,MA 和 ARMA 模型。
該方法適用于具有趨勢且沒有季節性成分的單變量時間序列。
ARIMA的各個組成部分:
AR 部分?表示感興趣的演化變量對其自身的滯后(即先驗)值進行回歸。
MA 部分?表示回歸誤差實際上是誤差項的線性組合,其值同時發生在過去的不同時間。
I 部分?表示數據值已被替換為其值與先前值之間的差值(并且這個差值過程可能已經執行了不止一次)。這些特征中的每一個的目的都是使模型盡可能地擬合數據。
非季節性 ARIMA 模型通常表示為??其中參數?和?是非負整數,?是自回歸模型的階數(時間滯后數),?是差分(數據減去過去值的次數),?是移動平均模型的階數。
季節性 ARIMA 模型通常表示為?,其中??指的是每個季節的周期數,大寫的??指的是 ARIMA 模型的季節性部分的自回歸、差分和移動平均項。
更多內容可參見維基百科上的自回歸綜合移動平均線[5]
Python代碼
#?ARIMA?example from?statsmodels.tsa.arima.model?import?ARIMA from?random?import?random #?contrived?dataset data?=?[random()?for?x?in?range(1,?100)] #?fit?model model?=?ARIMA(data,?order=(1,?1,?1)) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data),?typ='levels')05 季節性自回歸綜合移動平均 (SARIMA)
季節ARIMA模型(SARIMA)方法模型序列中的下一步驟中用作差分觀測的線性函數,錯誤,季節性求差的觀察,和季節性的錯誤在先前時間的步驟。
它將 ARIMA 模型與在季節性水平上執行相同的自回歸、差分和移動平均建模的能力相結合。
模型的符號包括指定?、和?模型的順序作為 ARIMA 函數和?、、?和??的參數季節級別的參數。
例如??,其中“m”是每個季節(季節期間)的時間步長數。SARIMA 模型可用于開發 AR、MA、ARMA 和 ARIMA 模型。
該方法適用于具有趨勢和/或季節性成分的單變量時間序列。
ARIMA 模型有許多變體
如果使用多個時間序列,則??可以被認為是向量,此時 VARIMA 模型較為合適。
如果懷疑在模型中存在季節性效應,在這種情況下,通常認為使用 SARIMA(季節性ARIMA)模型比增加模型的 AR 或 MA 部分的階數更好。
如果懷疑時間序列具有長期相關性,那么在自回歸分數積分移動平均模型中可以允許??參數具有非整數值,該模型也稱為分數 ARIMA(FARIMA 或 ARFIMA)) 模型。
Python代碼
#?SARIMA?example from?statsmodels.tsa.statespace.sarimax?import?SARIMAX from?random?import?random #?contrived?dataset data?=?[random()?for?x?in?range(1,?100)] #?fit?model model?=?SARIMAX(data,?order=(1,?1,?1),?seasonal_order=(0,?0,?0,?0)) model_fit?=?model.fit(disp=False) #?make?prediction yhat?=?model_fit.predict(len(data),?len(data))06 具有外生回歸量的季節性自回歸整合移動平均線(SARIMAX)
具有外源回歸量的季節性自回歸整合移動平均值(SARIMAX)是 SARIMA 模型的擴展,其還包括外生變量的建模。
外生變量也稱為協變量,可以被認為是并行輸入序列,其在與原始序列相同的時間步驟中具有觀察結果。初級系列可以稱為內源性數據,以將其與外源序列進行對比。對于外源變量的觀察結果直接在每個時間步驟包括在模型中,并且不以與主要內源序列相同的方式建模(例如作為 AR,MA 等過程)。
SARIMAX 方法還可用于使用外生變量對包含的模型進行建模,例如 ARX、MAX、ARMAX 和 ARIMAX。
該方法適用于具有趨勢和/或季節性成分和外生變量的單變量時間序列。
Python代碼
#?SARIMAX?example from?statsmodels.tsa.statespace.sarimax?import?SARIMAX from?random?import?random #?contrived?dataset data1?=?[x+random()?for?x?in?range(1,?100)] data2?=?[x+random()?for?x?in?range(101,?200)] #?fit?model model?=?SARIMAX(data1,?exog=data2,?order=(1,?1,?1),?seasonal_order=(0,?0,?0,?0)) model_fit?=?model.fit(disp=False) #?make?prediction exog2?=?[200+random()] yhat?=?model_fit.predict(len(data1),?len(data1),?exog=[exog2])07 向量自回歸 (VAR)
向量自回歸(VAR)方法使用 AR 模型模擬每個時間序列中的下一步。AR 是多個并行時間序列的推廣,例如,多變量時間序列。
該模型的符號涉及指定??模型的階數作為 VAR 函數的參數,例如?。
該方法適用于沒有趨勢和季節性成分的多變量時間序列。
定義
VAR 模型描述了一組??個變量(稱為內生變量)隨時間的演變。每個時間段都有編號,
一般而言,?階 VAR 是指包含最后??個時間段的滯后的 VAR 模型。?階VAR模型表示為""。一個??階 VAR 模型寫為
?表示變量在??個時間段之前的值,稱為??的"第??個滯后" 。變量??是常數的??向量,用作模型的截距。?是時不變() 矩陣,而??是誤差項的??向量。誤差項必須滿足三個條件:
?每個誤差項的均值為零。
?誤差項的同期協方差矩陣是一個??正半定矩陣,表示為?。
?對于任何非零?,跨時間沒有相關性。特別是,在單個誤差項中沒有序列相關性。
矢量自回歸(VAR) 是一種統計模型,用于捕捉隨時間變化的多個數量之間的關系。VAR 是一種隨機過程模型。VAR模型通過允許多變量時間序列來概括單變量(單變量)自回歸模型。VAR 模型經常用于經濟學和自然科學。
與自回歸模型一樣,每個變量都有一個方程來模擬其隨時間的演變。該方程包括變量的滯后(過去)值、模型中其他變量的滯后值以及誤差項。
VAR 模型不需要像具有聯立方程的結構模型那樣了解影響變量的力。唯一需要的先驗知識是可以假設隨著時間的推移相互影響的變量列表。
更多內容可參見維基百科上的向量自回歸[6]
Python代碼
#?VAR?example from?statsmodels.tsa.vector_ar.var_model?import?VAR from?random?import?random #?contrived?dataset?with?dependency data?=?list() for?i?in?range(100):v1?=?i?+?random()v2?=?v1?+?random()row?=?[v1,?v2]data.append(row) #?fit?model model?=?VAR(data) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.forecast(model_fit.y,?steps=1)08 向量自回歸移動平均值(VARMA)
向量自回歸移動平均(VARMA)方法使用 ARMA 模型對每個時間序列中的下一步進行建模。這是 ARMA 對多個并行時間序列的推廣,例如多變量時間序列。
該模型的表示法涉及將??和??模型的順序指定為 VARMA 函數的參數,例如,?。VARMA 模型也可用于開發 VAR 或 VMA 模型。
該方法適用于沒有趨勢和季節性成分的多元時間序列。
Python代碼
#?VARMA?example from?statsmodels.tsa.statespace.varmax?import?VARMAX from?random?import?random #?contrived?dataset?with?dependency data?=?list() for?i?in?range(100):v1?=?random()v2?=?v1?+?random()row?=?[v1,?v2]data.append(row) #?fit?model model?=?VARMAX(data,?order=(1,?1)) model_fit?=?model.fit(disp=False) #?make?prediction yhat?=?model_fit.forecast()09 具有外源回歸量的向量自回歸移動平均值(VARMAX)
帶有外生回歸量的向量自回歸移動平均 (VARMAX) 是 VARMA 模型的擴展,它還包括外生變量的建模。它是 ARMAX 方法的多元版本。
外生變量也稱為協變量,可以被認為是并行輸入序列,它們在與原始序列相同的時間步長中進行觀察。主要系列被稱為內源數據,以將其與外源序列進行對比。外生變量的觀察值在每個時間步直接包含在模型中,并且不以與主要內生序列相同的方式建模(例如作為 AR、MA 等過程)。
VARMAX 方法還可用于對具有外生變量的包含模型進行建模,例如 VARX 和 VMAX。
該方法適用于具有外生變量的沒有趨勢和季節性成分的多元時間序列。
Python代碼
#?VARMAX?example from?statsmodels.tsa.statespace.varmax?import?VARMAX from?random?import?random #?contrived?dataset?with?dependency data?=?list() for?i?in?range(100):v1?=?random()v2?=?v1?+?random()row?=?[v1,?v2]data.append(row) data_exog?=?[x?+?random()?for?x?in?range(100)] #?fit?model model?=?VARMAX(data,?exog=data_exog,?order=(1,?1)) model_fit?=?model.fit(disp=False) #?make?prediction data_exog2?=?[[100]] yhat?=?model_fit.forecast(exog=data_exog2)10 簡單指數平滑 (SES)
簡單指數平滑 (SES) 方法將下一個時間步建模為先前時間步觀測值的指數加權線性函數。
該方法適用于沒有趨勢和季節性成分的單變量時間序列。
定義
指數平滑的最簡單形式由以下公式給出:
式中??是平滑因子,并且?。換句話說,平滑的統計量??是當前觀測值的簡單加權平均值??和之前的平滑統計?。簡單的指數平滑很容易應用,只要有兩個觀測值,它就會生成平滑的統計量。
平滑因子??具有較大的值,實際上降低平滑水平,并在極限情況下??輸出系列只是當前的觀察結果。
?的值接近 1 的平滑效果較小,并且對數據中最近的變化給予更大的權重。
而??值 接近于零,具有更大的平滑效果并且對最近的變化的響應更小。
指數平滑是一種利用指數窗函數平滑時間序列數據的經驗法則。而在簡單的移動平均中,過去的觀測值的權重是相等的。指數函數被用來分配隨著時間呈指數遞減的權重。
指數平滑是信號處理中常用的平滑數據的窗口函數之一,作為低通濾波器去除高頻噪聲。
更多內容可參見維基百科上的指數平滑[7]
Python代碼
#?SES?example from?statsmodels.tsa.holtwinters?import?SimpleExpSmoothing from?random?import?random #?contrived?dataset data?=?[random()?for?x?in?range(1,?100)] #?fit?model model?=?SimpleExpSmoothing(data) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data)) print(yhat)11 霍爾特·溫特的指數平滑(HWES)
Holt Winter 的指數平滑(HWES)也稱為三次指數平滑方法,將下一個時間步長建模為先前時間步長的觀測值的指數加權線性函數,并考慮趨勢和季節性。
該方法適用于具有趨勢和/或季節性分量的單變量時間序列。
Python代碼
#?HWES?example from?statsmodels.tsa.holtwinters?import?ExponentialSmoothing from?random?import?random #?contrived?dataset data?=?[x?+?random()?for?x?in?range(1,?100)] #?fit?model model?=?ExponentialSmoothing(data) model_fit?=?model.fit() #?make?prediction yhat?=?model_fit.predict(len(data),?len(data))參考資料
[1]?
11種經典時間序列預測方法:?https://machinelearningmastery.com/time-series-forecasting-methods-in-python-cheat-sheet/
[2]?自回歸模型:?https://en.wikipedia.org/wiki/Autoregressive_model
[3]?移動平均模型:?https://en.wikipedia.org/wiki/Moving-average_model
[4]?自回歸移動平均模型:?https://en.wikipedia.org/wiki/Autoregressive–moving-average_model
[5]?自回歸綜合移動平均線:?https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average
[6]?向量自回歸:?https://en.wikipedia.org/wiki/Vector_autoregression
[7]?指數平滑:?https://en.wikipedia.org/wiki/Exponential_smoothing
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群554839127,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【Python】Python中的经典时间序列预测模型总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot打包问题,访问问题
- 下一篇: Python排序算法(二) 快速排序、希