所以我正在使用sklearn中的timeSeriesSplit这样分割数据,
tscv = TimeSeriesSplit(n_splits=3)
现在,我知道为了获取分割索引,我们必须在tscv.split(X)
上进行迭代。我的问题是,是否可以直接到达最后一个拆分,而无需遍历拆分。该函数返回的对象不完全是一个列表,所以我不确定该怎么做?我只需要最后一次分割,因为我的数据很大,没有。拆分的数量也很大。
预先感谢
答案 0 :(得分:1)
您可以尝试
def get_last_cv(splits):
splits_deque = deque(splits, maxlen=1)
last_element = splits_deque.pop()
train,test = last_element
return train,test
然后获取这样的索引
train_index,test_index = get_last_cv(tscv.split(X))
其中X
是您的数据
答案 1 :(得分:1)
TimeSeriesSplit
中的Split 方法生成索引拆分 。 要进行特定的拆分,您需要对其进行迭代。 它可以迭代所有可能的拆分以进行时间序列交叉验证。
如果cv拆分中的测试数据大小等于s
。然后,无论您进行了多少次分割,最后的分割集train_data
= all data except last s data point
和test_data as last s data points
。因此,如果您要直接分割最后一个数据:分割数据。例如。如果您的数据是一个numpy数组X
:
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
X = np.array([[1, 2], [0, 4], [1, 2], [2, 4] ,[1, 2], [7, 4], [8, 2], [5, 4]])
n_splits = 2 # select no of splits required
tscv = TimeSeriesSplit(n_splits = n_splits)
n_samples = X.shape[0] # this is how test_size (s)
s = n_samples//(n_splits + 1) # is evaluated internally
X_train_last, X_test_last = X[ :-s], X[-s: ] # s=2 for this split
X_train_last
# array([[1, 2],
# [0, 4],
# [1, 2],
# [2, 4],
# [1, 2],
# [7, 4]])
X_test_last
# array([[8, 2],
# [5, 4]])
此外,如果您在拆分时设置了“ max_train_size”。然后在切片时您也需要注意这一点。有关详细信息,请参考TimeSeriesSplit documentation here。