迁移学习

迁移学习是指在大型数据集上对灵活模型进行预训练,然后在其他数据上进行少量或无需训练的使用过程。这是机器学习中最杰出的🚀成就之一,并具有许多实际应用。

对于时间序列预测,该技术允许您在不牺牲准确性和速度的情况下获得闪电般的预测⚡(在具有相似准确度的情况下,比我们已经快速的autoARIMA快超过30倍)。

本 Notebook 展示了如何生成一个预训练模型,并将其存储在检查点中,以便对模型从未见过的新时间序列进行预测。

目录
1. 安装 NeuralForecast/DatasetsForecast
2. 加载 M4 数据
3. 实例化 NeuralForecast 核心,拟合并保存
4. 加载预训练模型并对 AirPassengers 进行预测
5. 评估结果

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

在 Colab 中打开

1. 安装库

# %%capture
# !pip 安装 git+https://github.com/Nixtla/datasetsforecast.git@main
# %%capture
# !pip 安装 neuralforecast 
import numpy as np
import pandas as pd
import torch
from IPython.display import display, Markdown

import matplotlib.pyplot as plt

from datasetsforecast.m4 import M4
from neuralforecast.core import NeuralForecast
from neuralforecast.models import NHITS
from neuralforecast.utils import AirPassengersDF
from neuralforecast.losses.numpy import mae, mse
import logging
logging.getLogger("pytorch_lightning").setLevel(logging.WARNING)

此示例将在可用的情况下自动在GPU上运行。确保 cuda 可用。(如果您需要将此投入生产的帮助,请给我们发送电子邮件或加入我们的社区,我们还提供完全托管的解决方案)

torch.cuda.is_available()

2. 加载 M4 数据

M4 类将自动下载完整的 M4 数据集并进行处理。

它返回三个 DataFrame:Y_df 包含目标变量的值,X_df 包含外生日历特征,而 S_df 包含每个时间序列的静态特征(M4 中没有)。在这个例子中,我们只会使用 Y_df

如果您想使用自己的数据,只需替换 Y_df。请确保使用长格式,并具有与我们的数据集类似的结构。

Y_df, _, _ = M4.load(directory='./', group='Monthly', cache=True)
Y_df['ds'] = pd.to_datetime(Y_df['ds'])
Y_df

3. 模型训练与保存

使用 NeuralForecast.fit 方法,您可以对数据集训练一组模型。您只需定义模型的 input_sizehorizoninput_size 是模型将用于学习预测未来 h 步的历史观察数量(滞后)。此外,您可以修改模型的超参数,以获得更好的准确性。

horizon = 12
stacks = 3
models = [NHITS(input_size=5 * horizon,
                h=horizon,
                max_steps=100,
                stack_types = stacks*['identity'],
                n_blocks = stacks*[1],
                mlp_units = [[256,256] for _ in range(stacks)],
                n_pool_kernel_size = stacks*[1],
                batch_size = 32,
                scaler_type='standard',
                n_freq_downsample=[12,4,1])]
nf = NeuralForecast(models=models, freq='M')
nf.fit(df=Y_df)

使用 core.NeuralForecast.save 方法保存模型。该方法使用 PytorchLightning 的 save_checkpoint 功能。我们将 save_dataset=False 设置为仅保存模型。

nf.save(path='./results/transfer/', model_index=None, overwrite=True, save_dataset=False)

4. 将M4转移到AirPassengers

我们使用 core.NeuralForecast.load 方法加载存储的模型,并用 core.NeuralForecast.predict 函数预测 AirPassenger

fcst2 = NeuralForecast.load(path='./results/transfer/')
# 我们定义了训练数据框。 
Y_df = AirPassengersDF.copy()
mean = Y_df[Y_df.ds<='1959-12-31']['y'].mean()
std = Y_df[Y_df.ds<='1959-12-31']['y'].std()

Y_train_df = Y_df[Y_df.ds<='1959-12-31'] # 132次列车
Y_test_df = Y_df[Y_df.ds>'1959-12-31']   # 12项测试
Y_hat_df = fcst2.predict(df=Y_train_df).reset_index()
Y_hat_df.head()
fig, ax = plt.subplots(1, 1, figsize = (20, 7))
Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds'])
plot_df = pd.concat([Y_train_df, Y_hat_df]).set_index('ds')

plot_df[['y', '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()

5. 评估结果

我们使用平均绝对误差(mae)来评估预训练模型的预测结果。

\[ \qquad MAE = \frac{1}{Horizon} \sum_{\tau} |y_{\tau} - \hat{y}_{\tau}|\qquad \]

y_true = Y_test_df.y.values
y_hat = Y_hat_df['NHITS'].values
print('NHITS     MAE: %0.3f' % mae(y_hat, y_true))
print('ETS       MAE: 16.222')
print('AutoARIMA MAE: 18.551')

Give us a ⭐ on Github