AIプログラミング

scikit-learnのtrain_test_split関数を使用してデータを分割する

更新日:

scikit-learnのtrain_test_split関数を使用してデータを分割する

scikit-learnに含まれるtrain_test_split関数を使用するとデータセットを訓練用データと試験用データに簡単に分割することができます。

train_test_split関数を用いることで、訓練用データは80%、試験用データは20%というように分割可能です。

訓練データとテスト用データに分割する理由

なぜ訓練データと試験用データに分割しないといけないのでしょうか?

それは試験用データを使用して試験を行うためでもありますが、過学習を防止して適切な学習モデルを作成するというためです。

過学習とは、文字通り学習しすぎて訓練データに適合しすぎた学習モデルのことです。例えばデータセットを100%訓練データとして使用させたとしましょう。その場合、訓練データは正答率が90%以上の好成績を出しますが、別の試験データを用いた場合は50%とか、それ以下の正答率しか出せなくなってしまう場合があります。

このように学習しすぎて訓練データに適合しすぎた学習モデルのことを過学習と呼びます。

それを防止するために、予め訓練データと試験用データに分割して学習を行う必要があります。

train_test_split関数を使用した場合のメリット

train_test_split関数を使用した場合のメリットは以下の通りです。

  • 容易に訓練データとテストデータに分割することが可能
  • 分割の割合を指定することが可能
  • データセットの分割はランダムに行われる(固定も可)
  • 順番を保ったまま分割することも可能

train_test_split関数の引数

train_test_split関数の引数は以下の通りです。

arrays 分割対象の同じ長さを持った複数のリスト、Numpy の array, matrix, Pandasのデータフレームを指定。
test_size 小数もしくは整数を指定。小数で指定した場合、テストデータの割合を 0.0 〜 1.0 の間で指定します。整数を指定した場合は、テストデータに必ず含めるレコード件数を整数で指定します。指定しなかった場合や None を設定した場合は、 のサイズを補うように設定します。train_size を設定していない場合、デフォルト値として 0.25 を用います。
train_size 小数もしくは整数を指定。小数で指定した場合、トレーニングデータの割合を 0.0 〜 1.0 の間で指定します。整数を指定した場合は、トレーニングデータに必ず含めるレコード件数を整数で指定します。指定しなかった場合や None を設定した場合は、データセット全体から test_size を引いた分のサイズとします。
random_state 乱数生成のシードとなる整数または、RandomState インスタンスを設定します。指定しなかった場合は、Numpy のnp.random を用いて乱数をセットします。
shuffle データを分割する前にランダムに並び替えを行なうかどうか。True または False で指定します。False に設定した場合、stratify を None に設定しなければいけません。(デフォルト値: True)
stratify Stratified Sampling (層化サンプリング) を行なう場合に、クラスを示す行列を設定します。 (デフォルト値: None)

公式サイト

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

train_test_split関数の戻り値

train_test_splitでの戻り値は以下の通りです。

  • X_train: 訓練データ
  • X_test: テストデータ
  • Y_train: 訓練データの正解ラベル
  • Y_test: テストデータの正解ラベル

ソースコード(例)

使用するデータ

例として18個の訓練用データと試験用データをnumpy形式で作成しています。これらのデータに対して分割していきます。

訓練用サイズを指定する場合

train_sizeに割合を指定することで訓練用サイズを指定することができます。例では訓練用サイズを80%として指定しています。その結果 14個のデータが訓練用、残りの4つが試験用として分割されています。

試験用サイズを指定する場合

test_sizeに割合を指定することで訓練用サイズを指定することができます。先ほどとは逆に試験用サイズを80%として指定しています。その結果 3個のデータが訓練用、残りの15つが試験用として分割されています。

乱数のシード値を指定する場合

乱数のシード値を1として指定しています。乱数のシード値という言葉は一見難しそうですが、固定したランダム値を出力するために用いられます。1回目と2回目のデータを見比べてみましょう。ランダムのためばらばらな値になりそうですが、同じ数字が並んでいます。このようにランダムで分割したいけど、再度同一の条件で行いたいという場合に乱数のシード値が使用されます。

乱数のシード値を指定しない場合

先ほどとは逆に乱数のシード値を指定しない場合の例を示します。1回目と2回目のデータを見比べてみましょう。異なる数字が並んでいます。このように実行するたびにランダムで分割したいという場合は乱数のシード値を指定せずに行います。

シャッフルを行わない場合

データのシャッフルを行わずに分割しています。試験用データを見てみましょう。初めのデータは111,222,333・・というように数字が大きくなっていきました。その順番を保ったまま分割しています。このようにデータの並びを変えずに分割したいという場合はシャッフルをせずに行います。

シャッフルを行う場合

データのシャッフルを行い分割しています。試験用データを見てみましょう。初めのデータは111,222,333・・というように数字が大きくなっていきました。その順番は関係なしに分割しています。

scikit-learnのtrain_test_split関数を用いることでこのように非常に簡単に分割することが出来ます。但し数千万のようなとても多い件数の場合は対応できない場合があるので注意しましょう。

-AIプログラミング
-,

Copyright© AI人工知能テクノロジー , 2019 All Rights Reserved.