我正在使用 Scikit-Learn timeseriessplit 将我的数据拆分为训练集和测试集。目前 timeSeries 数据集的第一个分割是 50%,接下来是 30%,在 25% 之后。我想要固定 10% 的数据用作测试集。
tscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(X):
print(train_index, test_index)
Run Code Online (Sandbox Code Playgroud)
输出是:
[ 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]
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:tscv = TimeSeriesSplit(n_splits=3, test_size= = 0.1)
类似于train_test_split
.
如何只拆分 10% 的条目进行测试?
没有直接参数供您指定百分比。但是您可以相应地修改 n_splits 以获得所需的结果。
在文档中提到:-
在第 k 次分割中,它返回前 k 折作为训练集和第 (k+1) 折作为测试集。
现在你想要最后的 10% 作为测试,其余的作为训练。所以使用 n_splits=9。然后它将在 for 循环的最后一次迭代中输出前 9 次作为训练和最后 1 次作为测试
因此,相应地更改您的代码:
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]
Run Code Online (Sandbox Code Playgroud)
如果保持X_train,X_test等内部的for循环中,则测试尺寸将保持在0.1,但列车数据将被相应地改变(因为在TimeSeries的,仅测试的索引之前的值可以被用作火车) .
如果将其保留在 for 循环之外,则将只有一组训练和测试,其中 0.9 次训练和 0.1 次测试。
编辑:我不能说他们为什么选择 k+1 作为测试集。请在此处查看用户指南说明。但是在源代码中,他们使用了从 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)
Run Code Online (Sandbox Code Playgroud)
所以也许在下一个版本中,他们可以将其test_size
作为参数。希望这可以帮助。如有任何疑问,请随时在此处发表评论。
归档时间: |
|
查看次数: |
2296 次 |
最近记录: |