python3用ARIMA模型進行時間序列預測

原文鏈接:http://tecdat.cn/?p=12260


ARIMA模型是一種流行的且廣泛使用的用於時間序列預測的統計方法。

ARIMA是首字母縮寫詞,代表自動迴歸移動平均。它是一類模型,可在時間序列數據中捕獲一組不同的標準時間結構。

在本教程中,您將發現如何使用Python開發用於時間序列數據的ARIMA模型。

完成本教程後,您將知道:

  • 關於ARIMA模型,使用的參數和模型所作的假設。
  • 如何使ARIMA模型適合數據並使用它進行預測。
  • 如何針對您的時間序列問題配置ARIMA模型。

瞭解如何準備和可視化時間序列數據並開發自迴歸預測模型  。

讓我們開始吧。

自迴歸綜合移動平均模型

一個  ARIMA模型  是一類統計模型分析和預測的時間序列數據。

它明確地迎合了時間序列數據中的一組標準結構,因此提供了一種簡單而強大的方法來進行熟練的時間序列預測。

ARIMA是首字母縮寫詞,代表自動迴歸移動平均線。它是對簡單的自動迴歸移動平均線的概括,並增加了差分的概念。

該首字母縮寫是描述性的。簡而言之,它們是:

  • AR:  自迴歸。一種模型,它使用觀察值和一些滯後觀察值之間的依賴關係。
  • I:  綜合。爲了使時間序列平穩,使用原始觀測值的差異(例如,從上一個時間步長的觀測值中減去觀測值)。
  • MA:  移動平均。一種模型,該模型使用觀察值與應用於滯後觀察值的移動平均模型的殘差之間的依賴關係。

每一個都在模型中明確指定爲參數。使用ARIMA(p,d,q),其中參數替換爲整數值以快速指示所使用的特定ARIMA模型。

ARIMA模型的參數定義如下:

  • p:模型中包括的滯後觀測值的數量,也稱爲滯後階數。
  • d:原始觀測值相差的次數,也稱爲相異度。
  • q:移動平均窗口的大小,也稱爲移動平均的順序。

構建包括指定數量和類型的項的線性迴歸模型,並通過一定程度的差分來準備數據,以使其保持平穩,即消除對迴歸模型產生負面影響的趨勢和季節結構。

可以將值0用作參數,這表示不使用模型的該元素。這樣,可以將ARIMA模型配置爲執行ARMA模型甚至簡單的AR,I或MA模型的功能。

對於時間序列採用ARIMA模型,則假定生成觀測值的基礎過程是ARIMA過程。這看起來似乎很明顯,但是有助於激發需要在原始觀測值和模型預測的殘差中確認模型的假設。

接下來,讓我們看一下如何在Python中使用ARIMA模型。我們將從加載簡單的單變量時間序列開始。

 

洗髮水銷售數據集

該數據集描述了3年期間洗髮水的每月銷售量。

單位是銷售數量,有36個觀察值。

下載數據集並將其放在文件名“ shampoo-sales.csv ”的當前工作目錄中。

下面是使用自定義函數解析日期時間字段的加載銷售數據集的示例。數據集以任意年份爲基準,在這種情況下爲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()

運行示例將輸出數據集的前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

數據還繪製爲時間序列,其中x軸爲月份,y軸爲銷售數字。

 

洗髮水銷售數據集圖

我們可以看到,洗髮水銷售數據集具有明顯的趨勢。

這表明時間序列不是平穩的,並且需要進行差分才能使其穩定,至少相差1。

我們還快速瀏覽一下時間序列的自相關圖。下面的示例繪製了時間序列中滯後的自相關。

通過運行示例,我們可以看到與前10到12個之後之間存在正相關,這可能對前5個之後具有顯着的意義。

模型的AR參數的一個好的起點可能是5。

 

洗髮水銷售數據的自相關圖

ARIMA與Python

 

可以創建ARIMA模型,如下所示:

  1. 通過調用ARIMA()  並傳入  p,  d和  q  參數來定義模型  。
  2. 通過調用fit()  函數在訓練數據上準備模型  。
  3. 可以通過調用  predict()  函數並指定要預測的一個或多個時間的索引來進行預測。

我們將ARIMA模型擬合到整個Shampoo Sales數據集,並檢查殘差。

首先,我們擬合ARIMA(5,1,0)模型。這會將自迴歸的滯後值設置爲5,使用1的差分階數使時間序列平穩,並使用0的移動平均模型。

擬合模型時,會提供許多有關線性迴歸模型擬合的調試信息。我們可以通過將disp  參數設置爲0 來關閉此功能  。

運行示例將顯示擬合模型的摘要。這總結了所使用的係數值以及對樣本中觀測值進行擬合的技巧。

                             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

-----------------------------------------------------------------------------

首先,我們得到了殘差的線形圖,這表明該模型可能仍未捕獲某些趨勢信息。

 

ARMA擬合殘差線圖

接下來,我們獲得了殘留誤差值的密度圖,表明誤差爲高斯分佈。

 

ARMA擬合殘差密度圖

顯示剩餘誤差的分佈。結果表明,確實在預測中存在偏差(殘差均值非零)。

count   35.000000

mean    -5.495213

std     68.132882

min   -133.296597

25%    -42.477935

50%     -7.186584

75%     24.748357

max    133.237980

請注意,儘管上面我們將整個數據集用於時間序列分析,但理想情況下,在開發預測模型時,我們僅對訓練數據集執行此分析。

接下來,讓我們看看如何使用ARIMA模型進行預測。

滾動預測ARIMA模型

ARIMA模型可用於預測未來的時間步長。

我們可以在ARIMAResults  對象上使用predict()函數  進行預測。它接受時間步長索引作爲參數進行預測。這些索引與用於進行預測的訓練數據集的開始有關。

如果我們在訓練數據集中使用100個觀察值來擬合模型,則將用於進行預測的下一個時間步長的索引指定爲預測函數  start = 101,end = 101。這將返回一個包含一個包含預測的元素的數組。

如果我們進行了任何微分( 在配置模型時d> 0),我們也希望預測值在原始比例內。這可以通過將typ  參數設置爲值  'levels'來指定  :  typ ='levels'

或者,我們可以通過使用Forecast()  函數避免使用所有這些規範,該  函數使用模型執行一步式預測。

我們可以將訓練數據集分爲訓練集和測試集,使用訓練集擬合模型,併爲測試集上的每個元素生成預測。

鑑於對差分和AR模型的先前時間步長依賴於觀察結果,因此需要滾動預測。執行此滾動預測的一種粗略方法是在收到每個新觀測值後重新創建ARIMA模型。

我們手動在稱爲歷史記錄的列表中跟蹤所有觀察值,並且每次迭代都將新的觀察值附加到該列表中。

綜上所述,以下是ARIMA模型在Python中進行滾動預測的示例。

運行示例將在每次迭代時打印預測值和期望值。

我們還可以計算預測的最終均方誤差得分(MSE),爲其他ARIMA配置提供比較點。

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

創建一個折線圖,顯示與滾動預測預測(紅色)相比的期望值(藍色)。我們可以看到這些值顯示出一些趨勢並且處於正確的範圍內。

ARIMA滾動預測線圖

該模型可以使用對p,d甚至q參數的進一步調整。

配置ARIMA模型

擬合ARIMA模型的經典方法是遵循  Box-Jenkins方法論

此過程使用時間序列分析和診斷來發現ARIMA模型的良好參數。

總而言之,此過程的步驟如下:

  1. 模型識別。使用圖和彙總統計信息來識別趨勢,季節性和自迴歸元素,以瞭解差異量和所需滯後的大小。
  2. 參數估計。使用擬合過程來找到迴歸模型的係數。
  3. 模型檢查。使用殘差圖和統計檢驗確定模型未捕獲的時間結構的數量和類型。

重複該過程,直到在樣本內或樣本外觀察值(例如訓練或測試數據集)上達到理想的擬合水平爲止。

在1970年經典的教科書中 ,George Box和Gwilym Jenkins 題爲“ 時間序列分析:預測和控制”,對這一過程進行了描述  。如果您有興趣深入研究這種類型的模型和方法,現在可以提供更新的第五版。

鑑於該模型可以有效地適合中等大小的時間序列數據集,因此該模型的網格搜索參數可能是一種有價值的方法。

摘要

在本教程中,您發現瞭如何爲Python中的時間序列預測開發ARIMA模型。

具體來說,您瞭解到:

  • 關於ARIMA模型,如何配置它以及模型進行的假設。
  • 如何使用ARIMA模型執行快速的時間序列分析。
  • 如何使用ARIMA模型進行樣本預測之外的預測。

您對ARIMA或本教程有任何疑問嗎?
在下面的評論中提出您的問題,我們會盡力回答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章