时间序列类型数据的滚动窗口分类(回归)

机器算法验证 机器学习 时间序列 分类 交叉验证 Python
2022-03-16 17:04:24

这是一个概念问题,而不是技术问题。我有兴趣执行滚动(滑动)窗口分析,我的目标是预测我的时间序列的下一个值的标签('0'或'1')。例如,考虑时间序列数据和标签数组:(我使用 Python 和 sklearn)

ts  = array([11, 15,  3, 18,  6, 10,  9, 25,  7, 15])
lab = array([ 0,  0,  0,  1,  1,  0,  0,  1,  0,  1])

我正在做的是尝试学习一个函数'F',它将输入特征(从'ts'数组的窗口中提取)映射到二进制标签'lab' F(feat(ts)) -> lab:。从概念上讲,这个问题等价于以下一个时间戳为条件的大小为 k 的窗口的标记。

F(ts[i:i+3]) -> lab[i+3]

实际上:考虑一个大小为 3 的窗口,然后我们得到:

F([11,15, 3]) -> y = 1
F([15, 3,18]) -> y = 1
F([ 3,18, 6]) -> y = 0
F([18, 6,10]) -> y = 0
F([ 6,10, 9]) -> y = 1
F([10, 9,25]) -> y = 0
F([ 9,25, 7]) -> y = 1

(最后一个值未使用)。真实的时间序列要长得多。

问题:对于训练、测试和交叉验证,我可以(假装和)使用我的实例作为 iid 吗?我的意思是:我可以将实例随机划分为训练集、验证集和测试集吗?

当然,它们不是独立同分布的,但是当我天真地尝试处理我的数据并学习分类器(简单逻辑回归)时,它出人意料地工作得非常好,并且我在分类指标上得到了相当合理的结果。

编辑

我正在阅读关于评估时间序列预测的交叉验证有效性的论文 A Note on the Validity of Evaluating Time Series Prediction,作者明确指出:“....和 ​​CV 可以而且应该在不修改的情况下使用,就像在独立案例中一样.. "

1个回答

如何将数据集划分为训练/测试取决于可用的数据以及模型的使用方式。理想情况下,您不会随机分离时间点,因为正如您所说,如果有任何时间信号,它们就不是独立的。

如果您有多个时间序列,那么我会将时间序列本身划分为您想要的任何方式的训练和测试。

如果您的训练数据是单个时间序列,并且您打算预测该时间序列的未来值,那么我会相应地对其进行分段。即使用前 60% 的样本作为您的训练数据,其余 40% 作为您的测试。当然,这些集合不是独立的,但考虑到数据的性质,这是不可避免的。

如果您有一个用于训练的时间序列,但您想要预测未来值的实际时间序列是完全独立的,那么我仍然会遵循上一段中的程序,但请记住,模型拟合的任何估计你得出的很可能是不准确的。

顺便说一句,我很想使用循环神经网络方法来解决这样的问题。这将允许您优雅地对时间方面进行建模 - 像LSTM之类的东西可以保留先前值的记忆,而无需显式指定窗口大小。当然,如果您希望使用窗口方法,那么理论上您可以使用任何您想要的分类算法。

编辑

那篇技术论文似乎比我的回答更深入地涵盖了这个问题,所以我会遵循他们的建议。与您的用例的主要区别在于它们处理的是标准预测下一个样本,而不是分类