%%capture
# !pip install mlforecast datasetsforecast utilsforecast s3fs
迁移学习
迁移学习是指在大型数据集上对灵活模型进行预训练,然后在其他数据上使用它,而几乎不需要训练的过程。这是机器学习领域最杰出的🚀成就之一,并且有许多实际应用。
对于时间序列预测,这种技术允许你获得闪电般的预测⚡,在准确性和速度之间避免权衡(比我们已经快速的AutoARIMA快超过30倍,且保持类似的准确性)。
本Notebook展示了如何生成一个预训练模型,以预测模型从未见过的新时间序列。
目录
- 安装MLForecast
- 加载M3月度数据
- 实例化NeuralForecast核心,拟合并保存
- 使用预训练模型预测AirPassengers
- 评估结果
您可以使用 Google Colab 运行这些实验。
安装库
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
。确保使用长格式并具有与我们的数据集相似的结构。
= M3.load(directory='./', group='Monthly') Y_df_M3, _, _
在本教程中,我们仅使用 1_000
系列以加快计算。移除过滤器以使用整个数据集。
= plot_series(Y_df_M3) fig
'../../figs/transfer_learning__eda.png', bbox_inches='tight') fig.savefig(
模型训练
使用 MLForecast.fit
方法,您可以将一组模型训练到您的数据集中。您可以修改模型的超参数以获得更好的准确性,在这种情况下我们将使用 lgb.LGBMRegressor
的默认超参数。
= [lgb.LGBMRegressor(verbosity=-1)] models
MLForecast
对象具有以下参数:
models
:一个类似于sklearn的模型列表(具有fit
和predict
方法)。freq
:一个字符串,指示数据的频率。请参见pandas的可用频率。differences
:在计算特征之前需要对目标进行的差分。这些差分在预测步骤中被恢复。lags
:作为特征使用的目标的滞后值。
在本示例中,我们仅使用differences
和lags
来生成特征。请参阅完整文档以查看所有可用特征。
任何设置都可以传递到构造函数中。然后调用其fit
方法并传入历史数据框Y_df_M3
。
= MLForecast(
fcst =models,
models=range(1, 13),
lags='MS',
freq=[Differences([1, 12])],
target_transforms
); fcst.fit(Y_df_M3)
将 M3 转换为 AirPassengers
现在我们可以将训练好的模型转移到 AirPassengers
的预测中,使用 MLForecast.predict
方法,我们只需将新的数据框传递给 new_data
参数。
= pd.read_csv('https://datasets-nixtla.s3.amazonaws.com/air-passengers.csv', parse_dates=['ds'])
Y_df
# 我们定义了训练数据框。
= Y_df[Y_df.ds<='1959-12-31'] # 132次列车
Y_train_df = Y_df[Y_df.ds>'1959-12-31'] # 12项测试 Y_test_df
= fcst.predict(h=12, new_df=Y_train_df)
Y_hat_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_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds']) Y_hat_df
= plot_series(Y_train_df, Y_hat_df) fig
'../../figs/transfer_learning__forecast.png', bbox_inches='tight') fig.savefig(
评估结果
我们使用平均绝对误差(mae
)评估预训练模型的预测结果。
\[ \qquad MAE = \frac{1}{Horizon} \sum_{\tau} |y_{\tau} - \hat{y}_{\tau}|\qquad \]
= Y_test_df.y.values
y_true = Y_hat_df['LGBMRegressor'].values y_hat
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