1. 程式人生 > 其它 >如何在Python中儲存ARIMA時間序列預測模型

如何在Python中儲存ARIMA時間序列預測模型

自迴歸移動平均模型(ARIMA)是一種常用於時間序列分析和預測的線性模型。

statsmodels庫提供了Python中使用ARIMA的實現。ARIMA模型可以儲存到檔案中,以便以後對新資料進行預測。在當前版本的statsmodels庫中有一個bug,它阻止了儲存的模型被載入。在本教程中,你將瞭解如何診斷並解決此問題。

讓我們開始吧。

每日女嬰出生資料集

首先,讓我們看看標準時間序列資料集,我們可以用statsmodels ARIMA實現來理解這個問題

這個每日的女嬰出生資料集描述了1959年加利福尼亞每日出生的女嬰數量。

它的單位是數值型,有365個觀察值。資料集的來源於Newton (1988)。

你可以從DataMarket網站了解更多資訊並下載資料集。

下載資料集並將其放在你當前的工作目錄中,檔案名為daily-total-female-births.csv ”。

以下的程式碼將載入並繪製資料集。

from pandasimport Series
from matplotlibimport pyplot
series= Series.from_csv('daily-total-female-births.csv', header=0)
series.plot()
pyplot.show()

執行該示例載入資料庫,並生成 Pandas 庫中的 Series 物件,然後顯示資料的折線圖。

Python環境

確認正在使用statsmodels庫是最新版本。

你可以通過執行以下指令碼來執行此操作:

import statsmodels
print('statsmodels: %s' % statsmodels.__version__)

執行指令碼應該產生一個顯示statsmodels 0.6或0.6.1的結果(目前更新到0.8,bug仍然存在)。

statsmodels:0.6.1

匯出錯誤資訊:

AttributeError:'ARIMA' object has no attribute'dates'

ARIMA模型儲存錯誤

我們可以輕鬆地在每日女嬰出生資料集上訓練一個ARIMA模型。

下面的程式碼片段在資料集上訓練了一個ARIMA(1,1,1)。該model.fit()函式返回一個ARIMAResults物件,我們可以呼叫save()儲存檔案模型然後呼叫load()載入它。

from pandasimport Series
from statsmodels.tsa.arima_modelimport ARIMA
from statsmodels.tsa.arima_modelimport ARIMAResults
# load data
series= Series.from_csv('daily-total-female-births.csv', header=0)
# prepare data
X= series.values
X= X.astype('float32')
# fit model
model= ARIMA(X, order=(1,1,1))
model_fit= model.fit()
# save model
model_fit.save('model.pkl')
# load model
loaded= ARIMAResults.load('model.pkl')

執行此示例將訓練模型並將其儲存到檔案中,沒有遇到問題。

但當你嘗試從檔案載入模型時,就會報告錯誤。

Traceback (most recent call last):
  File "...", line16,in <module>
    loaded= ARIMAResults.load('model.pkl')
  File ".../site-packages/statsmodels/base/model.py", line1529,in load
    return load_pickle(fname)
  File ".../site-packages/statsmodels/iolib/smpickle.py", line41,in load_pickle
    return cPickle.load(fin)
TypeError: __new__() takes at least3 arguments (1 given)

錯誤資訊如下:

TypeError: __new__() takes at least3 arguments (1 given)

那麼我們該如何解決呢?

ARIMA模型儲存Bug解決方法

Zae Myung Kim在2016年9月發現並報告了這個錯誤。

你可以在這裡閱讀全文:

  • BUG: Implemented __getnewargs__() method for unpickling

會發生這種錯誤是因為在statsmodels中尚未定義pickle(用於序列化Python物件的庫)所需的函式。

在儲存之前,必須在ARIMA模型中定義__getnewargs__函式,它定義構造物件所需的引數。

我們可以解決這個問題。修復涉及兩件事情:

  1. 定義適用於ARIMA物件的__getnewargs__函式的實現。
  2. 將新的函式新增到ARIMA。

Zae Myung Kim在他的錯誤報告中提供了一個功能的例子,我們可以直接使用它:

def __getnewargs__(self):
    return ((self.endog),(self.k_lags,self.k_diff,self.k_ma))

Python允許我們對一個物件使用猴子補丁(monkey patch),像statsmodels庫做的那樣。

我們可以使用賦值在現有物件上定義一個新的函式。

我們可以在ARIMA物件上的__getnewargs__函式中執行以下操作:

ARIMA.__getnewargs__= __getnewargs__

在Python中使用猴子補丁訓練、儲存和載入ARIMA模型的完整示例如下:

from pandasimport Series
from statsmodels.tsa.arima_modelimport ARIMA
from statsmodels.tsa.arima_modelimport ARIMAResults

# monkey patch around bug in ARIMA class
def __getnewargs__(self):
    return ((self.endog),(self.k_lags,self.k_diff,self.k_ma))
ARIMA.__getnewargs__= __getnewargs__

# load data
series= Series.from_csv('daily-total-female-births.csv', header=0)
# prepare data
X= series.values
X= X.astype('float32')
# fit model
model= ARIMA(X, order=(1,1,1))
model_fit= model.fit()
# save model
model_fit.save('model.pkl')
# load model
loaded= ARIMAResults.load('model.pkl')

執行該示例現在成功載入模型沒有報錯。

總結

在這篇文章中,你學會了如何解決statsmodels ARIMA實現中的阻止你將ARIMA模型儲存並載入到檔案的bug。

你學會了如何編寫一個猴子補丁來解決這個bug,以及如何證明它已經被修復了。

原文:http://machinelearningmastery.com/save-arima-time-series-forecasting-model-python/