关于一般性能:在应用 SVR 之前,您是否尝试过使您的时间序列平稳(通过差分或通过幂变换)或对其进行归一化?这些可能会有所帮助——它们有时会帮助将 NNets 应用于时间序列。
关于简历:
有一些方法可以对时间序列进行交叉验证。首先,您可以进行时间序列 CV 拆分(在 Python Scikit-learn 和 R 中可用),我认为它也将在 Matlab 中存在。
[1, 2, 3], [4, 5]
[1, 2, 3, 4], [5, 6]
[1, 2, 3, 4, 5], [6, 7].
这适用于任何时间序列预测方法。
但由于您使用的是 SVR,您甚至可以使用普通的交叉验证(这不适用于 ARIMA 或 Holt-Winters 之类的东西)。
这是因为最近,Bergmeir、Hyndman 和 Koo 表明,对于纯自回归模型,例如 AR(p) 模型、神经网络或支持向量回归,即使是正常的 CV 也可以使用,只要你格式化你的训练数据,使它看起来像一个有监督的机器学习问题,而不是一个时间序列问题。
要了解这是如何工作的,首先需要注意的是,纯自回归方法仅使用固定数量的先前周期,因此不是:
[1, 2, 3], [4]
[1, 2, 3, 4], [5]
[1, 2, 3, 4, 5], [6]
[1, 2, 3, 4, 5, 6], [7]
例如(对于 3 阶(即 3 滞后)自回归模型):
[1, 2, 3], [4]
[2, 3, 4], [5]
[3, 4, 5], [6]
[4, 5, 6], [7]
那么你需要考虑你的数据是 ML 格式而不是时间序列格式:
[1, 2, 3 | 4]
[2, 3, 4 | 5]
[3, 4, 5 | 6]
[4, 5, 6 | 7]
这样您的数据点就不仅仅是像 [4] 这样的单个值,而是一个具有 3 个输入和一个目标值的向量:
[1, 2, 3 | 4]
在这种情况下,使用正常的交叉验证(而不是时间序列交叉验证)是有效的,因为依赖性不再是问题,您可以在以下方面训练您的模型:
[2, 3, 4 | 5]
[3, 4, 5 | 6]
[4, 5, 6 | 7]
并测试:
[1, 2, 3 | 4]
然后训练模型:
[1, 2, 3 | 4]
[3, 4, 5 | 6]
[4, 5, 6 | 7]
并测试:
[2, 3, 4 | 5]
等等……
有关详细信息,请参阅 Christoph Bergmeir、Rob J Hyndman 和 Bonsoo Koob 撰写的“关于评估自回归时间序列预测的交叉验证有效性的说明”。