我正在尝试解决一个机器学习问题。我有一个包含时间序列元素的特定数据集。为了解决这个问题,我正在使用广为人知的Python库 - sklearn
。在这个库中有很多交叉验证迭代器。同时也有几种自定义交叉验证的迭代器。问题是我不知道如何定义时间序列的简单交叉验证。这里有个好的例子:
假设我们有几个时间段(年份),我们想将数据集分成若干块,具体如下:
data = [1, 2, 3, 4, 5, 6, 7]
train: [1] test: [2] (or test: [2, 3, 4, 5, 6, 7])
train: [1, 2] test: [3] (or test: [3, 4, 5, 6, 7])
train: [1, 2, 3] test: [4] (or test: [4, 5, 6, 7])
...
train: [1, 2, 3, 4, 5, 6] test: [7]
我实际上不太明白如何使用sklearn工具创建这种交叉验证。可能我应该像这样使用sklearn.cross_validation
中的PredefinedSplit
:
train_fraction = 0.8
train_size = int(train_fraction * X_train.shape[0])
validation_size = X_train.shape[0] - train_size
cv_split = cross_validation.PredefinedSplit(test_fold=[-1] * train_size + [1] * validation_size)
结果:
train: [1, 2, 3, 4, 5] test: [6, 7]
但仍然不如之前的数据分割好
cv_split = [(data[:i], data[i:]) for i in range(1, len(data))]
。你觉得呢? - Dan OneațăPredifinedSplit
之后,我将其放入了需要交叉验证生成器或可迭代的训练/测试拆分的RFECV
中。因此,我认为可以使用sklearn工具来解决这个问题。 - Demyanovcv_split
,如果我们将data
视为数据的索引,则它是一个可迭代对象,生成训练/测试拆分。 - Dan Oneață