【问题标题】:time series forecasting using support vector regression: underfitting使用支持向量回归的时间序列预测:欠拟合
【发布时间】:2019-06-07 18:23:41
【问题描述】:

我有一个包含 60 个数据点的时间序列数据集。我将数据集分成两部分:训练集(前 70% 的数据)和测试集(后 30% 的数据)。使用 Matlab 的 fitrsvm 函数,我在训练数据集上建立了一个支持向量回归模型,并试图预测测试数据集中的时间序列数据点。我有 svr 模型非常接近训练数据集。但是,它甚至没有尝试泛化测试数据集,它只是严重欠拟合数据,即给出一条直线,甚至没有经过测试数据集上的任何数据点。有谁知道为什么会这样?数据集是否太小,即只有 60 个数据点?做交叉验证有意义吗?在我看来,做交叉验证是没有意义的,因为我试图预测最后 30% 的数据。我曾尝试更改参数等,但没有帮助。

【问题讨论】:

  • 嗨@N。马修没有得到任何地方吗?我也有同样的问题,你是用“predict”做预测的吗?

标签: matlab time-series svm forecasting


【解决方案1】:

关于一般性能:在应用 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 撰写的“关于评估自回归时间序列预测的交叉验证有效性的说明”。

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 2014-08-22
    • 2018-12-23
    • 2017-07-05
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2013-05-27
    • 2018-08-11
    相关资源
    最近更新 更多