2015-11-25 11 views
8

私は機械学習の問題を解決しようとしています。私は時系列の要素で特定のデータセットを持っています。この問題のために私はよく知られているPythonライブラリ - sklearnを使用しています。このライブラリには多くのクロス検証イテレータがあります。また、相互検証を定義するためのイテレータがいくつかあります。問題は、時系列の単純な相互検証を定義する方法がわからないことです。ここで私が取得しようとしているものの良い例です。sklearn:時系列データのユーザー定義クロス検証

は、我々はいくつかの期間(年)を持って、我々は次のようにいくつかのチャンクに設定我々のデータを分割したいとします

data = [1, 2, 3, 4, 5, 6, 7] 

train: [1]    test: [2] (or test: [2, 3, 4, 5, 6, 7]) 
train: [1, 2]    test: [3] (or test: [3, 4, 5, 6, 7]) 
train: [1, 2, 3]   test: [4] (or test: [4, 5, 6, 7]) 
... 
train: [1, 2, 3, 4, 5, 6] test: [7] 

私ができます」 Sklearnツールを使ってこの種の相互検証を作成する方法を実際に理解しています。おそらく私はそのようなsklearn.cross_validationからPredefinedSplitを使用する必要があります。

train_fraction = 0.8 
train_size  = int(train_fraction * X_train.shape[0]) 
validation_size = X_train.shape[0] - train_size 

cv_split = cross_validation.PredefinedSplit(test_fold=[-1] * train_size + [1] * validation_size) 

結果:

train: [1, 2, 3, 4, 5] test: [6, 7] 

しかし、まだそれがない以前のデータが

+0

データセット内の変数は何ですか?分割するために時系列を使用することが重要なのはなぜですか。ランダムに分割するのはなぜですか。 – maxymoo

+1

次のように、scikit-learnを使わなくても分割を生成することができます: 'cv_split = [(data [:i]、data [i:])for i in range(1、len(data))]'どう思いますか? –

+0

@maxymoo、時系列データとランダムに分割されない理由は、時間が重要である(あなたが特定した他の機能だけでなく) "野生の中で"未来のデータに対してモデルを訓練することは決してないからです。したがって、モデルのテストでは、同様に動作し、テスト日以降のデータを訓練しないでください。 – dslack

答えて

5

はあなたが必要なクロスバリデーション分割を得ることができます分割するように良いことですsklearnを使用しないでください。ここでの例では、一方で、これはライブラリに追加された

import numpy as np 

from sklearn.svm import SVR 
from sklearn.feature_selection import RFECV 

# Generate some data. 
N = 10 
X_train = np.random.randn(N, 3) 
y_train = np.random.randn(N) 

# Define the splits. 
idxs = np.arange(N) 
cv_splits = [(idxs[:i], idxs[i:]) for i in range(1, N)] 

# Create the RFE object and compute a cross-validated score. 
svr = SVR(kernel="linear") 
rfecv = RFECV(estimator=svr, step=1, cv=cv_splits) 
rfecv.fit(X_train, y_train) 
+0

これは、前方に窓を開けている間、観測ごとに別々の分割を作成しませんか?私がこれを減らしたいのであれば、範囲内の 'step'パラメータを使ってより大きな「チャンク」にする必要がありますか? – dreyco676

+1

@ dreyco676そうです。範囲1(N、2)のiに対して 'cv_splits = [(idxs [:i]、idxs [i:])]のような' step'パラメータを使用してください。 –

+0

確かに: StratifiedKFoldが後ろに残っていたのですよね? – paulochf

3

です:DOCからhttp://scikit-learn.org/stable/modules/cross_validation.html#time-series-split

例:

>>> from sklearn.model_selection import TimeSeriesSplit 

>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]]) 
>>> y = np.array([1, 2, 3, 4, 5, 6]) 
>>> tscv = TimeSeriesSplit(n_splits=3) 
>>> print(tscv) 
TimeSeriesSplit(n_splits=3) 
>>> for train, test in tscv.split(X): 
...  print("%s %s" % (train, test)) 
[0 1 2] [3] 
[0 1 2 3] [4] 
[0 1 2 3 4] [5]