外生特征
使用外生回归变量进行训练和预测
数据设置
unique_id | ds | y | static_0 | product_id | |
---|---|---|---|---|---|
0 | id_00 | 2000-10-05 | 39.811983 | 79 | 45 |
1 | id_00 | 2000-10-06 | 103.274013 | 79 | 45 |
2 | id_00 | 2000-10-07 | 176.574744 | 79 | 45 |
3 | id_00 | 2000-10-08 | 258.987900 | 79 | 45 |
4 | id_00 | 2000-10-09 | 344.940404 | 79 | 45 |
使用现有的外生特征
在 mlforecast 中,所需的列是时间序列标识符、时间和目标。您拥有的任何额外列,例如此处的 static_0
和 product_id
,都被视为静态列,并在构建下一个时间戳的特征时进行复制。您可以通过将 static_features
传递给 MLForecast.preprocess
或 MLForecast.fit
来禁用此功能,这将仅保留您在那里定义的静态列。请记住,输入 dataframe 中的所有特征都将用于训练,因此您必须通过 X_df
参数向 MLForecast.predict
提供外生特征的未来值。
考虑以下示例。假设我们有每个 id 和日期的价格目录。
ds | unique_id | price | |
---|---|---|---|
0 | 2000-10-05 | id_00 | 0.548814 |
1 | 2000-10-06 | id_00 | 0.715189 |
2 | 2000-10-07 | id_00 | 0.602763 |
3 | 2000-10-08 | id_00 | 0.544883 |
4 | 2000-10-09 | id_00 | 0.423655 |
并且您已经将这些价格合并到您的时间序列 dataframe 中。
unique_id | ds | y | static_0 | product_id | price | |
---|---|---|---|---|---|---|
0 | id_00 | 2000-10-05 | 39.811983 | 79 | 45 | 0.548814 |
1 | id_00 | 2000-10-06 | 103.274013 | 79 | 45 | 0.715189 |
2 | id_00 | 2000-10-07 | 176.574744 | 79 | 45 | 0.602763 |
3 | id_00 | 2000-10-08 | 258.987900 | 79 | 45 | 0.544883 |
4 | id_00 | 2000-10-09 | 344.940404 | 79 | 45 | 0.423655 |
此 dataframe 将被传递给 MLForecast.fit
(或 MLForecast.preprocess
)。然而,由于价格是动态的,我们必须告诉该方法只有 static_0
和 product_id
是静态的。
用于训练的特征存储在 MLForecast.ts.features_order_
中。如您所见,price
被用于训练。
因此,为了在每个时间步更新价格,我们只需使用我们的预测范围调用 MLForecast.predict
,并通过 X_df
传递价格目录。
unique_id | ds | LGBMRegressor | |
---|---|---|---|
0 | id_00 | 2001-05-15 | 418.930093 |
1 | id_00 | 2001-05-16 | 499.487368 |
2 | id_00 | 2001-05-17 | 20.321885 |
3 | id_00 | 2001-05-18 | 102.310778 |
4 | id_00 | 2001-05-19 | 185.340281 |
生成外生特征
Nixtla 提供了一些实用程序来为训练和预测生成外生特征,例如 statsforecast 的 mstl_decomposition 或 transform_exog 函数。我们还有 utilsforecast 的 fourier 函数,我们将在本节中进行演示。
假设您从上面所示的包含一些静态特征的数据开始。
unique_id | ds | y | static_0 | product_id | |
---|---|---|---|---|---|
0 | id_00 | 2000-10-05 | 39.811983 | 79 | 45 |
1 | id_00 | 2000-10-06 | 103.274013 | 79 | 45 |
2 | id_00 | 2000-10-07 | 176.574744 | 79 | 45 |
3 | id_00 | 2000-10-08 | 258.987900 | 79 | 45 |
4 | id_00 | 2000-10-09 | 344.940404 | 79 | 45 |
现在我们想添加一些傅里叶项来建模季节性。我们可以通过以下方式实现:
这提供了一个扩展的训练数据集。
unique_id | ds | y | static_0 | product_id | sin1_7 | sin2_7 | cos1_7 | cos2_7 | |
---|---|---|---|---|---|---|---|---|---|
0 | id_00 | 2000-10-05 | 39.811983 | 79 | 45 | 0.781832 | 0.974928 | 0.623490 | -0.222521 |
1 | id_00 | 2000-10-06 | 103.274013 | 79 | 45 | 0.974928 | -0.433884 | -0.222521 | -0.900969 |
2 | id_00 | 2000-10-07 | 176.574744 | 79 | 45 | 0.433884 | -0.781831 | -0.900969 | 0.623490 |
3 | id_00 | 2000-10-08 | 258.987900 | 79 | 45 | -0.433884 | 0.781832 | -0.900969 | 0.623490 |
4 | id_00 | 2000-10-09 | 344.940404 | 79 | 45 | -0.974928 | 0.433884 | -0.222521 | -0.900969 |
以及特征的未来值。
unique_id | ds | sin1_7 | sin2_7 | cos1_7 | cos2_7 | |
---|---|---|---|---|---|---|
0 | id_00 | 2001-05-15 | -0.781828 | -0.974930 | 0.623494 | -0.222511 |
1 | id_00 | 2001-05-16 | 0.000006 | 0.000011 | 1.000000 | 1.000000 |
2 | id_00 | 2001-05-17 | 0.781835 | 0.974925 | 0.623485 | -0.222533 |
3 | id_00 | 2001-05-18 | 0.974927 | -0.433895 | -0.222527 | -0.900963 |
4 | id_00 | 2001-05-19 | 0.433878 | -0.781823 | -0.900972 | 0.623500 |
现在我们可以只使用这些特征(以及静态特征)进行训练。
并将未来值提供给 predict 方法。
unique_id | ds | LinearRegression | |
---|---|---|---|
0 | id_00 | 2001-05-15 | 275.822342 |
1 | id_00 | 2001-05-16 | 262.258117 |
2 | id_00 | 2001-05-17 | 238.195850 |
3 | id_00 | 2001-05-18 | 240.997814 |
4 | id_00 | 2001-05-19 | 262.247123 |