百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

为什么开始使用 sktime 进行预测

toyiye 2024-06-21 12:26 10 浏览 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 汇集了来自许多预测库的功能。在此基础上,它提供了一个统一的 API,与 scikit-learn 兼容。

在这种情况下,统一 API 的优势是什么?以下是一些主要原因:

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

? 由于预测者的明确分类,它有助于避免在选择合适的算法时出现混淆。

? 由于所有预报员共享一个通用界面,因此它使工作流程具有可读性和可理解性。它们在单独的类中实现,就像在其他工具箱中一样,包括 scikit-learn。

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

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


Output:
2002Q2 11477.868

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

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

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

Output:
Absolute FH: ForecastingHorizon(['2002Q2', '2002Q3', '2002Q4', '2003Q1', '2003Q2', '2003Q3','2003Q4', '2004Q1', '2004Q2', '2004Q3', '2004Q4', '2005Q1', '2005Q2', '2005Q3', '2005Q4', '2006Q1', '2006Q2', '2006Q3', '2006Q4', '2007Q1', '2007Q2', '2007Q3', '2007Q4', '2008Q1', '2008Q2', '2008Q3', '2008Q4', '2009Q1', '2009Q2', '2009Q3'], dtype='period[Q-DEC]', name='date', is_relative=False)

Relative FH ahead: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

Relative FH in-sample: [-29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0]

现在让我们深入了解一些常见的 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() 函数轻松实现自定义评分器。下面显示了定义自定义指标和评估模型的示例。

Output:
custom MAPE: 0.05751249071487726
custom MAPE per row:
date
2002Q2 0.001020
2002Q3 0.003918
2002Q4 0.002054
2003Q1 0.004020
2003Q2 0.009772
Freq: Q-DEC, dtype: float64

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

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

我们可以在evaluate() 方法中指定时间交叉验证拆分器。除了选择窗口类型之外,我们还可以指定添加新数据的策略。我们可以通过重新拟合我们的模型或更新它来做到这一点。下面是使用扩展窗口执行交叉验证的示例。



最后,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 — 将时间序列转换为类似于正态分布,

? HampelFilter — 检测时间序列中的异常值,

? 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 界面模式适应预测问题。该软件包仍在开发中,但即使是现在,它也是预测的绝佳选择。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码