我有一个由60个数据点组成的时间序列数据集。我将数据集分为两个部分:训练(前70%的数据)和测试集(后30%的数据)。使用Matlab的fitrsvm函数,我在训练数据集上建立了支持向量回归模型,并试图预测测试数据集中的时间序列数据点。我有svr模型可以很好地近似训练数据集。但是,它甚至没有尝试概括测试数据集,它只是严重地拟合了数据,即给出了一条直线,甚至没有经过测试数据集上的任何数据点。有人知道为什么会这样吗?数据集是否太小,即只有60个数据点?进行交叉验证是否有意义?我认为进行交叉验证没有任何意义,因为我正在尝试预测最后30%的数据。我试图更改参数等,但没有帮助。
答案 0 :(得分:0)
关于总体性能:在应用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撰写的“关于交叉验证在评估自回归时间序列预测中的有效性的注解”。