中原富国科技网

角兽将是谁为什么开始使用 sktime 进行预测?盘点丨

中原富国科技网 0

sktime 区别于其他预测框架的特性概述

预测的作用

企业主面临的挑战之一是预测未来的市场状况。预测有助于做出明智的决定并形成对结果的切合实际的期望。这种对预测的需求导致了预测工具的不断发展。它们能够通过从过去的观察中掌握有用的信息来预测未来的事件。最近的一些预测框架包括 Facebook 的 Prophet、Uber 的 Orbit 或 Linkedin 的 Greykite。然而,但细分领域开始成为资本关注的重点。作者| 方文图片来源 |网 络国内机器人产业来到最好时代在工业自动化需求的驱动下,多数 Python 预测包都专注于特定的模型系列,已成世界上最,例如广义加性模型或统计模型。Sktime 旨在填补这些预测工具之间的空白。

什么是sktime?

Sktime 是一个用于时间序列建模的开源工具箱。它结合了分布在许多 Python 库中的功能。它还添加了自己独特的预测功能。它允许我们训练、微调和评估时间序列模型。它与 scikit-learn 兼容。该框架还支持,增长最快的机器人市场,例如时间序列分类、特征提取和时间序列聚类。有关完整的功能列表,全球占比近三分之一,请查看 sktime 的文档。本文重点介绍预测以及 sktime 如何使整个过程更容易。这是 sktime 预测功能的实用演练。但首先,行业潜力巨。另一方面,让我们快速浏览一下本文中使用的数据。

数据概览

所有代码示例都基于来自 statsmodels 库的公共数据集。它包含美国 1959 年至 2009 年的季度宏观经济数据。数据集的完整描述可在此处获得。我们将专注于预测实际国内生产总值 (realgdp)。

Sktime 对用于存储时间序列的数据结构有一定的限制。您可以在下面找到宏观经济数据的导入和转换。

但重点是……

为什么使用 sktime 进行预测?

1)它在一个统一的API下结合了许多预测工具

Sktime 汇集了来自许多预测库的功能。在此基础上,2019年工业机器人出口数量已首次于进口数量,它提供了一个统一的 API,2020 年国内工业机器人产销分别增长约 27%和 21%。强劲的增长潜力与巨国产替代空间,与 scikit-learn 兼容。

在这种情况下,正使国内机器人产业来到最好的时代。如果把协作机器人看作工业机器人中的“手”,统一 API 的优势是什么?以下是一些主要原因:

• 它允许用户轻松实施、分析和比较新模型。

• 由于预测者的明确分类,那移动机器人就是“脚”,它有助于避免在选择合适的算法时出现混淆。

• 由于所有预报员共享一个通用界面,随着3C、半导体、汽车等产业的柔性生产需求幅增加,因此它使工作流程具有可读性和可理解性。它们在单独的类中实现,就像在其他工具箱中一样,包括 scikit-learn。

• 它支持在工作流中更改预测器。这使我们无需在每次更改模型时调整代码结构。

Sktime 的预测者分享了关键的 scikit-learn 方法,例如 fit() 和 predict()。下面的代码显示了一个基本的预测工作流程。

上面的代码生成了一个提前一步的预测。这就是我们为预测范围指定一个的原因。现在让我们关注指定地平线的不同可能性。

预测范围可以是一组相对或绝对值。绝对值是我们想要生成预测的特定数据点。相对值包括将进行预测的步骤列表。如果我们使用 update_predict() 方法进行滚动预测,则相对预测范围特别有用。它使我们无需在每次生成预测时更新绝对范围。当我们添加新数据时,相对范围保持不变。

我们还可以将相对视界转换为绝对视界,反之亦然。从绝对值到相对值的转换尤其值得一提。它不只是生成一个步骤编号列表。这些值与培训系列的最后日期有关。这意味着如果值为负,则它们是样本内预测。此功能很重要,因为预测人员可以为每个步骤拟合不同的参数。下面的代码显示了预测范围之间的差异。

现在让我们深入了解一些常见的 isktime 提供的界面功能。首先,指定和训练模型的过程分为单独的步骤。我们在拟合模型之前指定预测器的参数。在单变量时间序列的情况下, fit() 方法接受训练序列。对于一些预测者,例如

DirectTabularRegressionForecaster 或 DirectTimeSeriesRegressionForecaster,它还包含预测范围。对于其他人,预测范围可以在 predict() 方法中互换传递。以下是使用 AutoARIMA 预测单变量时间序列的示例。

Sktime 还允许使用外生变量进行预测。对于多元外生时间序列,拟合参数的范围更广。它包括一个训练系列和一个带有外生变量的数据框。与单变量时间序列一样,一些预测者需要参数中的预测范围。在下面的代码中,我们使用外生变量 realinv 的滞后值来预测 realgdp 的值。

除了拟合之外,sktime 还可以使用新数据更新预测器。这使我们能够自动更新预测的截止点,因此每次添加新数据时我们都不需要自己更改视野。截止值设置为新训练系列中的最后一个数据点。这种方法允许我们更新预测器的拟合参数。

通用接口适用于所有模型系列。Sktime 包括各种易于使用、集成良好的预测器。以下是目前在 sktime 中实现的预测器列表:

• Holt-Winter 的指数平滑、Theta 预测器和 ETS(来自 statsmodels),

• ARIMA 和 AutoARIMA(来自 pmdarima),

• BATS 和 TBATS(来自 tbats),

• 先知预报员(来自 fbprophet),

• 多项式趋势预测器,

• 克罗斯顿的方法。

Sktime 还允许使用 scikit-learn 的机器学模型来建模时间序列。这让我们看到了 sktime 的下一个巨优势。

2) 提供针对时间序列问题调整的机器学模型

正如我之前提到的,sktime 的 API 与 scikit-learn 兼容。这意味着可以适应许多 scikit-learn 的功能。Sktime 允许我们使用来自 scikit-learn 的机器学模型来解决预测问题。

但是为什么我们不能使用 scikit-learn 中可用的标准回归模型呢?其实我们可以,但是这个过程需要量的手写代码并且容易出错。主要原因是这两个学任务之间的概念差异。

在表格回归中,我们有两种类型的变量——目标变量和特征变量。我们根据特征变量预测目标变量。换句话说,模型从一组列中学以预测不同列的值。这些行可以互换,因为它们彼此独立。

在预测中,我们只需要一个变量。我们根据它的过去值预测它的未来值。也就是说——模型预测同一列的新行。行不可互换,因为未来值取决于过去值。因此,即使我们使用外生变量进行预测,它仍然不是回归问题。

这两个问题之间的区别非常明显。但是在预测问题中使用回归模型的风险是什么?以下是一些原因:

• 它会在评估预测模型时产生问题。使用 scikit-learn 的 train test split 会导致数据泄露。在预测问题中,行相互依赖,因此我们不能随机打乱它们。

• 为预测转换数据的过程容易出错。在预测任务中,我们经常从多个数据点聚合数据或创建滞后变量。这种转换需要量的手写代码。

• 时间序列参数难以调整。滞后小或窗口长度等值不会作为 scikit-learn 估计器的参数公开。这意味着我们需要编写额外的代码来调整它们以适应我们的问题。

• 生成多步预测很棘手。让我们考虑生成未来 14 天的预测。来自 scikit-learn 的回归器基于最后观察到的值进行 14 次预测。那不是我们想要做的。我们希望我们的预测器每次生成预测时都会更新最后一个已知值。也就是说,每个预测都应该基于不同的数据点。

Sktime 允许使用回归模型作为预测器中的组件。由于减少,这是可能的。

归约是使用算法来解决不是为它设计的学任务的概念。这是从复杂的学任务到更简单的学任务的过程。

我们可以使用归约将预测任务转换为表格回归问题。这意味着我们可以使用 scikit-lear 解决预测任务n 的估计量,例如随机森林。

减少过程中发生的关键步骤是:

• 使用滑动窗口方法将训练集拆分为固定长度的窗口。

举个例子——如果窗口长度等于 11,则过程如下所示:第一个窗口包含第 0-10 天的数据(其中第 0-9 天成为特征变量,第 10 天成为目标变量)。第二个窗口包含第 1-11 天的数据(其中第 1-10 天成为特征变量,第 11 天成为目标变量)等。

• 将这些窗口排列在一起。这为我们提供了表格形式的数据,特征变量和目标变量之间有明确的区别。

• 使用以下策略之一——递归、直接或多输出,生成预测。

现在让我们看一些代码,使用回归器组件执行预测。

在我们的示例中,sktime 的方法 make_reduction() 使用 scikit-learn 的模型基于约简创建预测器。它接受一个回归量,即预测策略的名称和窗口长度。它输出一个可以像任何其他预测器一样安装的预测器。您也可以使用

DirectTabularRegressionForecaster 对象将预测问题简化为表格回归任务。但是,该预测器使用直接减少策略。

值得一提的是,减少的参数可以像任何其他超参数一样进行调整。这给我们带来了 sktime 的下一个优势,即评估模型。

3) 它可以快速、轻松地评估预测模型

评估预测模型并不是一项简单的任务。它需要与标准回归问题不同的指标。它们并不总是容易实现,例如平均绝对比例误差 (MASE)。这些模型的验证也可能很棘手,因为我们无法将数据划分为随机子集。最后,调整预报员的参数,例如窗口长度需要量手写代码并且容易出错。Sktime 解决了与评估预测模型相关的三个主要问题。

Sktime 允许通过回溯测试来评估预测者。这个过程包括将我们的数据分成时间训练和测试集。重要的是,测试集包含训练集之前的数据点。剩下的过程就是我们从 scikit-learn 中了解到的。我们在测试集上生成预测并计算指标。然后我们将预测值与实际值进行比较。

Sktime 提供了几个特定于预测模型的性能指标。它们包括,例如平均绝对比例误差 (MASE) 或平均绝对百分比误差 (MAPE)。您可以通过两种方式调用这些指标 - 通过调用函数或类。使用类接口提供了更的灵活性。它允许您例如更改指标的参数。很棒的是,sktime 还提供了使用 make_forecasting_scorer() 函数轻松实现自定义评分器。下面显示了定义自定义指标和评估模型的示例。

在测试集上评估我们的模型并不总是最佳解决方案。有没有办法适应预测问题的交叉验证?答案是肯定的,而且 sktime 做得很好。它提供基于时间的交叉验证。

它支持使用两种拆分数据进行交叉验证的方法。它们包括扩展窗口和滑动窗口。在扩展窗口中,我们在每次运行中通过固定数量的数据点扩展训练集。通过这种方式,我们创建了多个训练测试子集。该过程一直进行,直到训练集达到指定的最小。在滑动窗口中,我们保持训练集的固定小并在数据中移动它。

最后,sktime 提供了几种调整模型超参数的方法。它还启用特定于时间序列的调整参数。目前,sktime 提供了两个调整元预测器:ForecastingGridSearch 和

ForecastingRandomizedSearch。就像在 scikit-learn 中一样,它们通过训练和评估具有不同参数集的指定模型来工作。ForecastingGridSearch 评估超参数的所有组合。ForecastingRandomizedSearch 仅测试其中一个固定小的随机子样本。Sktime 为各种预测器提供参数调整。这还包括具有回归组件的预测器。

宽很棒,我们还可以调整嵌套组件的参数。它的工作原理与 scikit-learn 的 Pipeline 完全一样。我们通过访问由 get_params() 方法生成的字典中的键来做到这一点。它包含连接到预测器超参数的特定键值对。键名由两个元素组成,由双下划线连接,例如`estimator__max_depth`。第一分是组件的名称。第二分是参数的名称。

在下面的示例中,我们使用

ForecastingRandomizedSearchCV 调整随机森林回归器的参数。

Output:

{'window_length': 2, 'estimator__max_depth': 14}

0.014131551041160335

调整嵌套参数是 sktime 提供的复杂用例之一。现在让我们深入探讨 sktime 解决的其他复杂问题。

4) 它为复杂的预测问题提供了新功能

sktime 也支持复杂的预测问题。它提供了广泛的转换器,可以在拟合模型之前改变我们的时间序列。它还允许我们建造管道,连接变压器和预报器。此外,它还提供自动模型选择。它比较了整个模型系列和转换类型。最后,它支持集合预测。

我们现在将分别关注每个功能。让我们从变压器开始。为什么我们甚至需要在预测中进行转换?首先,主要目标是消除过去时间序列中观察到的复杂性。此外,一些预测器,尤其是统计模型,在拟合之前需要特定的转换。一个例子是 ARIMA 模型,它要求时间序列是平稳的。Sktime 提供范围广泛的转换器。其中一些是:

• Detrender — 从时间序列中去除趋势,

• Deseasonalizer — 从时间序列中去除季节性模式,

• BoxCoxTransformer — 将时间序列转换为类似于正态分布,

• HelFilter — 检测时间序列中的异常值,

• TabularToSeriesAdaptor — 使表格转换适应系列(例如,适应来自 scikit-learn 的预处理功能)。

确保检查所有这些,因为可用变压器的列表仍在增长。Sktime 提供了与 scikit-learn 中可用的方法类似的方法。它们包括 fit()、transform() 和 fit_transform()。一些转换器也共享 inverse_transform() 方法。它可以访问与初始时间序列相同规模的预测。

下面的代码显示了转换时间序列和反转操作的示例。

Sktime 允许将 Transformer 与预报器链接以获得单个预报器对象。这可以使用管道来完成。Sktime 提供了一个

TransformedTargetForecaster 类。它是一个管道对象,旨在结合任意数量的变压器和预测器。它可以将多步操作减少到一个步骤。您可以在管道中使用任何类型的预测器。

Sktime 还允许为具有外生变量的时间序列构建管道。它提供了另一个管道对象 ForecastingPipeline。该管道支持外生变量和目标时间序列的转换。

您可以在下面找到使用外生数据构建管道的示例。

现在您有几个要测试的转换和预测器,您可能想知道它们中的哪一个最适合您的问题。Sktime 提供了一种简单的方法来回答这个问题。它支持 autoML,即自动模型选择。这可以使用 MultiplexForecaster 类来完成。此类的对象将预测器列表作为参数。您可以使用它来查找性能最佳的预测器。它适用于 ForecastingGridSearch 和

ForecastingRandomizedSearch。您可以在下面找到它的示例。

Output:

{'selected_forecaster': 'ets'}

Sktime 还支持自动选择管道中使用的转换。它提供了一个 OptionalPassthrough 转换器。它接受另一个转换器对象作为参数。这使我们能够验证选定的转换是否提高了模型的性能。OptionalPassthrough 对象然后作为管道中的一个步骤传递。我们现在可以将这些传递超参数添加到网格并应用交叉验证技术。我们还可以评估变压器的参数。

最后,sktime 支持集合预测。您可以将预测器列表传递给 EnsembleForecaster,然后使用它们来生成预测。如果您从不同系列中选择模型,此功能尤其有用。预报员是平行拟合的。它们中的每一个都会生成其预测。之后,默认情况下对它们进行平均。您可以通过指定 aggfunc 参数来更改聚合技术。

您可以在下面找到一个集合预报器的示例。

Output:

[TBATS(), AutoARIMA()]

复杂功能的列表仍在增长。这将我们引向最后的优势我想提一下。

5)它是由一个活跃的社区的

对于成熟的图书馆来说重要的是,一个多元化的社区一直在积极致力于这个项目。最新版本 (v. 0.7.0) 于 2021 年 7 月发布。它引入了诸如具有外生变量的管道或 Croston 方法等功能。预测目前被标记为稳定功能。但仍有一份未来步骤的清单。它们包括预测区间和概率预测。此外,未来将添加多变量预测。也有计划包括测试模型性能之间的显着差异。

Sktime 很容易扩展。它提供了扩展模板来简化添加新功能的过程。还有一个用于预报员的扩展模板。它使新预测器的本地实施和对 sktime 的贡献变得容易。如果您有兴趣参与该项目,我们非常欢迎您这样做。您可以在此处找到有关捐款的所有信息。

最后的笔记

在我看来,sktime 是一个综合性的工具包,极地提升了 Python 中的预测体验。它简化了训练模型、生成预测和评估预测者的过程。它还可以解决复杂的预测问题。更重要的是,它使 scikit-learn 界面模式适应预测问题。该软件包仍在中,但即使是现在,它也是预测的绝佳选择。

新硬盘铁皮划痕怎么处理

macos白线和蓝线是什么

ios怎么下载91视频

为什么顺丰的快递有的很慢

邮政快递缺点是什么

申通快递疑难件cp原因是什么意思

韵达为什么不送快递了

标签:ime skt 时间序列 机器学习模型 预测器