如何在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__函式,它定義構造物件所需的引數。
我們可以解決這個問題。修復涉及兩件事情:
- 定義適用於ARIMA物件的__getnewargs__函式的實現。
- 將新的函式新增到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/