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

对于时间序列预测,该技术使您能够获得闪电般快速的预测 ⚡,从而绕开了准确性和速度之间的权衡(对于相似的准确性,比我们已经很快的 AutoARIMA 快 30 多倍)。

本 notebook 展示了如何生成一个预训练模型,用于预测模型从未见过的新时间序列。

目录

  • 安装 MLForecast
  • 加载 M3 月度数据
  • 实例化 NeuralForecast 核心,拟合并保存
  • 使用预训练模型预测 AirPassengers
  • 评估结果

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

安装库

# !pip install mlforecast datasetsforecast utilsforecast s3fs
import lightgbm as lgb
import numpy as np
import pandas as pd
from datasetsforecast.m3 import M3
from sklearn.metrics import mean_absolute_error
from utilsforecast.plotting import plot_series

from mlforecast import MLForecast
from mlforecast.target_transforms import Differences

加载 M3 数据

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

它返回三个 Dataframe:Y_df 包含目标变量的值,X_df 包含外部日历特征,S_df 包含每个时间序列的静态特征。在此示例中,我们只使用 Y_df

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

Y_df_M3, _, _ = M3.load(directory='./', group='Monthly')

在本教程中,我们仅使用 1_000 个时间序列来加速计算。移除过滤器以使用整个数据集。

fig = plot_series(Y_df_M3)

模型训练

使用 MLForecast.fit 方法,您可以在您的数据集上训练一组模型。您可以修改模型的超参数以获得更好的准确性,在此示例中,我们将使用 lgb.LGBMRegressor 的默认超参数。

models = [lgb.LGBMRegressor(verbosity=-1)]

MLForecast 对象具有以下参数

  • models:一个包含类似 sklearn 模型(具有 fitpredict 方法)的列表。
  • freq:一个字符串,表示数据的频率。请参阅 pandas 可用的频率别名。
  • differences:在计算特征之前对目标进行的差分。这些在预测步骤中会被恢复。
  • lags:用作特征的目标变量的滞后项。

在此示例中,我们仅使用 differenceslags 来生成特征。请参阅 完整文档 以查看所有可用特征。

任何设置都会传递给构造函数。然后,您调用其 fit 方法并传入历史数据框 Y_df_M3

fcst = MLForecast(
    models=models, 
    lags=range(1, 13),
    freq='MS',
    target_transforms=[Differences([1, 12])],
)
fcst.fit(Y_df_M3);

将 M3 迁移到 AirPassengers

现在我们可以使用 MLForecast.predict 方法将训练好的模型迁移到预测 AirPassengers,我们只需将新的数据框传递给 new_data 参数。

Y_df = pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/air-passengers.csv', parse_dates=['ds'])

# We define the train df. 
Y_train_df = Y_df[Y_df.ds<='1959-12-31'] # 132 train
Y_test_df = Y_df[Y_df.ds>'1959-12-31']   # 12 test
Y_hat_df = fcst.predict(h=12, new_df=Y_train_df)
Y_hat_df.head()
unique_iddsLGBMRegressor
0AirPassengers1960-01-01422.740096
1AirPassengers1960-02-01399.480193
2AirPassengers1960-03-01458.220289
3AirPassengers1960-04-01442.960385
4AirPassengers1960-05-01461.700482
Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds'])
fig = plot_series(Y_train_df, Y_hat_df)

评估结果

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

MAE=1Horizonτyτy^τ \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['LGBMRegressor'].values
print(f'LGBMRegressor     MAE: {mean_absolute_error(y_hat, y_true):.3f}')
print('ETS               MAE: 16.222')
print('AutoARIMA         MAE: 18.551')
LGBMRegressor     MAE: 13.560
ETS               MAE: 16.222
AutoARIMA         MAE: 18.551