如何在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/

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

580130
来自专栏ATYUN订阅号

使用多种工具组合进行分布式超参数优化

在这篇文章中,我介绍如何使用工具组合来加速超参数优化任务。这里提供了Ubuntu的说明,但可以合理地应用于任何*nix系统。

17940
来自专栏点滴积累

geotrellis使用(四)geotrellis数据处理部分细节

       前面写了几篇博客介绍了Geotrellis的简单使用,具体链接在文后,今天我主要介绍一下Geotrellis在数据处理的过程中需要注意的细节,或者...

36650
来自专栏生信技能树

高通量测序如何寻找T-DNA插入的位置

为了解基因组存在T-DNA插入时,即基因组构成为AC而样本基因组为ABC的情况得到的测序结果在序列比对的时候的可能情况,因此需要先要使用模拟数据进行探索。 第一...

46590
来自专栏人工智能LeadAI

Spark新愿景:让深度学习变得更加易于使用

01 前 言 Spark成功的实现了当年的承诺,让数据处理变得更容易,现在,雄心勃勃的Databricks公司展开了一个新的愿景:让深度学习变得更容易。 当然牛...

39650
来自专栏kalifaの日々

opencv grabCap python实现

处理后模特的蓝眼珠被涂黑了,看久了简直是精神污染。解决办法是去mask里改动眼珠位置的值,设成确定的前景。

13620
来自专栏简书专栏

基于tensorboard的模型训练过程可视化

2018年9月14日笔记 阅读本文的前提是已经阅读《基于tensorflow的一元二次方程回归预测》,文章链接:https://www.jianshu.com...

26330
来自专栏量子位

TensorFlow 1.2正式发布,新增Python 3.6支持

王小新 编译整理 量子位 出品 | 公众号 QbitAI TensorFlow 1.2.0今日正式发布。 主要功能和改进点: 在Windows系统下新增对Pyt...

35740
来自专栏用户2442861的专栏

Caffe中LMDB的使用

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/

35610
来自专栏AI2ML人工智能to机器学习

TF Boy 之初筵 - 分布十三式

我们在 " 机器学习平台的优化器 (平台篇、优化篇)" 里面提到TensorFlow (TF) 速度的成为深度学习的武林第一大帮。 博士好友清华,在这方面也颇有...

8820

扫码关注云+社区

领取腾讯云代金券