train_test_split()関数の使い方について
train_test_split
【目次】
【動作環境】
1. train_test_splitについて
データセットや配列を訓練データとテストデータに分割するための関数。
- 訓練データ:モデル構築のために必要なデータ。任意のモデルで学習させ、モデルを構築(方程式)する。一般的には、X_train, y_trainで定義することが多い。
- テストデータ:構築したモデルを使用して、説明変数から目的変数を算出するためのデータ。算出した目的変数と、テストデータの目的変数(正解ラベル)を比較して、構築したモデルがどれくらい適切なモデルなのかを評価する。一般的には、X_test, y_testで定義することが多い。
2. train_test_splitの使い方
2.1. train_test_splitの基本
以下の挙動確認用データを作っておく。
import numpy as np from sklearn.model_selection import train_test_split X, y = np.arange(10).reshape((5, 2)), range(5) print('Xのデータ:\n', X, '\n') #\nは改行コード print('yのデータ:\n', y, '\n') #\nは改行コード
>> Xのデータ:
>> [[0 1]
>> [2 3]
>> [4 5]
>> [6 7]
>> [8 9]]
>> yのデータ:
>> range(0, 5)
これらのX, yデータに対しtrain_test_split()関数を用いて、訓練データとテストデータに分割する。
左辺は下記の並びにするのが一般的(訓練X→テストX→訓練y→テストy)。
右辺は第一引数及び第二引数に分割したいデータを並べる。
一般には、説明変数→目的変数の順で並べるのが一般的。
X_train, X_test, y_train, y_test = train_test_split(X, y) print('X_trainのデータ:\n', X_train, '\n') print('X_testのデータ:\n', X_test, '\n') print('y_trainのデータ:\n', y_train, '\n') print('y_testのデータ:\n', y_test, '\n')
>> X_trainのデータ:
>> [[0 1]
>> [8 9]
>> [2 3]]
>> X_testのデータ:
>> [[4 5]
>> [6 7]]
>> y_trainのデータ:
>> [0, 4, 1]
>> y_testのデータ:
>> [2, 3]
random_stateを何も指定しない場合(デフォルト値)は、Noneとなる(実行毎に分割されるデータが変わる)。
また、この時分割されるtrainとtestの比率は別のオプションのtest_size、train_sizeで指定可能だが、何も指定しない上記の場合(デフォルト値)は、test_size=0.25(訓練データ:0.75、テストデータ:0.25)となる。
2.2. random_stateで乱数シードを指定
test_sizeオプションで変えることが可能
test_sizeは、切り上げで指定可能である。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) print('X_trainのデータ:\n', X_train, '\n') print('X_testのデータ:\n', X_test, '\n') print('y_trainのデータ:\n', y_train, '\n') print('y_testのデータ:\n', y_test, '\n')
>> X_trainのデータ:
>> [[4 5]
>> [0 1]
>> [6 7]]
>> X_testのデータ:
>> [[2 3]
>> [8 9]]
>> y_trainのデータ:
>> [2, 0, 3]
>> y_testのデータ:
>> [1, 4]
実行毎に分割されるデータが変わることはない。
2.3. 訓練データとテストデータの比率を変える
test_sizeオプションで変えることが可能
test_sizeは、小数点以下2桁目にて、切り上げで指定可能である。
以下は、訓練データ:0.60、テストデータ:0.40で分割した例
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40, random_state=42) print('X_trainのデータ:\n', X_train, '\n') print('X_testのデータ:\n', X_test, '\n') print('y_trainのデータ:\n', y_train, '\n') print('y_testのデータ:\n', y_test, '\n')
>> X_trainのデータ:
>> [[4 5]
>> [0 1]
>> [6 7]]
>> X_testのデータ:
>> [[2 3]
>> [8 9]]
>> y_trainのデータ:
>> [2, 0, 3]
>> y_testのデータ:
>> [1, 4]
訓練データが3つ、テストデータが2つで分けられている。
今度は、以下は、訓練データ:0.59、テストデータ:0.41で分割した例
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40, random_state=42) print('X_trainのデータ:\n', X_train, '\n') print('X_testのデータ:\n', X_test, '\n') print('y_trainのデータ:\n', y_train, '\n') print('y_testのデータ:\n', y_test, '\n')
>> X_trainのデータ:
>> [[0 1]
>> [6 7]]
>> X_testのデータ:
>> [[2 3]
>> [8 9]
>> [4 5]]
>> y_trainのデータ:
>> [0, 3]
>> y_testのデータ:
>> [1, 4, 2]
訓練データが2つ、テストデータが3つで分けられる結果に変わった(小数点以下2桁目にて、切り上げされて算出される)。
【参照】