random_statementを考えてみる
random_statement とは
機械学習であるデータから訓練データとテストデータへ分割する際に sikit-learn の train_test_split を利用することが多いと思います。
ここでパラメータとして random_state というものが出てくるのですが、みんなどうやって決めているの?と疑問に思うことが多々あります。
random_state は乱数の発生機ですが、seed 値を与えると、毎回同じ乱数を発生させるため再現性が得られます。
ランダムですがカオスではないので、ある法則に従っていると思って良さそうです。
ここで考えられるのが、random_state は選び方によって機械学習の結果が変わるのでは?ということです。
今回は下記の記事のプログラムを利用して random_state を 0~100 まで変化させたときの精度を確認してみます。
学習の精度
早速ですが、結果を見てみましょう。
グラフは横軸に random_state のパラメータで 0~100 まであります。
縦軸は精度で、青点が訓練、オレンジ点はテストの精度です。
これを見る限り、random_state はどこを取っても一緒といえないようです。
もっと見やすくするために boxplot で見てみます。
わかりやすくするために縦軸が 0 始まりではないので注意してください。
このように、明らかにテストの精度がばらついています。
もし、機械学習をとりあえず扱ってみたいと考えている方で、精度がいまいちと思っている方は random_state を変化させてみるのもありかなと思います。
shuffle について
上記の内容を見たとき、予めシャッフルしておいたらいいんじゃない?と考えるでしょう。今回利用している train_test_split はデフォルトで shuffle = True となっています。
したがって、基本的にランダムな状態で訓練されていると思っても良いと考えます。
さらに安定しようとしたら事前にシャッフルを追加するくらいでしょうか?それでも完全なランダムとは言えないので、train_test_split の最適値を探索したほうが良いかもしれません。
Discussion