快速开始

训练一个LSTM和NHITS模型

本笔记本提供了如何开始使用NeuralForecast库主要功能的示例。NeuralForecast类允许用户轻松与NeuralForecast.models的PyTorch模型进行交互。在此示例中,我们将使用经典的LSTM和近期的NHITS模型对AirPassengers数据进行预测。可用模型的完整列表可以在这里找到。

您可以使用Google Colab在GPU上运行这些实验。

在Colab中打开

1. 安装NeuralForecast

%%capture
!pip install neuralforecast

2. 加载航空乘客数据

core.NeuralForecast 类包含共享的 fitpredict 和其他方法,这些方法以包含 ['unique_id', 'ds', 'y'] 列的 pandas DataFrames 作为输入,其中 unique_id 用于标识数据集中每个单独的时间序列,ds 是日期,y 是目标变量。

在这个示例中,数据集由一组单独的序列组成,但您可以轻松地将您的模型适配到更大的长格式数据集中。

from neuralforecast.utils import AirPassengersDF

Y_df = AirPassengersDF # 定义于 neuralforecast.utils
Y_df.head()
unique_id ds y
0 1.0 1949-01-31 112.0
1 1.0 1949-02-28 118.0
2 1.0 1949-03-31 132.0
3 1.0 1949-04-30 129.0
4 1.0 1949-05-31 121.0
Important

数据框必须包含所有 ['unique_id', 'ds', 'y'] 列。 确保 y 列不包含缺失值或非数字值。

3. 模型训练

拟合模型

使用 NeuralForecast.fit 方法,您可以将一组模型训练到您的数据集中。您可以定义预测的 horizon(在本例中为 12),并修改模型的超参数。例如,对于 LSTM,我们更改了编码器和解码器的默认隐藏大小。

from neuralforecast import NeuralForecast
from neuralforecast.models import LSTM, NHITS, RNN
%%capture
horizon = 12

# 尝试不同的超参数以提高准确性。
models = [LSTM(h=horizon,                    # 预测范围
               max_steps=500,                # 训练步骤数
               scaler_type='standard',       # 用于数据标准化的缩放器类型
               encoder_hidden_size=64,       # 定义LSTM隐藏状态的大小
               decoder_hidden_size=64,),     # 定义了MLP解码器每一层的隐藏单元数量
          NHITS(h=horizon,                   # 预测范围
                input_size=2 * horizon,      # 输入序列的长度
                max_steps=100,               # 训练步骤数
                n_freq_downsample=[2, 1, 1]) # 每个堆栈输出的下采样因子
          ]
nf = NeuralForecast(models=models, freq='M')
nf.fit(df=Y_df)
Tip

深度学习模型的性能对超参数的选择非常敏感。调整正确的超参数是获得最佳预测的重要步骤。这些模型的Auto版本,AutoLSTMAutoNHITS,已经可以自动进行超参数选择。

使用拟合模型进行预测

使用 NeuralForecast.predict 方法,您可以在训练数据 Y_df 之后获得 h 预测。

Y_hat_df = nf.predict()
Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 50.58it/s]
Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 126.52it/s]

NeuralForecast.predict 方法返回一个包含每个 unique_idds 和模型预测值的 DataFrame。

Y_hat_df = Y_hat_df.reset_index()
Y_hat_df.head()
unique_id ds LSTM NHITS
0 1.0 1961-01-31 424.380310 453.039185
1 1.0 1961-02-28 442.092010 429.609192
2 1.0 1961-03-31 448.555664 498.796204
3 1.0 1961-04-30 473.586609 509.536224
4 1.0 1961-05-31 512.466370 524.131592

4. 绘制预测结果

最后,我们将两个模型的预测结果与真实值进行绘图比较。

import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1, figsize = (20, 7))
plot_df = pd.concat([Y_df, Y_hat_df]).set_index('ds') # 将训练数据框和预测数据框连接起来
plot_df[['y', 'LSTM', 'NHITS']].plot(ax=ax, linewidth=2)

ax.set_title('AirPassengers Forecast', fontsize=22)
ax.set_ylabel('Monthly Passengers', fontsize=20)
ax.set_xlabel('Timestamp [t]', fontsize=20)
ax.legend(prop={'size': 15})
ax.grid()

Tip

在本指南中,我们使用一个简单的 LSTM 模型。在大多数情况下,更现代的模型,如 RNNGRUDilatedRNN 的准确性优于 LSTM。可用模型的完整列表可在 这里 找到。

参考文献

Give us a ⭐ on Github