ディープラーニングで、トレーニングデータとテストデータ(評価データ)に分ける必要が出てくる。
検索するとNumpyを使った例が多いが、Pandasで十分対応できるし簡単です。
ここではPandasをメインに説明しますが、Numpyは触りだけ紹介します。
Pandas
以下の例は無駄が多いように思えますが、汎用性があります。
test_end
を指定しない場合は、test_end
を削除してもらった方がスッキリします。- 基本的には
train_end
に行数を設定すればいいです。ここでは行数だけでなく、日時でも指定が可能です。また割合にする場合は、int(df.shape[0]/0.7)
などと設定すれば良いでしょう。日時や割合にする場合はをtest_end
削除するなど注意してください。
投資関連では、年などの時間のサイクルがあるように思えることが多いので、単純に割合だけではなく、このように汎用性を持たせています。もちろん、長々とかけば設定値だけで、上記を自動判別させることもできるでしょうけど、自分が使えるシステムができればいいので、このように曖昧になっています。
サンプルデータはこちら(sample)
# ファイル読み込み filename = "sample.csv" df = pd.read_csv(filename) if "Unnamed: 0" in df.columns: del df['Unnamed: 0'] print("del") print(df) # Date Time Open High Low Close target # 0 2019-01-01 22:00:00+00:00 109.590 109.590 109.590 109.590 1.0 # 1 2019-01-01 22:01:00+00:00 109.673 109.673 109.673 109.673 1.0 # 2 2019-01-01 22:02:00+00:00 109.673 109.673 109.673 109.673 1.0 # 3 2019-01-01 22:03:00+00:00 109.673 109.673 109.673 109.673 1.0 # 4 2019-01-01 22:04:00+00:00 109.673 109.673 109.673 109.673 1.0 # 5 2019-01-01 22:05:00+00:00 109.673 109.673 109.673 109.673 1.0 # 6 2019-01-01 22:06:00+00:00 109.669 109.669 109.669 109.669 1.0 # 7 2019-01-01 22:07:00+00:00 109.669 109.669 109.669 109.669 1.0 # 8 2019-01-01 22:08:00+00:00 109.669 109.669 109.669 109.669 1.0 # 9 2019-01-01 22:09:00+00:00 109.669 109.669 109.669 109.669 1.0 # トレーニング用とテスト用の範囲を設定 train_start = 0 train_end = 7 test_start = train_end test_end = df.shape[0] # データを分割 X_train = df[train_start:train_end].drop('target', axis=1).values X_test = df[test_start:test_end].drop('target', axis=1).values y_train = df['target'][train_start:train_end].values y_test = df['target'][test_start:test_end].values print(X_train) print(X_test) print(y_train) print(y_test) # [['2019-01-01 22:00:00+00:00' 109.59 109.59 109.59 109.59] # ['2019-01-01 22:01:00+00:00' 109.67299999999999 109.67299999999999 # 109.67299999999999 109.67299999999999] # ['2019-01-01 22:02:00+00:00' 109.67299999999999 109.67299999999999 # 109.67299999999999 109.67299999999999] # ['2019-01-01 22:03:00+00:00' 109.67299999999999 109.67299999999999 # 109.67299999999999 109.67299999999999] # ['2019-01-01 22:04:00+00:00' 109.67299999999999 109.67299999999999 # 109.67299999999999 109.67299999999999] # ['2019-01-01 22:05:00+00:00' 109.67299999999999 109.67299999999999 # 109.67299999999999 109.67299999999999] # ['2019-01-01 22:06:00+00:00' 109.669 109.669 109.669 109.669]] # [['2019-01-01 22:07:00+00:00' 109.669 109.669 109.669 109.669] # ['2019-01-01 22:08:00+00:00' 109.669 109.669 109.669 109.669] # ['2019-01-01 22:09:00+00:00' 109.669 109.669 109.669 109.669]] # [1. 1. 1. 1. 1. 1. 1.] # [1. 1. 1.]
Numpy
sklearnというライブラリを使用します。標準ではないのでインストールが必要です。
PIP install scikit-learn
以下のようにインポートします。from sklearn.model_selection import train_test_split
主なパラメーター
- X:特徴データ
- y:正解ラベル
- test_size:テストデータの量(30%をテストデータとする場合は0.3と指定)
- shuffle:データを分割する前にシャッフルするかどうか(デフォルトはTrueです。投資の場合は時系列が多いのでFlaseとした方がいいと思います。
出力結果
- X_train:トレーニング用の特徴データ
- X_test:テスト用の特徴データ
- y_train:トレーニング用の正解ラベル
- y_test:テスト用の正解ラベル
以下をコピペすれば基本的に使えます。ただし、何割をトレーニングとテストに割り当てるかになります。
サンプルデータはこちら(sample2)
# ファイル読み込み filename = "sample2.csv" data = np.loadtxt(filename, delimiter=",", skiprows=1) print(data) # dataの例 # [[109.59 109.59 109.59 109.59 1. ] # [109.673 109.673 109.673 109.673 1. ] # [109.673 109.673 109.673 109.673 1. ] # [109.673 109.673 109.673 109.673 1. ] # [109.673 109.673 109.673 109.673 1. ] # [109.673 109.673 109.673 109.673 1. ] # [109.669 109.669 109.669 109.669 1. ] # [109.669 109.669 109.669 109.669 1. ] # [109.669 109.669 109.669 109.669 1. ] # [109.669 109.669 109.669 109.669 1. ]] # 訓練データと正解ラベルに分割(上記のように5列のデータの場合 X = data[:,:4] y = data[:,4:] # トレーニング用、テスト用に分割 from sklearn.model_selection import train_test_split (X_train, X_test, y_train, y_test) = train_test_split( X, y, test_size=0.3, random_state=0, ) print(X_train) print(X_test) print(y_train) print(y_test) # [[109.669 109.669 109.669 109.669] # [109.673 109.673 109.673 109.673] # [109.669 109.669 109.669 109.669] # [109.669 109.669 109.669 109.669] # [109.673 109.673 109.673 109.673] # [109.59 109.59 109.59 109.59 ] # [109.673 109.673 109.673 109.673]] # [[109.673 109.673 109.673 109.673] # [109.669 109.669 109.669 109.669] # [109.673 109.673 109.673 109.673]] # [[1.] # [1.] # [1.] # [1.] # [1.] # [1.] # [1.]] # [[1.] # [1.] # [1.]]