迁移学习

迁移学习是指在大型数据集上对灵活模型进行预训练,然后在其他数据上使用它,而几乎不需要训练的过程。这是机器学习领域最杰出的🚀成就之一,并且有许多实际应用。

对于时间序列预测,这种技术允许你获得闪电般的预测⚡,在准确性和速度之间避免权衡(比我们已经快速的AutoARIMA快超过30倍,且保持类似的准确性)。

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

目录

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

在 Colab 中打开

安装库

%%capture
# !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 数据集并进行处理。

它返回三个数据框: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)
fig.savefig('../../figs/transfer_learning__eda.png', bbox_inches='tight')

模型训练

使用 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

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

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

# 我们定义了训练数据框。 
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 = fcst.predict(h=12, new_df=Y_train_df)
Y_hat_df.head()
unique_id ds LGBMRegressor
0 AirPassengers 1960-01-01 422.740096
1 AirPassengers 1960-02-01 399.480193
2 AirPassengers 1960-03-01 458.220289
3 AirPassengers 1960-04-01 442.960385
4 AirPassengers 1960-05-01 461.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)
fig.savefig('../../figs/transfer_learning__forecast.png', bbox_inches='tight')

评估结果

我们使用平均绝对误差(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['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

Give us a ⭐ on Github