2017-04-12 23 views
0

我正在使用Scikit-Learn timeseriessplit將我的數據分割爲訓練和測試集。目前,timeSeries數據集的第一次分割是50%,接下來是25%之後的30%。我想要將一個固定的10%的數據用作測試集。Scikit-Learn:在timeseriessplit中測試大小

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] [..., 4274 4275 4276] 

我想是這樣的:tscv = TimeSeriesSplit(n_splits=3, test_size= = 0.1)類似train_test_split

如何才能將10%的條目拆分進行測試?

+0

Timeseriessplit與其他cv迭代器的工作方式不同。你希望你的產出指數是什麼?例如,你是否仍然希望你的第三列車成爲你的第一和第二列車組的超集(因爲你使用的是timeseriessplit)? –

回答

1

沒有直接的參數指定百分比。但是您可以相應地修改n_splits以獲得所需的結果。

documentation it is mentioned: -

在第k個分割,則返回前k個褶皺作爲訓練集和 第(k + 1)個摺疊作爲測試集合。

現在你想要最後的10%作爲測試和休息的火車。所以使用n_splits = 9。然後它將輸出前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] 

如果保持X_train, X_test等裏面的爲for循環,那麼測試大小將保持在0.1,但是列車數據會相應改變(因爲在TimeSeries中,只有測試索引之前的值可以用作列車)。

如果這個保持在for循環之外,那麼將只有一組訓練和測試0.9列車和0.1測試。

編輯: 我不能說爲什麼他們選擇k + 1作爲測試集。請看看user guide explanation here。 但在source code,他們已經使用了test_size,從n_splits計算: -

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

所以,也許下個版本里,他們可以有test_size作爲參數。 希望這有助於。如果有任何疑問,歡迎在此發表評論。

+0

'在第k次拆分時,它返回前k個摺疊爲列車集合,第(k + 1)個摺疊爲測試集合的原因是什麼?「如文檔中所述?爲什麼不像'train_test_split'那樣遵循'test_size'? – suku

+1

@suku我不能說他們爲什麼選擇k + 1作爲測試集。請查看[用戶指南解釋](http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-of-time-series-data)。但在[源代碼](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/model_selection/_split.py#L739)中,他們使用'test_size',從' n_splits'(我在這裏用來確定上面的答案中的'n_splits'的反向計算器)。所以也許在下一個版本中,他們可以將'test_size'作爲參數。 –

+0

請編輯你的答案,並在其中放置上述評論。這非常相關 – suku

1

這是否得到你想要的?這是一列火車/測試,最後10%的行作爲測試集。

train_rows = round(0.9 * X.shape[0]) 

X_train = X.loc[:train_rows-1, :] 
X_test = X.loc[train_rows:, :] 

assert X_train.shape[0] + X_test.shape[0] == X.shape[0]