%%capture
!pip install neuralforecast
预测样本内
关于如何生成样本内预测的教程。
本教程提供了如何使用 core
类的 predict_insample
函数生成训练和验证集预测的示例。在这个示例中,我们将对 AirPassengers 数据训练 NHITS
模型,并展示在模型拟合后如何恢复样本内预测。
样本内预测:生成训练和验证集预测的过程。
使用案例: * 调试:生成样本内预测对于调试目的非常有用。例如,检查模型是否能够拟合训练集。 * 训练收敛:检查模型是否已经收敛。 * 异常检测:样本内预测可用于检测训练集中异常行为(例如,离群值)。(注意:如果模型过于灵活,它可能能够完美地预测离群值)
您可以使用 Google Colab 通过 GPU 运行这些实验。
1. 安装 NeuralForecast
2. 加载AirPassengers数据
core.NeuralForecast
类包含共享的fit
、predict
和其他方法,这些方法的输入为包含['unique_id', 'ds', 'y']
列的pandas DataFrame,其中unique_id
标识数据集中单个时间序列,ds
是日期,y
是目标变量。
在这个示例数据集中,由一组单个系列组成,但您可以很容易地将模型拟合到更大的长格式数据集。
%%capture
from neuralforecast.utils import AirPassengersDF
= AirPassengersDF # 定义于 neuralforecast.utils
Y_df 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 |
3. 模型训练
首先,我们在AirPassengers数据上训练NHITS
模型。我们将使用core
类的fit
方法来训练模型。
import pandas as pd
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS
%%capture
= 12
horizon
# 尝试不同的超参数以提高准确性。
= [NHITS(h=horizon, # 预测范围
models =2 * horizon, # 输入序列的长度
input_size=1000, # 训练步骤数
max_steps=[2, 1, 1], # 每个堆栈输出的下采样因子
n_freq_downsample= 3 * [[1024, 1024]]) # 每个区块中的单元数量。
mlp_units
]= NeuralForecast(models=models, freq='M')
nf =Y_df, val_size=horizon) nf.fit(df
4. 预测样本内数据
使用NeuralForecast.predict_insample
方法,您可以在模型训练后获得训练集和验证集的预测。该函数将始终使用在fit
或cross_validation
方法中最后一次用于训练的数据集。
通过step_size
参数,您可以指定生成预测时连续窗口之间的步长。在此示例中,我们将step_size=horizon
设置为生成不重叠的预测。
以下图示展示了基于step_size
参数和模型的h
(预测范围)如何生成预测。在图中,我们设置step_size=2
和h=4
。
= nf.predict_insample(step_size=horizon) Y_hat_insample
Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 37.76it/s]
predict_insample
函数返回一个 pandas DataFrame,包含以下列: * unique_id
: 时间序列的唯一标识符。 * ds
: 每行预测的日期戳。 * cutoff
: 进行预测时的日期戳。 * y
: 目标变量的实际值。 * model_name
: 预测模型的预测值。在本例中为 NHITS
。
Y_hat_insample.head()
unique_id | ds | cutoff | NHITS | y | |
---|---|---|---|---|---|
0 | 1.0 | 1949-01-31 | 1948-12-31 | 0.204289 | 112.0 |
1 | 1.0 | 1949-02-28 | 1948-12-31 | 0.302111 | 118.0 |
2 | 1.0 | 1949-03-31 | 1948-12-31 | 0.399522 | 132.0 |
3 | 1.0 | 1949-04-30 | 1948-12-31 | 0.429369 | 129.0 |
4 | 1.0 | 1949-05-31 | 1948-12-31 | 0.518200 | 121.0 |
该函数将从时间序列的第一个时间戳生成预测。由于模型在生成预测时输入信息非常有限,因此对于这些初始时间戳,预测可能并不准确。
5. 绘制预测结果
最后,我们绘制训练集和验证集的预测结果。
import matplotlib.pyplot as plt
=(10, 5))
plt.figure(figsize'ds'], Y_hat_insample['y'], label='True')
plt.plot(Y_hat_insample['ds'], Y_hat_insample['NHITS'], label='Forecast')
plt.plot(Y_hat_insample['ds'].iloc[-12], color='black', linestyle='--', label='Train-Test Split')
plt.axvline(Y_hat_insample['Timestamp [t]')
plt.xlabel('Monthly Passengers')
plt.ylabel(
plt.grid() plt.legend()
请注意,训练集的预测非常准确,而验证集(最后12个时间戳)的预测则不够精准。这是因为模型是在训练集上训练的,而深度学习模型如NHITS
很容易对训练集产生过拟合。
参考文献
Give us a ⭐ on Github