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桁目にて、切り上げされて算出される)。

 


【参照】

scikit-learn.org