Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在Python中保存ARIMA时间序列预测模型

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

作者头像
Steve Wang
发布于 2018-01-31 09:44:33
发布于 2018-01-31 09:44:33
4.1K0
举报
文章被收录于专栏:从流域到海域从流域到海域

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时间序列预测模型
如何在Python中保存ARIMA时间序列预测模型

照片由Les Chatfield提供,保留一些权利。

日均女性出生数据集

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

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

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

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

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

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

代码语言:txt
AI代码解释
复制
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库

你可以通过运行下面的脚本来进行确认:

代码语言:txt
AI代码解释
复制
import statsmodels
print('statsmodels: %s' % statsmodels.__version__)

运行脚本应该产生一个显示statsmodels 0.6或0.6.1的结果。

代码语言:txt
AI代码解释
复制
statsmodels: 0.6.1 

您可以使用Python 2或3。

更新:我可以确认故障仍存在于statsmodels 0.8中并导致下列错误消息出现:

代码语言:txt
AI代码解释
复制
AttributeError: 'ARIMA' object has no attribute 'dates' 

ARIMA模型保存bug

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

下面的代码片段在数据集上的训练出一个ARIMA(1,1,1)模型。

model.fit()函数返回一个ARIMAResults对象,我们可以在这个对象上调用save()保存到文件模型并且之后可以使用load()来加载它。

代码语言:txt
AI代码解释
复制
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')

运行本例将训练出模型并将其保存到文件中,而不会出现问题。

但当您尝试从文件加载模型时,会报告一个错误。

代码语言:txt
AI代码解释
复制
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 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)
 

特别的,注意下面这一行:

代码语言:txt
AI代码解释
复制
TypeError: __new__() takes at least 3 arguments (1 given)

之前的步骤都没出错,那么我们如何解决这个问题呢?

ARIMA模型保存Bug解决方法

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

你可以在这里读到所有和它有关的信息:

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

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

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

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

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

代码语言:txt
AI代码解释
复制
def __getnewargs__(self):
    return ((self.endog),(self.k_lags, self.k_diff, self.k_ma)

Python允许我们对一个对象施加猴补丁操作,即使是像statsmodels这样的库。

(猴补丁(英语:Monkey patch),参见维基百科,有相应中文条目,译者注)

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

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

代码语言:txt
AI代码解释
复制
ARIMA.__getnewargs__ = __getnewargs__

下面列出了使用猴补丁在Python中加载和保存ARIMA模型的完整示例:

代码语言:txt
AI代码解释
复制
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,以及如何证明它确实已经修复了。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 磁盘管理
Linux磁盘管理好坏管理直接关系到整个系统的性能问题。 Linux磁盘管理常用三个命令为df、du和fdisk。
小小工匠
2021/08/16
6.5K0
du,df,fdisk,mkfs.ext3命令详解
指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。使用 -h 参数来显示 human-readable 的格式。例如:
阳光岛主
2019/02/19
2K0
linux磁盘格式化的操作命令
磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用 mkfs(make filesystem) 命令。
用户9236362
2021/11/29
5.7K0
Linux命令(38)——fdisk命令
fdisk命令用于创建和维护磁盘分区表。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。
恋喵大鲤鱼
2018/08/03
3.1K0
深入理解Linux磁盘的奥秘
当我们想在系统里增加一块硬盘的时候,要做以下这四步工作: 对磁盘进行分区 对新建的分区进行格式化,目的是为了创建系统可用的文件系统 对新建的文件系统进行检验 将新建的文件系统挂载到系统的目录树上 磁盘分区:fdisk fdisk [-l] 设备名称 -l:加上这个参数会输出后面接的这个设备的所有分区的信息;如果后面不写设备名称,那么系统中所有设备的分区信息都会被列出来 PS:fdisk这个命令只是一系列磁盘分区功能的入口命令! 例子:给咱电脑的磁盘进行一下分区 //1。找到所有的磁盘设备的名字 [roo
大闲人柴毛毛
2018/03/09
1.5K0
七.Linux存储管理
主引导分区(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区。
对弈
2019/09/04
4.9K0
Linux从入门到精通(八)——Linux磁盘管理
​ linux文件颜色的含义:蓝色代表目录 绿色代表可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰 色表示其他文件 红色闪烁表示链接的文件有问题了 黄色表示设备文件:
传说之下的花儿
2023/04/16
2.9K0
Linux从入门到精通(八)——Linux磁盘管理
磁盘和移动存储常用命令
硬盘分区与格式化概述 总结:主分区(primary partition)和扩展分区(extended partition)总是不能超过4个,扩展分区只有一个/扩展分区不能直接存储数据,最好是保持原有的Disk,添加新的Disk.
全栈工程师修炼指南
2020/12/17
3K0
磁盘和移动存储常用命令
​Linux 磁盘管理进阶
其中“hdx~”表明分区所在设备的类型、hd 表示ide、x表示哪块盘、~表示分区号
用户8418197
2021/12/23
2.6K0
Linux系统磁盘与分区管理
Linux最传统的磁盘文件系统(filesystem)使用的是EXT4格式,所以要了解文件系统就得要由认识EXT4开始,而文件系统是创建在硬盘上面的,因此我们得了解硬盘的物理组成才行,下面我们回来详细谈一谈磁盘,inode,block还有superblock等文件系统,的理论知识.
王 瑞
2022/12/28
6K0
Linux 学习笔记之超详细基础linux命令 Part 7
---------------------------------接Part 6------------------------------
授客
2019/09/11
1.2K0
Linux磁盘管理和文件系统[通俗易懂]
  磁盘和文件系统的管理是运维人员的重要工作内容之一,本文对磁盘和文件系统的一些概念做了详细解释,管理命令给出了常用示例,方便自己在工作时随时查阅,也欢迎各位一同学习。
全栈程序员站长
2022/09/01
5K0
Linux新手入门:用fdisk命令轻松分区
  fdisk - Partition table manipulator for Linux ,译成中文的意思是磁盘分区表操作工具;本人译的不太好,也没有看中文文档;其实就是分区工具
会长君
2023/04/25
2.2K0
Linux磁盘管理之LVM快速入门配置
描述:LVM——Logical Volume Manager就是动态卷管理在Linux2.4内核以上实现的磁盘管理技术,它可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。
全栈工程师修炼指南
2020/10/26
3.2K0
Linux磁盘管理之LVM快速入门配置
学习笔记0323----linux基本命令(四)(磁盘管理)
linux基本命令 预习内容 1.磁盘管理命令 df 1.1 查看磁盘使用情况 df -h 1.2 查看swap使用情况 1.3 查看磁盘inode使用情况 df -i 1.4 磁盘使用情况用M显示 df -m 2.查看目录文件大小 du -sh 3.磁盘分区、格式化、挂载 3.1 虚拟机添加一块10g的磁盘,添加完成重启虚拟机 3.2 磁盘划分分区 fdisk 3.3 磁盘格式化 3.3.1 mke2fs -t ext4 -b 2048 /dev/sdb1 3.3.2 mkfs.ext4 /dev
嘻哈记
2022/01/11
2K0
学习笔记0323----linux基本命令(四)(磁盘管理)
Vmvare扩展虚拟机磁盘大小
Vmvare设置好虚拟机的磁盘大小之后,发现磁盘空间不够了,这个时候怎么扩展磁盘的大小呢?
大数据流动
2020/01/02
1.6K0
Linux磁盘管理之LVM快速入门配置
描述:LVM——Logical Volume Manager就是动态卷管理在Linux2.4内核以上实现的磁盘管理技术,它可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。
全栈工程师修炼指南
2022/09/28
1.9K0
Linux磁盘管理之LVM快速入门配置
linux下挂载新硬盘和分区的步骤 (50天)
今天和大家分享一下在linux下挂载新硬盘的步骤。 演示的环境基于centos [root@localhost etc]# uname -a Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux [root@localhost etc]# cat system-release CentOS release 6.2 (Final)
jeanron100
2018/03/13
4.9K0
Linux学习笔记之Linux磁盘及文件系统管理笔记
Linux磁盘及文件系统管理 CPU,memory(RAM),I/O i/o: disks,ehtercard disks:持久存储数据 接口类型: IDE(ata): 并口,133MB/s;并行总线,双向四车道;并行数据容易产生干扰,导致数据损坏重传,因此效率低;并行越高,干扰频率越高 SCSI:并口,Ultrascsi320,320MB/s,UltraSCSI640,640MB
Jetpropelledsnake21
2019/07/10
2.3K0
磁盘管理之 raid 文件系统 分区
该文章介绍了如何在不使用挂载的情况下,将硬盘分区格式化为ext4文件系统。同时,文章也探讨了如何将硬盘挂载到Linux系统中,并总结了一些常见的问题和解决方法。
惨绿少年
2017/12/27
2.7K0
相关推荐
Linux 磁盘管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档