How to Save an ARIMA Time Series Forecasting Model in Python (如何在Python中保存ARIMA时间序列预测模型)

本文主要是介绍How to Save an ARIMA Time Series Forecasting Model in Python (如何在Python中保存ARIMA时间序列预测模型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

How to Save an ARIMA Time Series Forecasting Model in Python

原文作者:Jason Brownlee
原文地址:https://machinelearningmastery.com/save-arima-time-series-forecasting-model-python/
译者微博:@从流域到海域
译者博客:blog.csdn.net/solo95

如何在Python中保存ARIMA时间序列预测模型

自回归积分滑动平均模型(Autoregressive Integrated Moving Average Mode, ARIMA)是一个流行的时间序列分析和预测的线性模型。

statsmodels库中提供了Python中所使用ARIMA的实现。ARIMA模型可以保存到一个文件中,以便以后用于对新数据进行预测。statsmodels库的当前版本中有一个bug,会阻止保存的模型被加载。

在本教程中,您将了解如何诊断和解决此问题。

让我们开始吧。

如何在Python中保存ARIMA时间序列预测模型
照片由Les Chatfield提供,保留一些权利。

日均女性出生数据集

首先,我们来看一个标准的时间序列数据集,我们可以用它来理解有关statsmodels ARIMA实现的问题。

这个“日均女性出生”数据集描述了1959年加利福尼亚州每天的女性出生人数。

计数单位是一,365天都进行了观察。数据集的来源归功于Newton(1988)。

您可以了解更多信息并从DataMarket网站下载数据集。

下载数据集并将其放在当前工作目录中,文件命名为“ daily-total-female-births.csv ”。

下面的代码片段将加载和绘制数据集。

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

运行示例将数据集加载为Pandas系列,然后显示数据的线图。

日均女性出生总数图

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模型保存bug

我们可以很容易地在“日均女性出生”数据集上训练一个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 <module>loaded = ARIMAResults.load('model.pkl')File ".../site-packages/statsmodels/base/model.py", line 1529, in loadreturn load_pickle(fname)File ".../site-packages/statsmodels/iolib/smpickle.py", line 41, in load_picklereturn 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: Implemented getnewargs() method for unpickling

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

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

我们可以解决这个问题。修复涉及两件事情:

  1. 定义一个适用于ARIMA对象的__getnewargs__函数的实现 。
  2. 将这个新函数添加到ARIMA。

谢天谢地,Zae Myung Kim在他的bug报告中提供了一个函数的例子,所以我们可以直接使用它:

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

Python允许我们对一个对象施加猴补丁操作,即使是像statsmodels这样的库。
(猴补丁(英语:Monkey patch),参见维基百科,有相应中文条目,译者注)

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

我们可以对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,以及如何证明它确实已经修复了。

这篇关于How to Save an ARIMA Time Series Forecasting Model in Python (如何在Python中保存ARIMA时间序列预测模型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623344

相关文章

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调