Scikit-Learn:timeseriessplit中的测试大小

时间:2017-04-12 03:32:16

标签: scikit-learn

我正在使用Scikit-Learn timeseriessplit将我的数据分成训练和测试集。目前,timeSeries数据集的第一次拆分为50%,其次是25%之后的30%。我希望将固定的10%的数据用作测试集。

tscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(X):
    print(train_index, test_index)

输出是:

[   0    1    2 ..., 1067 1068 1069] [1070 1071 1072 ..., 2136 2137 2138]
[   0    1    2 ..., 2136 2137 2138] [2139 2140 2141 ..., 3205 3206 3207]
[   0    1    2 ..., 3205 3206 3207] [3208 3209 3210 ..., 4274 4275 4276]

我想要这样的事情:tscv = TimeSeriesSplit(n_splits=3, test_size= = 0.1)类似于train_test_split

如何才能将10%的条目拆分用于测试?

2 个答案:

答案 0 :(得分:2)

您没有指定百分比的直接参数。但是您可以相应地修改n_splits以获得所需的结果。

documentation it is mentioned: -

  

在第k次分裂时,它会返回第一个k次,如火车组和   (k + 1)作为测试集折叠。

现在你想要最后10%的测试和休息作为火车。所以使用n_splits = 9。然后它将作为列车输出前9个折叠并作为测试输出最后1倍,在for循环的最后一次迭代中

因此,请相应地更改您的代码:

test_size = 0.1

# This conversion is found in the source of TimeSeriesSplit

n_splits = (1//test_size)-1   # using // for integer division

tscv = TimeSeriesSplit(n_splits=n_splits)
for train_index, test_index in tscv.split(X):
    print(train_index, test_index)

    # Read below comments about following code
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

如果你将X_train,X_test等保留在 for循环中,那么测试大小将保持为0.1,但是列车数据会相应地改变(因为在TimeSeries中,只有之前的值测试指标可以用作火车)。

如果保持在for循环之外,将只有一组列车和0.9列车和0.1测试的测试。

修改: 我不能说为什么他们选择k + 1作为测试集。请看user guide explanation here。 但是在source code中,他们使用了从n_splits计算的test_size: -

n_samples = _num_samples(X)
n_splits = self.n_splits
n_folds = n_splits + 1
test_size = (n_samples // n_folds)

因此,在下一个版本中,他们可以将test_size作为参数。 希望这可以帮助。如果有任何疑问,请随时在此发表评论。

答案 1 :(得分:1)

这能满足你的需求吗?这是一个列车/测试拆分,最后10%的行作为测试集。

"cat"