python预测模型 存数据库_如何在Python中保存ARIMA时间序列预测模型

每日女性出生的数量

Python环境

确认你使用的是最新版本的statsmodels库。

你可以通过运行下面的脚本来检查:import statsmodels

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

运行脚本,如果是最新版本,会显示statsmodels 0.6或0.6.1。statsmodels: 0.6.1

Python 2/3皆可。

更新:我确认在statsmodels 0.8这个问题仍然存在并会导致产生错误消息:AttributeError: 'ARIMA' object has no attribute 'dates'

ARIMA模型保存错误

我们可以很容易地在“每日出生的女性数目”数据集上训练一个ARIMA模型。

下面的代码片段可以训练一个基于该数据集的ARIMA(1,1,1)模型。

model.fit()函数会返回一个ARIMAResults对象,我们可以调用save()函数将模型保存在文件中,使用load()函数加载现有的模型。from pandas import Series

from statsmodels.tsa.arima_model import ARIMA

from statsmodels.tsa.arima_model import 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 "...", line 16, in

loaded = ARIMAResults.load('model.pkl')

File ".../site-packages/statsmodels/base/model.py", line 1529, in load

return load_pickle(fname)

File ".../site-packages/statsmodels/iolib/smpickle.py", line 41, in load_pickle

return cPickle.load(fin)

TypeError: __new__() takes at least 3 arguments (1 given)

具体来说,注意下面这行:TypeError: __new__() takes at least 3 arguments (1 given)

到截至目前,我们该如何解决这个问题呢?

ARIMA模型保存Bug的解决方法

Zae Myung Kim在2016年9月发现并报告了这个Bug。

你可以通过下面的链接,了解他的工作:

这个错误的产生是因为一个pickle需要的函数(pickle,用于序列化Python对象的库)在statsmodels中没有定义。

在保存之前,必须在ARIMA模型中定义函数__getnewargs__,以定义构造对象所需的参数。

我们可以解决这个问题。修复的过程涉及两点:定义适用于ARIMA对象的___getnewargs___函数实现 。

将定义的函数添加到ARIMA程序中。

非常感谢 Zae Myung Kim,在他的bug报告中已经提供了一个实现该函数的例子,所以我们可以直接使用它:def __getnewargs__(self):

return ((self.endog),(self.k_lags, self.k_diff, self.k_ma)

Python允许我们可以修补一个对象,哪怕是在像statsmodels这样的库中。

我们可以通过使用赋值的方式,在现有的对象上定义一个新的函数。

我们可以对ARIMA对象上的___getnewargs___函数做如下操作:ARIMA.__getnewargs__ = __getnewargs__

下面列出了通过使用补丁在Python中加载和保存ARIMA模型的完整示例:from pandas import Series

from statsmodels.tsa.arima_model import ARIMA

from statsmodels.tsa.arima_model import 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模型保存到文件或从文件中加载ARIMA模型。

你发现了如何编写一个补丁来解决这个bug,以及如何证明它确实已经修复了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值