Sklearn:从timeSeriesSplit获取最后一个拆分

时间:2018-07-01 19:23:22

标签: python machine-learning scikit-learn cross-validation

所以我正在使用sklearn中的timeSeriesSplit这样分割数据,

tscv = TimeSeriesSplit(n_splits=3)

现在,我知道为了获取分割索引,我们必须在tscv.split(X)上进行迭代。我的问题是,是否可以直接到达最后一个拆分,而无需遍历拆分。该函数返回的对象不完全是一个列表,所以我不确定该怎么做?我只需要最后一次分割,因为我的数据很大,没有。拆分的数量也很大。

预先感谢

2 个答案:

答案 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 pointtest_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