时间序列预测困境。特征工程能否克服时间依赖性?

数据挖掘 分类 时间序列 回归 随机森林 预测
2021-09-22 20:21:18

我一直在阅读有关时间序列预测的文章。

它们都从相同的假设开始:时间序列预测不能被视为回归/分类问题。它是时间相关的,这意味着我们在时间 t 的目标 y 取决于 y 在 t-1 时的值。

动机通常伴随着一些显示一些趋势/季节性的示例数据。此外,其他支持点是:

  1. 数据分布(均值、方差)随时间而变化。
  2. 传统的训练/测试拆分没有意义,因为用 9 月的数据预测 1 月的数据有什么意义?

很公平。但让我试着指出这个例子。假设我们有一个简单的时间戳,可变数据集,我们试图预测 t+1 的值

| 时间戳 | 价值 |
| 01/01/2019| 10 |
| 01/02/2019| 12 |
...
| 2019 年 12 月 31 日| ???|

我们所知道的是,没有趋势它是非常每周循环的,这意味着 t 的值可能取决于它在 t-7 天的值。我们还知道,根据是一周中的某一天还是周末,数据会相应地发生变化。

是什么阻止我使用一些基本的特征工程并将示例数据转换如下?

| 时间戳 | value_at_t_minus_7 | day_of_week | 价值 |
| 01/01/2019| 11 | 02 | 10 |
| 01/02/2019| 12 | 03 | 12 |
...
| 2019 年 12 月 31 日| 10 | 02 | ???|

从形式上看,它与时间无关,但它的滞后值和星期几信息之间的相关性应该能把我带到我想去的地方,能够使用现在经典和灵活的方法,如随机森林、XGB 和拆分训练和测试(当然要保留保留集进行验证)以很好地了解我的模型的性能。

任何人都可以以适当的动机提供他们的意见支持吗?

谢谢!

4个回答

它们都从相同的假设开始:时间序列预测不能被视为回归/分类问题。它是时间相关的,这意味着我们在时间 t 的目标 y 取决于 y 在 t-1 时的值。

时间序列预测必须考虑时间依赖性,但它不必是唯一的信息来源。许多复杂的预测任务完全考虑了外部变量和时间依赖性。


是什么阻止我使用一些基本的特征工程并将示例数据转换如下?

| timestamp | value_at_t_minus_7 | day_of_week | value |

没有什么能阻止你这样做。此外,这value_at_t_minus_7 时间依赖性。day_of_week也可以被认为是时间依赖性信息的简化或总结——因为研究季节性我们得出结论,x 可以用一周前的值来解释。这是另一种让时间解释输出的方法。

使用回归(例如 ARIMA 或基于树的模型)时,您必须手动指定时间依赖性的形状。因此,您提出的方法是完全“合法的”,实际上非常普遍。祝你任务顺利。

您可以使用回归模型RandomForestRegressor()解决时间序列问题,风险自负请记住,回归模型还将基于诸如day_of_year, month, and year. 但是,在将回归模型的使用推广到时间序列模式之前,我要小心。回归模型在时间序列数据上可能不会完全失败,但回归模型的结果可能不如统计上正确的时间序列模型可靠。

例如,假设我们有一个时间序列数据,其中包含一个 date( YYYYMMDD) 列和一个目标列,例如 stock_value(与每个时间戳对应的一系列数值)。可以使用以下两种方法:

  • 使用时间序列 ML 模型,例如ARIMA, LSTM并预测给定日期的未来目标值。
  • 二是extract three features from time-stamp column可以day_of_year, month_of_year, and year现在,您将拥有包括目标在内的四列。使用 3 个新特征作为自变量,目标作为因变量。接下来,进行train_test_split,准备回归模型(linear regression, decision_tree_regression, random_forest, or xgboost。在这种情况下,预测将针对未来的给定日期。模型将能够预测未来的值。

备注: 在我的一项工作中,我将回归和时间序列模型应用于具有两列即时间戳和目标的数据。经过比较,我发现测试数据的RandomForestRegressormodel准确度为 85.3%时间序列 ARIMA 模型的准确度为 85.8%现在,这绝不是时间序列模型优于回归模型的实质性收益,也不应该总结概括这些发现。

我个人在其中一个时间序列数据中比较了时间序列模型和回归模型的准确性。但是,我没有足够的证据将其推广到那些有噪声的数据集;在这种情况下,时间序列模型更善于在捕捉趋势和季节性之前消除噪声,从而获得更好的性能。

您在使用基本特征工程来转换数据方面确实是正确的。大多数使用深度学习进行时间序列预测的方法都是这样做的。

假设您的时间序列数据仅包含时间戳以外的一个变量,并且您非常确定假设您的数据具有 1 周的周期性,您可以将数据转换为包括所有前 7 天,并让您的机器学习模型学习对前 7 天的每一天给予适当的权重。然后,您的列将如下所示 -

时间戳 | value_at_t_1 | value_at_t_2 | ... | value_at_t_7 | day_of_the_week | 当前值

如果您的数据包含每个时间戳的多个变量,您可以创建一个数据集,其中每个训练样本都是一个序列 - 一个数据点序列,其中每个数据点都包含原始组成变量。在您的情况下,序列长度将为 7,因为您的数据的周期性是一周,每个时间戳是一天。

假设您的原始数据集shape=(M, N)whereM是时间戳的数量,并且N是与每个时间戳对应的变量的数量,那么您转换后的数据集的shape=(num_samples, seq_len, N)wherenum_samples取决于您的采样技术(M/seq_len对于非重叠样本,M-seq_len+1对于重叠样本)。

创建此数据集后,您可以训练一个LSTM-RNNseq_len ,它可以根据过去时间步长的数据预测所需的自变量。希望这可以帮助!

是的,您可以使用表格回归算法进行预测,只要您确保正确评估您的预测算法(即基于未来,而不是过去的数据)。此处描述了如何使回归算法适应预测问题的一般方法

您还可以构建混合机器学习模型。例如,您可能希望在应用回归算法之前首先对数据进行去季节化或去趋势化处理。或者,您可能希望在 ARIMA 等经典预测算法的残差上拟合机器学习模型。

如果您有兴趣,我们正在为这些用例开发一个扩展 scikit-learn 的工具箱。下面是一个如何使用sktime的简单示例。我们还在M4 研究中对这些方法进行了一些比较基准测试。

import numpy as np
from sktime.datasets import load_airline
from sktime.forecasting.compose import ReducedRegressionForecaster
from sklearn.svm import SVR
from sktime.forecasting.model_selection import temporal_train_test_split
from sktime.performance_metrics.forecasting import smape_loss

y = load_airline()  # load 1-dimensional time series
y_train, y_test = temporal_train_test_split(y)  
fh = np.arange(1, len(y_test) + 1)  # forecasting horizon
regressor = SVR()  # any other scikit-learn regressor would work 
forecaster = ReducedRegressionForecaster(regressor, window_length=10)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
print(smape_loss(y_test, y_pred))
>>> 0.139046791779424