zoukankan      html  css  js  c++  java
  • 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 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月发现了这个错误并报告了错误。

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

    这个错误是因为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,以及如何证明它确实已经修复了。

  • 相关阅读:
    Map容器家族(LinkedHashMap源码详解)
    树篇3-平衡二叉查找树之红黑树
    树篇2-平衡二叉查找树之AVL树
    树篇1-二叉查找树
    Map容器家族(HashMap源码详解)
    位运算符的基本使用和注意事项
    android中获取屏幕的信息
    获取activity的根视图
    初来咋到,请多指教
    linux死机解决办法
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842576.html
Copyright © 2011-2022 走看看