我正在使用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%的条目拆分用于测试?
答案 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"