如何使用Python超参数的网格搜索ARIMA模型

更多腾讯海量技术文章,请关注云+社区:https://cloud.tencent.com/developer

我们都知道用于时序分析和预测的ARIMA模型可能很难配置。

需要通过反复地审查诊断图和已经使用了40多年的启发式策略中训练并修正三个参数的错误。

我们可以通过使用网格搜索过程来自动化评估ARIMA模型的大量超参数的过程。

在本教程中,您将了解如何使用Python中的超参数网格搜索来调整ARIMA模型。

完成本教程后,您将知道:

您可以使用一般程序来调整ARIMA的超参数以进行滚动式一步预测(rolling one-step forecast)。

如何在标准单变量时间序列数据上应用ARIMA超参数优化。

扩展更精细和强大的模型程序的思路。

让我们开始吧。

时间序列的诊断图可以与启发式策略一起使用以确定ARIMA模型的超参数。

他们可以大多数都可以确定ARIMA模型的参数,但有的时候不能确定。

我们可以使用不同的模型超参数的组合来自动化训练和评估ARIMA模型。在机器学习中,这被称为网格搜索或模型调整。

在本教程中,我们将开发一种网格搜索ARIMA超参数的单步滚动预测方法。

该方法分为两部分:

评估一个ARIMA模型。

评估一组ARIMA参数。

本教程中的代码使用Python库是scikit-learn,Pandas和statsmodels。

1.评估ARIMA模型

我们可以通过在训练数据集上准备ARIMA模型并评估测试数据集的预测来评估ARIMA模型。

这种方法涉及以下步骤:

将数据集分解为训练集和测试集。

按测试数据集中的时间序列进行预测。

训练一个ARIMA模型。

做一个一步的预测。

存储预测结果; 获取并存储实际观察结果。

计算与预期值的误差。

我们可以在Python中将其实现为一个新的独立函数,名为evaluate_arima_model(),它将时间序列数据集作为输入,以及具有p,d和q参数的元组作为输入。

数据集分为两部分:初始训练数据集为66%,测试数据集为剩余的34%。

我们需要对测试集的数据进行迭代。只需要一次迭代就可以提供一个可以用来对新数据进行预测的模型。迭代方法允许每个时间步骤训练新的ARIMA模型。

每次迭代都进行一次预测并存储在一个列表中。这样,在测试集结束时,所有预测都可以与期望值列表进行比较,并计算差值。所以我们就计算并返回均方误差数。

下面列出了完整的功能。

现在我们已经知道如何评估一组ARIMA超参数,那接下来让我们来看看如何重复调用这个函数来对参数网格进行评估。

2.迭代ARIMA参数

评估一套参数是相对比较简单的。

用户必须指定p,d和q ARIMA参数的网格来迭代计算。并为每个参数创建一个模型,通过调用前一节中提到的evaluate_arima_model()函数来评估其性能。

该函数必须跟踪观察到的最低误差分数并记录它的配置参数。我们可以在函数末尾加个打印功能将这些信息打印到标准输出上(默认直接打印到屏幕)。

我们可以将这个名为evaluate_models()的函数实现这个功能,这个函数包含四个循环的。

还要考虑两个额外的问题。首先是确保输入数据是浮点值(而不是整数或字符串),如果不是浮点值这可能导致ARIMA过程失败。

其次,统计模型ARIMA程序内部使用数值优化程序为模型找到一组系数。这些程序可能会失败,还可能会引发异常。我们必须捕获这些异常并跳过导致问题的配置。出现的异常次数可能远远超出你的想象。

此外,建议对此代码忽略警告,以避免运行过程产生大量干扰信息。完成代码如下:

最后,即使有了所有这些保护措施,底层的C和Fortran库仍然会有警告输出,例如:

为简洁起见,这些告警内容已从本教程中报告的结果中删除。下面列出了评估ARIMA超参数网格的完整过程。

现在我们就有一个网格搜索ARIMA超参数的程序,让我们来测试两个单变量时间序列问题的过程。

我们将从洗发水销售数据集开始。

洗发水销售数据集包括了3年内洗发水的月销售数量。

这些数据的单位是一个销售计数,有36个数据点。原始数据集归功于Makridakis,Wheelwright和Hyndman(1998)等人的收集工作。

从这里了解关于数据集的更多信息:https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period

下载数据集并将其放置到当前工作目录中,文件名为 “ shampoo-sales.csv ”。

数据的时间轴并没有给出年份。所以我们可以使用自定义的日期分析函数加载数据和基准年(从1900年开始),如下所示:

加载成功后,我们就可以指定一个p,d和q值的位置来搜索并传递给evaluate_models()函数。

我们将尝试一套滞后值(p)和几个差异迭代(d)和残差滞后值(q)。

将这一切与上一节定义的通用函数联合使用,我们可以在洗发水销售数据集中网格搜索ARIMA超参数。

完整的代码示例如下所示。

运行该示例将打印每个成功完成评估的ARIMA参数和均方差(MSE)。

在运行结束时报告ARIMA(4,2,1)的最佳参数,均方误差为4,694.873。

“每日女性出生”数据集是来自1959年加州每天的女性出生人数。

单位是计数单位,有365数据点。数据集的来源归功于Newton(1988)。

在这里了解关于数据集的更多信息:https://datamarket.com/data/set/235k/daily-total-female-births-in-california-1959

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

这个数据集可以直接作为Pandas Series轻松读取。

为了简单起见,我们将探索与上一节中相同的ARIMA超参数网格。

我们将前面的函数联合使用,我们就可以在“每日女性出生”数据集中网格搜索ARIMA参数。下面提供了完整的代码。

运行该示例打印每个配置成功评估的ARIMA参数和均方根误差。

最好的平均参数被报道为ARIMA(6,1,0),均方误差为53.187。

本教程中使用的网格搜索方法很简单,可以很容易地扩展。

本节列出了一些想法来扩展您可能希望探索的方法。

种子网格(Seed Grid)。ACF(Auto Correlation Function)和PACF图的经典诊断工具仍然可以与用于搜索ARIMA参数网格的结果一起使用。

备用措施(Alternate Measures)。该搜索将通过优化样本外均方误差。这可以更改为另一个样本外统计量,样本统计量,如AIC(Akaike information criterion)或BIC(Bayesian Information Criterion),或两者的组合。您可以选择对您的项目最有意义的指标。

残差诊断(Residual Diagnostics)。统计数据可以自动计算残差,以提供合适的额外预测。例子包括残差分布是否为高斯的统计检验,以及残差是否存在自相关。

更新模型(Update Model)。ARIMA模型是从头开始为每个单步预测创建的。通过仔细检查API,可以用新的观察值更新模型的内部数据,而不是从头开始重新创建。

先决条件(Preconditions)。ARIMA模型可以对时间序列数据集进行假设,例如正态性和平稳性方面的假设。在给定的模型被训练之前,可以对这些数据集进行检查并给出警告。

在本教程中,您了解了如何使用Python超参数的网格搜索ARIMA模型。

具体来说,你了解到:

您可以使用网格搜索ARIMA超参数进行单步滚动预测的过程。

如何应用ARIMA超参数调整标准单变量时间序列数据集。

关于如何进一步改进ARIMA超参数网格搜索的思路。

现在就要你自己动手做实验了。

翻译人:Hi胡瀚,该成员来自云+社区翻译社

原文作者:Jason Brownlee

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206A0NH2300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券