Train-Test Splitってな~に??
こんにちは^^EMです。
今回は(私が)分かりそうで理解できていなかった
Train-Test Splitについてのお話です!
今回は、データをトレーニングデータとテストデータの2つのグループに分けていきます。
モデルはトレーニングデータに適合され、トレーニングとテストの両方で評価されます。
これが、機械学習の一般的な手法です。(Train / Test Splitと呼ばれます)
これはモデルが適合しているデータにoverfittingせず
新しいデータに一般化できるようにするために使用される最も一般的な方法です。
分割を行うには、ビルトイン関数train_test_split()を使用します。
※ビルトイン関数とは既に誰かが作って元々誰でも使えるように構築された関数です。
組み込み関数とも言います。
この関数は、独立変数と従属変数、および分割パラメーターを想定しています。
そして、トレーニングセット(従属変数と独立変数のランダムなグループを含む)と
残りのテストセット(従属変数と独立変数を含む)に分割します。
splitパラメーターは、セットの相対的なサイズを記述します。
scikit learnの公式HPには、より詳しい説明も載っていますので
ぜひ以下も参照してください。
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
下記にはもう少し詳細を載せていますが、少し前の私のメモも混じっているので
内容が重複しているかもしれません。。どうぞご了承下さい。
Train-Test Splitとは、機械学習のアルゴリズムのパフォーマンスを
予測するために使用されます。
これは速くて簡単な方法かつ、その結果をつかって、予測モデルに対して
機械学習アルゴリズムのパフォーマンスを比較できます。
使用する事や解釈する事はシンプル(のよう)ですがデータセットが
小さい場合やデータセットのバランスが取れていない場合
追加項目が必要な場合など、Train-Test Splitの手順を使わない方がいい事もあります。
この記事の中ではTrain-Test Splitを使って機械学習のモデルがどう評価されるのかを
見ていきたいと思います。
この記事を読んだ後、以下の事をすこしでも学んでいただけると幸いです。
- Train-Test Splitは、データセットが非常に大きい場合
トレーニングにコストのかかるモデルがある場合、
モデルのパフォーマンスを早く予測したい場合に適している - scikit-learnという train-test splitを実行する機械学習のライブラリーの使い方
では始めましょう!!
概要
この記事の内容として、大きく3つに分かれています。
- Train-Test Splitの評価
- いつ Train-Test Splitを使うのか
- どうやってTrain-Test Splitを使うのか
- Scikit-Learn内でのTrain-Test Splitの手順
-
- 繰り返し可能なTrain-Test Splits
- 層状のTrain-Test Splits
- 機械学習のモデルを評価する為のTrain-Test Split
- 分類の為のTrain-Test Split
- 回帰の為のTrain-Test Split
Train-Test Splitの評価
train-test splitは、機械学習アルゴリズムのパフォーマンスを評価するための手法です。
分類または回帰の問題に使われ、教師あり学習アルゴリズムに使用できます。
この手順としては、データセットを取得して2つに分割します。
これを2つのサブセットに分割するとも言います。
最初のサブセットはモデルを適合させるために使用され
トレーニングデータセットと呼ばれます。
2つ目のサブセットは、テストデータセットと呼ばれるものです。
データセットの入力要素がモデルに与えられ、予測を行い、期待値と比較されます。
トレーニングデータセット:機械学習モデルを適合させるために使用されます。
テストデータセット:適合させた機械学習モデルを評価するために使用されます。
目的としては、新しいデータ(トレーニングに使用されないデータ)に対して
機械学習モデルのパフォーマンスを推測することです。
つまり、既に答えのある入力と出力を使って
まだ予測が出来ていない出力やターゲットの値を予測します。
先述した通り、このtrain-testの手順は膨大なデータセットがある時に適切な手法です。
下記で詳しくみてみましょう。
いつTrain-Test Splitを使用するのか
上記に記載してた「膨大な」データセットというのは
各予測モデリングに有用で比較できるデータでなければいけません。
これはデータセットをトレインデータセットとテストデータセットに分割するのに
十分なデータがあり、トレインデータセットとテストデータセットのそれぞれが
問題ドメインの適切な表現であることを意味します。
分かりやすく言うと、2つのデータに分けて問題やエラーが出るなら
元のデータセットも問題があるはずだという事です。
問題のあるドメインの適切な表現は、ドメイン内に一般的なケースと稀なケース
(極端に大きい変数など)を把握するのに十分なデータや記録があることを意味します。
これは、実際に入力変数の組み合わせがしっかり観察されて調整されている場合が
多いです。ただケースによっては数千~数百万の例が必要になる事もあります。
逆にデータセットが小さい場合、train-testの手順は適切ではありません。
理由としては、データセットがトレーニングセットとテストセットに分割されると
機械学習のモデルが入力から出力への効果的なマッピングを学習するのに
十分なデータがトレーニングデータがないためです。
また、モデルのパフォーマンスを効果的に評価するための十分なデータが
テストセットにもありません。
推定されるパフォーマンスは、過度に楽観的(良い)または過度に悲観的(悪い)
である可能性があります。
つまりどちらも極端すぎて良くないという事ですね。
もしデータが十分に揃わない場合は、他の適したモデルを評価する方法があるので
k-fold cross-validation procedure(交差検証)等
他のアルゴリズムも試してみて下さい。
データセットのサイズについてもう一つ言うと、 train-test splitを使う他のメリットとして
計算の効率化をはかる事ができます。
一部のモデルはトレーニングに非常にコストがかかり
他の手順で使用される繰り返しモデルを評価する事は現実的に難しいです。
そういった場合に、一例としてディープニューラルネットワークモデルがあります。
この場合、train-test手順が一般的に使用されてます。
その他の場合だと、プロジェクトの中には効率的なモデルと膨大なデータセットがあり
且つモデルのパフォーマンスをすばやく見積もる必要がある事があります。
ビジネスの場面ではこのケースが多いかもしれませんね。
この場合も、train-test splitの手順でアプローチをする事が多いです。
元のトレーニングデータセットのサンプルは、’random selection’を使用して
2つのサブセットに分割されます。
これは、トレーニング用とテスト用のデータセットが元のデータセットの特徴を
バランスよく選択してくれるのに役立ちます。
Train-Test Splitの書き方
この手順には、トレーニング用とテスト用のサイズがメインの構成パラメーターになります。
一般的には、トレーニング用またはテスト用のデータセットのいずれかの中から
0〜1の間をパーセンテージに表して使用していきます。
たとえば、サイズが0.67(67%)のトレーニングセットは、残りの0.33(33%)が
テストセットに割り当てられるという事になります。
最適な分割比率は決まっていません。
各々のプロジェクトの目的によって、下記のことも考慮しながら
どうパーセンテージを配分するかを決めていく必要があります。
- モデルのトレーニングにおける計算コスト
- モデルを評価する際の計算コスト
- トレーニングセットが何を表しているか
- テストセットが何を表しているか
とは言っても、一般的には下記のパーセンテージの分割がよく使われているみたいです。
- Train: 80%, Test: 20%
- Train: 67%, Test: 33%
- Train: 50%, Test: 50%
ざっと train-test split modelの評価の手順についてお話をしてきました。
次はPythonの中でこの手順がどうやって使われていくのか見ていきましょう。
Scikit-LearnのTrain-Test Split手順
The scikit-learn Pythonの機械学習のライブラリーではtrain_test_split() functionを通じて
train-test splitの評価の実装を行う事ができます。
この関数は、読み込んだデータセットを入力として受け取り
2つのサブセットに分割されたデータセットを返します。
理想的には、元のデータセットを入力(X)列と出力(y)列に分割してから
両方の配列を渡す関数を呼び出してみましょう。
そうすると、適切にトレーニングサブセットとテストサブセットに分割することができます。
分割のサイズは、行数(整数)または0から1までのデータセットのサイズの
パーセンテージ(浮動小数点数)にて指定できます。
一般的にはパーセンテージが使用されます。
たとえば、データセットの0.33という値(33%)がテストセットに割り当てられ
67%がトレーニングセットに割り当てられます。
ここでは、1,000例を含む合成分類のデータセットを使用し
下のコードから、どういう流れかみていきましょう。
上記の例を実行してみると、データセットがトレインセットとテストセットに分割され
新しいデータセットのサイズが出力されます。
数字を指定した通り、670の例(67%)がトレーニングセットに割り当てられ
330の例(33%)がテストセットに割り当てられている事がわかります。
または、’train_size’の値を指定してデータセットを分割することもできます。
この値は、行数(整数)または元のデータセットの0〜1のパーセンテージ
(67%の場合は0.67など)のどちらかになります。
なんとなくTrain-Test Split のイメージは掴んでいただけたでしょうか?
予測にはかかせないコードも含まれているので、また頻繁に登場すると思います。
また今度どのようにTrain-Test Splitが使われていくのか、追々みていきましょう!
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
それでは今日はここまでです。
最後まで読んで頂きありがとうございました^^