web-dev-qa-db-ja.com

時間ベースのテストを使用してデータを分割し、それぞれをトレーニングする方法

時間ベースの分割を使用して、データをトレーニングとテストに分割する方法。

Train_test_splitが時間に基づいてランダムに分割する方法を知っています。

  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) 
  # this splits the data randomly as 67% test and 33% train

67%のトレーニングと33%のテストとして時間に基づいて同じデータセットを分割する方法

データセットにはTimeStamp列があります。

同様の質問で検索してみましたが、アプローチについてはわかりませんでした。

誰かが簡単に説明できますか

5
dhruv bhardwaj

時系列データセットでは、データ分割は別の方法で行われます。 このリンクを参照 詳細情報。あるいは、scikit-learnパッケージの TimeSeriesSplit を試すこともできます。つまり、主な考え方はこれです。タイムスタンプに従って10ポイントのデータがあるとします。分割は次のようになります。

Split 1 : 
Train_indices : 1 
Test_indices  : 2


Split 2 : 
Train_indices : 1, 2 
Test_indices  : 3


Split 3 : 
Train_indices : 1, 2, 3 
Test_indices  : 4

Split 4 : 
Train_indices : 1, 2, 3, 4 
Test_indices  : 5

などなど。上記のリンクに示されている例をチェックして、TimeSEriesSPlitがsklearnでどのように機能するかを理解することができます。

Update別の時間列がある場合は、その列に基づいてデータを並べ替え、上記のようにtimeSeriesSplitを適用して分割を取得できます。

最終的な分割で67%のトレーニングと33%のテストデータを確保するには、次のように分割数を指定します。

no_of_split = int((len(data)-3)/3)

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4],[1, 2], [3, 4],[3, 4],[1, 2],     [3, 4],[3, 4],[1, 2], [3, 4] ])
y = np.array([1, 2, 3, 4, 5, 6,7,8,9,10,11,12])
tscv = TimeSeriesSplit(n_splits=int((len(y)-3)/3))
for train_index, test_index in tscv.split(X):
     print("TRAIN:", train_index, "TEST:", test_index)

     #To get the indices 
     X_train, X_test = X[train_index], X[test_index]
     y_train, y_test = y[train_index], y[test_index]

出力:

('TRAIN:', array([0, 1, 2]), 'TEST:', array([3, 4, 5]))
('TRAIN:', array([0, 1, 2, 3, 4, 5]), 'TEST:', array([6, 7, 8]))
('TRAIN:', array([0, 1, 2, 3, 4, 5, 6, 7, 8]), 'TEST:', array([ 9, 10, 11]))

1
Mohammed Kashif

各行が観測である単純なデータセット(たとえば、分類問題の非時系列データセット)があり、それをトレーニングとテストに分割したい場合、この関数は列に基づいてトレーニングとテストに分割されます日付の:

_import pandas as pd
import numpy as np
from math import ceil

def train_test_split_sorted(X, y, test_size, dates):
"""Splits X and y into train and test sets, with test set separated by most recent dates.

    Example:
    --------
    >>> from sklearn import datasets

    # Fake dataset:
    >>> gen_data = datasets.make_classification(n_samples=10000, n_features=5)
    >>> dates = np.array(pd.date_range('2016-01-01', periods=10000, freq='5min'))
    >>> np.random.shuffle(dates)
    >>> df = pd.DataFrame(gen_data[0])
    >>> df['date'] = dates
    >>> df['target'] = gen_data[1]

    # Separate:
    >>> X_train, X_test, y_train, y_test = train_test_split_sorted(df.drop('target', axis=1), df['target'], 0.33, df['date'])

    >>> print('Length train set: {}'.format(len(y_train)))
    Length train set: 8000
    >>> print('Length test set: {}'.format(len(y_test)))
    Length test set: 2000
    >>> print('Last date in train set: {}'.format(X_train['date'].max()))
    Last date in train set: 2016-01-28 18:35:00
    >>> print('First date in test set: {}'.format(X_test['date'].min()))
    First date in test set: 2016-01-28 18:40:00
    """

    n_test = ceil(test_size * len(X))

    sorted_index = [x for _, x in sorted(Zip(np.array(dates), np.arange(0, len(dates))), key=lambda pair: pair[0])]
    train_idx = sorted_index[:-n_test]
    test_idx = sorted_index[-n_test:]

    if isinstance(X, (pd.Series, pd.DataFrame)):
        X_train = X.iloc[train_idx]
        X_test = X.iloc[test_idx]
    else:
        X_train = X[train_idx]
        X_test = X[test_idx]
    if isinstance(y, (pd.Series, pd.DataFrame)):
        y_train = y.iloc[train_idx]
        y_test = y.iloc[test_idx]
    else:
        y_train = y[train_idx]
        y_test = y[test_idx]

    return X_train, X_test, y_train, y_test
_

dates引数は、実際には、データの並べ替えに使用する任意の種類の配列またはシリーズにすることができます。

あなたの場合、あなたは呼び出す必要があります:X_train, X_test, y_train, y_test = train_test_split_sorted(X, y, 0.333, TimeStamp)TimeStampは、各観測のタイムスタンプに関する情報を持っている配列または列です。

0
Glyph