使用 Dart 轻松进行时间序列预测

源节点: 1246070

使用草稿的时间序列概述

想象一下!

  • 您在一家提供业务解决方案的公司担任数据科学家。 有一天,你的老板交出了两个数据集,其中记录了没有航空乘客(航空乘客)和奶牛产奶(主要是牛奶)的记录,要求对数据进行详细分析并预测其未来值。
  • 通过检查,你发现两者之间没有任何关系。 因此,您决定分别构建两个模型。 因此,您处理了数据集(pandas),找到了季节性(stats-model),并训练了两个模型(Tensorflow/Pytorch)。 经过大量的超级调整后,您找到了一个合适的方案并预测了结果。
  • 有了后果,你去找你的老板,和往常一样,你的老板问“我们不能使用一种模型来做到这一点吗?“。

老板问的问题确实是正确的。 尽管该领域取得了许多进步,但人们发现该领域的工作具有挑战性 时间序列数据。 因此,Unit8 公司创建了一个名为的 python 包 飞镖,旨在解决场景中的问题。

本文是关于如何开始使用该库的实用介绍。 准确地说,我们将重新创建相同的场景,看看这个库能为我们提供什么。 那么让我们开始吧。

安装时间序列草稿

首先,我们将安装 飞镖。 使用 蟒蛇 环境非常推荐。 假设您已经创建了环境,打开终端并输入以下命令:

conda 安装-c conda-forge -c pytorch u8darts-all

注意:这可能需要一些时间,因为可下载的大小约为 2.98 GB,并且将下载所有可用的模型!

安装后,启动 jupyter 笔记本并尝试使用以下命令导入库:

进口飞镖

如果没有输出,则说明导入成功,否则google一下错误:)

从 Dart 库加载数据集

为简单起见,我们将使用 dart 的数据集库 加载数据。

从 darts.datasets 导入 AirPassengersDataset、MonthlyMilkDataset

在这里,我们在模拟场景时导入了两个所需的数据集。

打印数据集

现在让我们打印数据集。 有很多方法可以做到这一点,但我们将重点关注两种最直观的方法。

作为数据数组

一般来说,我们可以直接使用 加载() 方法,得到 的混合物 排列 协调 数据数组 月 数据类型为日期时间(表示时间序列)。

AirPassengersDataset().load() MonthlyMilkDataset().load()

输出:

航空旅客| 使用 Dart 的时间序列
空气数据集
牛奶数据集 | 使用 Dart 的时间序列
牛奶数据集

 

作为数据框

或者,可以使用以下方式将其作为数据框加载 pd_dataframe()。

display("Air Passanger 数据集",AirPassengersDataset().load().pd_dataframe()) display("每月牛奶数据集",MonthlyMilkDataset().load().pd_dataframe())

航空旅客数据集
每月牛奶数据集

看起来我们对航空乘客有 144 个观测值,对每月牛奶数据集有 168 个观测值。

 

绘制数据点

Dataframe 没问题,但它并没有透露太多信息,因此我们可以使用 matplotlib 绘制数据集:

# 加载库 import matplotlib.pyplot as plt %matplotlib inline
# 将数据集加载为数据数组 air_series = AirPassengersDataset().load() milk_series = MonthlyMilkDataset().load()
#plot 图表 air_series.plot(label="乘客数量") milk_series.plot(label="每月生产的牛奶磅数") plt.legend();

在上面的代码中,我们只是 数据和 密谋 它。 此外,我们还包括一个 标签 传说 以便于理解。

结果是一个漂亮的图表:

绘制数据点
情节

这里x轴代表 月, 和 y 轴 – 数据。

请注意,您需要降级到 matplotlib 3.1.3 代码才能在协作中工作。

 

数据预处理

仔细观察上面的内容,我们可以发现数据没有缩放,即它显示出可变性,所以如果我们重新缩放它就好了。

标准缩放

幸运的是我们有缩放器 () 类在库本身中,我们可以通过创建一个缩放器对象然后将其拟合到数据集来使用它。

  1. # 进口
  2. 从 darts.dataprocessing.transformers 导入 Scaler
    
    
  3. # 创建缩放器对象
  4. 缩放器空气,缩放器牛奶=缩放器(),缩放器()
    
    
  5. # 执行缩放
  6. 空气系列缩放 = 缩放器空气.fit_transform(空气系列)
  7. milk_series_scaled = scaler_milk.fit_transform(milk_series)

在上面的代码中,我们导入了 定标器,创建了两个 缩放对象,并执行了 缩放.

现在让我们看看这些变化,看看有什么不同:

#plottingair_ds.plot(label="乘客数量") air_series_scaled.plot(label = "航空乘客比例") milk_series_scaled.plot(label = "牛奶重量") plt.legend();
标准缩放
斯克拉德图

可以看出,我们的数据是按比例缩放的,并且在绘图的 y 轴上很明显。

训练测试拆分

现在使用缩放数据,我们将分割数据集。 为此,我们将前 36 个样本作为训练集,并保留作为两个数据集的验证集。

air_series_train、air_series_val = air_series_scaled[:-36]、air_series_scaled[-36:] milk_series_train、milk_series_val = milk_series_scaled[:-36]、milk_series_scaled[-36:]

请注意,这不是一个数据框,而是一个 darts 时间序列对象。

为了确认,您可以执行以下操作:

类型(air_series_train)

使用 Dart 训练时间序列模型

最后,我们就处于进行训练的状态了。 DART 提供了许多解决方案,例如 Arima、Auto-Arima、Varima FFT、四 Theta、Prophet、 以及一些深度学习模型,例如 RNN、Block RNN(使用 LSTM)、TCN、NBEATS、Transformer.

 

加载 Darts 时间序列模型

对于我们的用例,我们将采用 N-节拍 提供模型,因为它支持多变量时间序列预测(具有多个特征的数据),这将使我们能够使用单个模型执行所有预测。 那么让我们加载它吧。

# 从 darts.models 导入模型 import NBEATSModel print('model_loaded')
>> 模型_已加载

注意:您可以自由使用您喜欢的任何型号,但请务必阅读文档并了解每个型号的功能。

 

创建模型对象

加载我们的模型后,让我们启动它。

# 创建模型对象 model = NBEATSModel(input_chunk_length=24 , output_chunk_length=12, n_epochs = 100 , random_state = 15)

这里需要注意的快速事项之一是 输入, 和输出块长度 is 24 几个月和 12 分别为几个月。 在时间序列中,我们通常更喜欢使用时间窗口而不是使用真实数据。 此外,我们正在为 100 时代。

额外的阐述

  • 在第一个步骤/时期,我们将提供 24 个月的数据作为输入数据,12 个月的数据作为输出数据。
  • 下一步,我们将向前迈出一步,提供接下来 24 个月的数据作为输入和 12 个月的输出,依此类推,直到训练集的所有数据点都用完。
  • 在此基础上,每一步都会计算损失,并且模型会随着时间的推移学习表现得越来越好。

将数据拟合到模型

现在最后,让我们通过拟合训练数据来训练我们的模型。 这可能需要时间,所以要有耐心!

# 拟合模型 model.fit([air_series_train, milk_series_train], verbose = True)

Verbose = True 确保日志。

将数据拟合到模型
训练记录

使用 Dart 的时间序列模型预测和评估

为了确保训练的模型表现良好,我们可以检查它 MAPE  – 预测数据的平均绝对百分比误差。

# 从 darts.metrics 导入 import mape
pred_air = model.predict(n = 36,series = air_series_train) pred_milk = model.predict(n =36,series = milk_series_train)
print("Mape = {:.2f}%".format(mape(air_series_scaled , pred_air))) print("Mape = {:.2f}%".format(mape(milk_series_scaled , pred_milk)))

输出:

>> 梅普 = 6.74% >> 梅普 = 16.82%

显然,错误非常低,并且出现了一个有趣的模式: 奶牛生产的牛奶与航空乘客数量之间存在某种关系, 这很有趣。 另请注意,我们使用单个模型来预测两个数据集! (我们老板提出要解决的问题😁)。

使用 Darts 模型预测可视化时间序列

最后,让我们看看我们的预测是如何在图表上得出的,使用与检查数据集相同的方式,但使用缩放数据集以获得更好的可解释性。

# 绘制结果 air_series_scaled .plot(label = "actual") pred.plot(label = "forecasted") # 验证数据集 plt.legend()
# 绘制结果 milk_ds_scaled.plot(label = "actual") pred.plot(label = "forecasted") # 验证数据集 plt.legend()


使用 Darts 模型预测可视化时间序列 1
空气数据集预测
使用 Darts 模型预测可视化时间序列 2
milk_dataset-预测

蓝线表示预测数据非常接近实际值(b缺线)。 这意味着我们已经成功地完成了我们的探索并解决了我们场景中解决的问题。 恭喜你!

结论

得出的一些结论是:

  • 像 darts 这样的库可以为我们提供一种新的时间序列工作方式,从而实现灵活性和效率。
  • 显然,我们可以使用单个库和模型加载、处理甚至训练多个数据集。
  • 凭借所有的魅力,人们可以成功地将它作为时间序列数据的 scikit-learn 的王座。

至此,这篇微型文章就结束了。 我希望您发现这很有趣,并将所学到的知识应用到您的一些项目中。

回头见。

参考文献:

代码笔记本:- 协同合作

连接:-  LinkedIn, Twitter, Github上分析维迪亚

所有图片均由作者提供。

本文中显示的媒体不属于 Analytics Vidhya 所有,其使用由作者自行决定。

资料来源:https://www.analyticsvidhya.com/blog/2021/10/time-series-forecasting-made-easy-using-darts/

时间戳记:

更多来自 分析维迪亚