python3用ARIMA模型進(jìn)行時(shí)間序列預(yù)測(cè)
原文鏈接:http://tecdat.cn/?p=12260
ARIMA模型是一種流行的且廣泛使用的用于時(shí)間序列預(yù)測(cè)的統(tǒng)計(jì)方法。
ARIMA是首字母縮寫詞,代表自動(dòng)回歸移動(dòng)平均。它是一類模型,可在時(shí)間序列數(shù)據(jù)中捕獲一組不同的標(biāo)準(zhǔn)時(shí)間結(jié)構(gòu)。
在本教程中,您將發(fā)現(xiàn)如何使用Python開發(fā)用于時(shí)間序列數(shù)據(jù)的ARIMA模型。
完成本教程后,您將知道:
關(guān)于ARIMA模型,使用的參數(shù)和模型所作的假設(shè)。
如何使ARIMA模型適合數(shù)據(jù)并使用它進(jìn)行預(yù)測(cè)。
如何針對(duì)您的時(shí)間序列問題配置ARIMA模型。
了解如何準(zhǔn)備和可視化時(shí)間序列數(shù)據(jù)并開發(fā)自回歸預(yù)測(cè)模型? 。
讓我們開始吧。
自回歸綜合移動(dòng)平均模型
ARIMA模型??是一類統(tǒng)計(jì)模型分析和預(yù)測(cè)的時(shí)間序列數(shù)據(jù)。
它明確地迎合了時(shí)間序列數(shù)據(jù)中的一組標(biāo)準(zhǔn)結(jié)構(gòu),因此提供了一種簡(jiǎn)單而強(qiáng)大的方法來進(jìn)行熟練的時(shí)間序列預(yù)測(cè)。
ARIMA是首字母縮寫詞,代表自動(dòng)回歸移動(dòng)平均線。它是對(duì)簡(jiǎn)單的自動(dòng)回歸移動(dòng)平均線的概括,并增加了差分的概念。
該首字母縮寫是描述性的。簡(jiǎn)而言之,它們是:
AR:??自回歸。一種模型,它使用觀察值和一些滯后觀察值之間的依賴關(guān)系。
I:??綜合。為了使時(shí)間序列平穩(wěn),使用原始觀測(cè)值的差異(例如,從上一個(gè)時(shí)間步長(zhǎng)的觀測(cè)值中減去觀測(cè)值)。
MA:??移動(dòng)平均。一種模型,該模型使用觀察值與應(yīng)用于滯后觀察值的移動(dòng)平均模型的殘差之間的依賴關(guān)系。
每一個(gè)都在模型中明確指定為參數(shù)。使用ARIMA(p,d,q),其中參數(shù)替換為整數(shù)值以快速指示所使用的特定ARIMA模型。
ARIMA模型的參數(shù)定義如下:
p:模型中包括的滯后觀測(cè)值的數(shù)量,也稱為滯后階數(shù)。
d:原始觀測(cè)值相差的次數(shù),也稱為相異度。
q:移動(dòng)平均窗口的大小,也稱為移動(dòng)平均的順序。
構(gòu)建包括指定數(shù)量和類型的項(xiàng)的線性回歸模型,并通過一定程度的差分來準(zhǔn)備數(shù)據(jù),以使其保持平穩(wěn),即消除對(duì)回歸模型產(chǎn)生負(fù)面影響的趨勢(shì)和季節(jié)結(jié)構(gòu)。
可以將值0用作參數(shù),這表示不使用模型的該元素。這樣,可以將ARIMA模型配置為執(zhí)行ARMA模型甚至簡(jiǎn)單的AR,I或MA模型的功能。
對(duì)于時(shí)間序列采用ARIMA模型,則假定生成觀測(cè)值的基礎(chǔ)過程是ARIMA過程。這看起來似乎很明顯,但是有助于激發(fā)需要在原始觀測(cè)值和模型預(yù)測(cè)的殘差中確認(rèn)模型的假設(shè)。
接下來,讓我們看一下如何在Python中使用ARIMA模型。我們將從加載簡(jiǎn)單的單變量時(shí)間序列開始。
?
洗發(fā)水銷售數(shù)據(jù)集
該數(shù)據(jù)集描述了3年期間洗發(fā)水的每月銷售量。
單位是銷售數(shù)量,有36個(gè)觀察值。
下載數(shù)據(jù)集
下載數(shù)據(jù)集并將其放在文件名“?shampoo-sales.csv?”的當(dāng)前工作目錄中。
下面是使用自定義函數(shù)解析日期時(shí)間字段的加載銷售數(shù)據(jù)集的示例。數(shù)據(jù)集以任意年份為基準(zhǔn),在這種情況下為1900。
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
print(series.head())
series.plot()
pyplot.show()
運(yùn)行示例將輸出數(shù)據(jù)集的前5行。
Month
1901-01-01 266.0
1901-02-01 145.9
1901-03-01 183.1
1901-04-01 119.3
1901-05-01 180.3
Name: Sales, dtype: float64
數(shù)據(jù)還繪制為時(shí)間序列,其中x軸為月份,y軸為銷售數(shù)字。

?
洗發(fā)水銷售數(shù)據(jù)集圖
我們可以看到,洗發(fā)水銷售數(shù)據(jù)集具有明顯的趨勢(shì)。
這表明時(shí)間序列不是平穩(wěn)的,并且需要進(jìn)行差分才能使其穩(wěn)定,至少相差1。
我們還快速瀏覽一下時(shí)間序列的自相關(guān)圖。下面的示例繪制了時(shí)間序列中滯后的自相關(guān)。
通過運(yùn)行示例,我們可以看到與前10到12個(gè)之后之間存在正相關(guān),這可能對(duì)前5個(gè)之后具有顯著的意義。
模型的AR參數(shù)的一個(gè)好的起點(diǎn)可能是5。

?
洗發(fā)水銷售數(shù)據(jù)的自相關(guān)圖
ARIMA與Python
?
可以創(chuàng)建ARIMA模型,如下所示:
通過調(diào)用ARIMA()??并傳入??p,??d和??q??參數(shù)來定義模型? 。
通過調(diào)用fit()??函數(shù)在訓(xùn)練數(shù)據(jù)上準(zhǔn)備模型? 。
可以通過調(diào)用??predict()??函數(shù)并指定要預(yù)測(cè)的一個(gè)或多個(gè)時(shí)間的索引來進(jìn)行預(yù)測(cè)。
我們將ARIMA模型擬合到整個(gè)Shampoo Sales數(shù)據(jù)集,并檢查殘差。
首先,我們擬合ARIMA(5,1,0)模型。這會(huì)將自回歸的滯后值設(shè)置為5,使用1的差分階數(shù)使時(shí)間序列平穩(wěn),并使用0的移動(dòng)平均模型。
擬合模型時(shí),會(huì)提供許多有關(guān)線性回歸模型擬合的調(diào)試信息。我們可以通過將disp??參數(shù)設(shè)置為0 來關(guān)閉此功能? 。
運(yùn)行示例將顯示擬合模型的摘要。這總結(jié)了所使用的系數(shù)值以及對(duì)樣本中觀測(cè)值進(jìn)行擬合的技巧。
???????????????????????????? ARIMA Model Results
==============================================================================
Dep. Variable:????????????????D.Sales?? No. Observations:?????????????????? 35
Model:???????????????? ARIMA(5, 1, 0)?? Log Likelihood????????????????-196.170
Method:?????????????????????? css-mle?? S.D. of innovations???????????? 64.241
Date:????????????????Mon, 12 Dec 2016?? AIC????????????????????????????406.340
Time:????????????????????????11:09:13?? BIC????????????????????????????417.227
Sample:????????????????????02-01-1901?? HQIC?????????????????????????? 410.098
???????????????????????? - 12-01-1903
=================================================================================
????????????????????coef????std err??????????z??????P>|z|??????[95.0% Conf. Int.]
---------------------------------------------------------------------------------
const????????????12.0649??????3.652??????3.304??????0.003???????? 4.908????19.222
ar.L1.D.Sales????-1.1082??????0.183???? -6.063??????0.000????????-1.466????-0.750
ar.L2.D.Sales????-0.6203??????0.282???? -2.203??????0.036????????-1.172????-0.068
ar.L3.D.Sales????-0.3606??????0.295???? -1.222??????0.231????????-0.939???? 0.218
ar.L4.D.Sales????-0.1252??????0.280???? -0.447??????0.658????????-0.674???? 0.424
ar.L5.D.Sales???? 0.1289??????0.191??????0.673??????0.506????????-0.246???? 0.504
????????????????????????????????????Roots
=============================================================================
???????????????? Real?????????? Imaginary?????????? Modulus???????? Frequency
-----------------------------------------------------------------------------
AR.1?????????? -1.0617?????????? -0.5064j????????????1.1763?????????? -0.4292
AR.2?????????? -1.0617?????????? +0.5064j????????????1.1763????????????0.4292
AR.3????????????0.0816?????????? -1.3804j????????????1.3828?????????? -0.2406
AR.4????????????0.0816?????????? +1.3804j????????????1.3828????????????0.2406
AR.5????????????2.9315?????????? -0.0000j????????????2.9315?????????? -0.0000
-----------------------------------------------------------------------------
首先,我們得到了殘差的線形圖,這表明該模型可能仍未捕獲某些趨勢(shì)信息。

?
ARMA擬合殘差線圖
接下來,我們獲得了殘留誤差值的密度圖,表明誤差為高斯分布。

?
ARMA擬合殘差密度圖
顯示剩余誤差的分布。結(jié)果表明,確實(shí)在預(yù)測(cè)中存在偏差(殘差均值非零)。
count?? 35.000000
mean????-5.495213
std???? 68.132882
min?? -133.296597
25%????-42.477935
50%???? -7.186584
75%???? 24.748357
max????133.237980
請(qǐng)注意,盡管上面我們將整個(gè)數(shù)據(jù)集用于時(shí)間序列分析,但理想情況下,在開發(fā)預(yù)測(cè)模型時(shí),我們僅對(duì)訓(xùn)練數(shù)據(jù)集執(zhí)行此分析。
接下來,讓我們看看如何使用ARIMA模型進(jìn)行預(yù)測(cè)。
滾動(dòng)預(yù)測(cè)ARIMA模型
ARIMA模型可用于預(yù)測(cè)未來的時(shí)間步長(zhǎng)。
我們可以在ARIMAResults??對(duì)象上使用predict()函數(shù)? 進(jìn)行預(yù)測(cè)。它接受時(shí)間步長(zhǎng)索引作為參數(shù)進(jìn)行預(yù)測(cè)。這些索引與用于進(jìn)行預(yù)測(cè)的訓(xùn)練數(shù)據(jù)集的開始有關(guān)。
如果我們?cè)谟?xùn)練數(shù)據(jù)集中使用100個(gè)觀察值來擬合模型,則將用于進(jìn)行預(yù)測(cè)的下一個(gè)時(shí)間步長(zhǎng)的索引指定為預(yù)測(cè)函數(shù)??start = 101,end = 101。這將返回一個(gè)包含一個(gè)包含預(yù)測(cè)的元素的數(shù)組。
如果我們進(jìn)行了任何微分(?在配置模型時(shí)d> 0),我們也希望預(yù)測(cè)值在原始比例內(nèi)。這可以通過將typ??參數(shù)設(shè)置為值??'levels'來指定? :??typ ='levels'。
或者,我們可以通過使用Forecast()??函數(shù)避免使用所有這些規(guī)范,該? 函數(shù)使用模型執(zhí)行一步式預(yù)測(cè)。
我們可以將訓(xùn)練數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集,使用訓(xùn)練集擬合模型,并為測(cè)試集上的每個(gè)元素生成預(yù)測(cè)。
鑒于對(duì)差分和AR模型的先前時(shí)間步長(zhǎng)依賴于觀察結(jié)果,因此需要滾動(dòng)預(yù)測(cè)。執(zhí)行此滾動(dòng)預(yù)測(cè)的一種粗略方法是在收到每個(gè)新觀測(cè)值后重新創(chuàng)建ARIMA模型。
我們手動(dòng)在稱為歷史記錄的列表中跟蹤所有觀察值,并且每次迭代都將新的觀察值附加到該列表中。
綜上所述,以下是ARIMA模型在Python中進(jìn)行滾動(dòng)預(yù)測(cè)的示例。
運(yùn)行示例將在每次迭代時(shí)打印預(yù)測(cè)值和期望值。
我們還可以計(jì)算預(yù)測(cè)的最終均方誤差得分(MSE),為其他ARIMA配置提供比較點(diǎn)。
predicted=349.117688, expected=342.300000
predicted=306.512968, expected=339.700000
predicted=387.376422, expected=440.400000
predicted=348.154111, expected=315.900000
predicted=386.308808, expected=439.300000
predicted=356.081996, expected=401.300000
predicted=446.379501, expected=437.400000
predicted=394.737286, expected=575.500000
predicted=434.915566, expected=407.600000
predicted=507.923407, expected=682.000000
predicted=435.483082, expected=475.300000
predicted=652.743772, expected=581.300000
predicted=546.343485, expected=646.900000
Test MSE: 6958.325
創(chuàng)建一個(gè)折線圖,顯示與滾動(dòng)預(yù)測(cè)預(yù)測(cè)(紅色)相比的期望值(藍(lán)色)。我們可以看到這些值顯示出一些趨勢(shì)并且處于正確的范圍內(nèi)。

ARIMA滾動(dòng)預(yù)測(cè)線圖
該模型可以使用對(duì)p,d甚至q參數(shù)的進(jìn)一步調(diào)整。
配置ARIMA模型
擬合ARIMA模型的經(jīng)典方法是遵循??Box-Jenkins方法論。
此過程使用時(shí)間序列分析和診斷來發(fā)現(xiàn)ARIMA模型的良好參數(shù)。
總而言之,此過程的步驟如下:
模型識(shí)別。使用圖和匯總統(tǒng)計(jì)信息來識(shí)別趨勢(shì),季節(jié)性和自回歸元素,以了解差異量和所需滯后的大小。
參數(shù)估計(jì)。使用擬合過程來找到回歸模型的系數(shù)。
模型檢查。使用殘差圖和統(tǒng)計(jì)檢驗(yàn)確定模型未捕獲的時(shí)間結(jié)構(gòu)的數(shù)量和類型。
重復(fù)該過程,直到在樣本內(nèi)或樣本外觀察值(例如訓(xùn)練或測(cè)試數(shù)據(jù)集)上達(dá)到理想的擬合水平為止。
在1970年經(jīng)典的教科書中?,George Box和Gwilym Jenkins 題為“?時(shí)間序列分析:預(yù)測(cè)和控制”,對(duì)這一過程進(jìn)行了描述? 。如果您有興趣深入研究這種類型的模型和方法,現(xiàn)在可以提供更新的第五版。
鑒于該模型可以有效地適合中等大小的時(shí)間序列數(shù)據(jù)集,因此該模型的網(wǎng)格搜索參數(shù)可能是一種有價(jià)值的方法。
摘要
在本教程中,您發(fā)現(xiàn)了如何為Python中的時(shí)間序列預(yù)測(cè)開發(fā)ARIMA模型。
具體來說,您了解到:
關(guān)于ARIMA模型,如何配置它以及模型進(jìn)行的假設(shè)。
如何使用ARIMA模型執(zhí)行快速的時(shí)間序列分析。
如何使用ARIMA模型進(jìn)行樣本預(yù)測(cè)之外的預(yù)測(cè)。
您對(duì)ARIMA或本教程有任何疑問嗎?
在下面的評(píng)論中提出您的問題,我們會(huì)盡力回答。