こんにちは,shun(@datasciencemore)です!!
今回は予測モデリングのSTEP2:データ分割についてやっていきます.
STEP2:データ分割は,図の赤点線枠で囲った部分に該当します.
目次
0.データ分割ってなに??
データ分割は過学習を避け,未知データに対する汎化性能を高めるために学習データを適切に分割することだよ!!
未知データは通常,目的変数の値がわからないから既知データで構築したモデルの良さを評価することができないよね.
だけど,データ分割により,学習データをanalysisとassessmentに分割し,analysisで学習したモデルをassessmentで評価することで,未知データに対する汎化性能を見積もることができるんだ!!
いやー,いきなり過学習とか汎化性能とか専門用語の嵐で嫌になっちゃいますね.
じっくり解説していくので,最後までついてきてくださいね.
予測モデリングと人間の学習プロセスの比較はこちらになります.
過学習は,人間の学習プロセスに例えると,過去問や問題集の答えしか覚えないから,ちょっと問題内容を変えると対応できないってことに該当します.
逆に,データ分割は,過去問や問題集をまんべんなく学習するということに該当しています!
ここでいうまんべんなくというのは,ただ答えを覚えるのではなく,答えを導くためにする処理を理解したり,既存の問題から本番テストに出そうな問題を予想したりすることを示していると思ってください.
実際に成績があまり良くない人は,問題の答えを覚えるだけの傾向がありますが,成績がいい人ってただ問題を解くだけでなく,上述のような工夫をしていますよね!!
結構,現実とリンクしていて面白いですね笑
ちなみに余談ですが,こんな感じで現実世界と理論を心で納得することが機械学習(だけでなくデータサイエンス全般)を習得するためのコツだと思います!
なので,この講座ではどんどんこんな感じの比喩を入れていきますね!
1.良いモデルの探し方
さて,我々がやりたいこと,すなわち予測モデリングの目的は何だったでしょうか?
それは
既知データから適切な正解パターンを学習して,未知データの目的変数を精度良く予測すること!
ですね.
これを言い換えると
未知データに対し精度良く予測するモデルを見つけること!
と言えます.
意外と予測モデリングの学習をすると当初の目的を忘れがちなので念のための確認です.
以前に説明した健康診断データから身長を予測する場合を考えてみましょう.
こんな感じで既知データは,身長がわかるのに対し,未知データは身長がわからない.
だから,既知データから正解パターンを学習し,未知データの身長を予測するという問題設定を考えてみましょう.
このとき,どのように正解パターンを学習すればいいと思いますか??
普通に既知データを学習ルール(アルゴリズム+ハイパラ)に渡して正解パターンを記憶させればいいんじゃないですか??
基本的にはそうだね!
だけど,学習ルールは様々な組み合わせが考えられるよね?
どの学習ルールがいいって判断すればいいのかな?
残念ながら,それだと予測精度を評価することはできないんだ...
なぜかというと未知データには,目的変数の実測値がないからなんだ!
学習ルールというのは,アルゴリズムとハイパラを合わせたものだと考えてください.
学習ルールは,簡単に言うとどのように正解パターンを学習するかということです.
詳細は次回やるので,お楽しみに!!
以下の図のように未知データにモデルを適用して予測値を算出することはできるのですが,実測値(正解)がないため,その予測値が良いのか悪いのかを判断することができないのです.
それではどうすればいいのでしょうか?
惜しい!
それだと評価データに対していいモデルはできるけど,当初の目的である未知データに対して良いモデルである可能性があまり高くないんだ.
なぜかというと,作成したモデルに対し,1回しか評価していないから,評価データにたまたま良いモデルだけど,未知データには良くないモデルを選定してしまう可能性が高いからなんだ!
未知データに対して高精度なモデルを作成するためには,学習データを適切に分割して,複数回,モデル評価を実施すればいいんだ!!
次の図のような処理を考えましょう.
① 学習データをanalysisとassessmentに分割する.
② analysisを使用し,分割した個数だけ(図の場合だと4個)モデルを作成する.
③ ②で作成したモデルをassessmentに適用し,予測値を算出する.
④ assessmentの予測値と実測値を比較し,予測精度を算出する.
この処理のポイントは,
・分割した数だけモデル評価ができる!!
・実測値がわかるからモデル評価ができる!!
の2点です!
こうすれば,実測値がないからモデル評価できないという問題やモデルに対し1回しか評価していないから,評価データにたまたま良いモデルだけど,未知データには良くないモデルを選定してしまうという問題をクリアできますね!!
2.データ分割の基本原則
具体的にどのようにデータを分割すればいいんですか??
データ分割は,以下のデータ分割の基本原則に従い,分割するのが基本だよ!!
1.分割後のデータを既知データと未知データの関係と類似させる.
2.各foldのanalysisを網羅的にする.
イメージはこんな感じです.
こんな感じで
学習データと評価データの関係に合わせて,網羅的に分割するようにします.
すごく大事なのですが,意外と見落としていることを補足します.
教師あり学習は,既知データ(学習データと評価データ)と未知データは同傾向(データが同じルールでできている)という前提があります.
だってもし既知データと未知データが違う傾向だったら,いくら既知データから学習しても未知データの予測ができるわけないですもんね.
先ほどの健康診断データを例にすると,既知データがネズミのデータで未知データが人間のデータであったら,いくらネズミのデータで適切に学習しても,予測値はうまく出ないのは明らかですよね?
予測したいのは人間のデータなのだから,既知データも人間のデータを用意しないとダメです.
これも説明されれば当たり前なのですが,当たり前すぎてあまり説明されることがないので,念のために補足します.
機械学習は,こういう常識だろうという前提条件が実は非常に重要になってくることが多いです.
当講座では誤解を生まないためにも極力,常識だろうと思われるところも省略せずに補足していくスタンスでいきたいと思います.
3.色々なデータ分割と交差検証
よく使用するデータ分割の種類を具体的に教えてください.
データ分割の方法は実は様々あるんだけど,まずは基本のK分割を押さえよう!
データ分割をして,汎化性能の高い学習ルールを探す検証のことを交差検証,または,cross validation(クロスバリデーション)といいます.
3.0.初期分割
既知データを学習データと評価データに分割します.
すでに分割されている場合はする必要ありません.
また,この初期分割のみただ分割するだけで交差検証をしません.
3.1.K分割
Kは分割数を示しています.
そのため,この例ではK=4ですね.
K分割交差検証では,Kの数だけanalysisからモデルを作成し,assessmentで評価精度を確認することができます.
よって,全体の精度は,それぞれの分割したデータの結果を平均すれば算出することができます.
このようにすると1つの学習ルールに対し,1つの精度が算出されるので,複数の学習ルールを適用すると,それらの数だけの精度が算出されることになります.
なので,どの学習ルールが良いか比較できるのです!!
3.2.hold-out分割
学習データを単純に2分割にし,analysisとassessmentに分ける方法です.
K分割交差検証のKが1の時に該当します.
これだと,1回しか学習できないため,K分割交差検証と比較するとデータを有効に使えていないという欠点があります.
あまり使用することはないでしょう.
3.3.leave-one-out分割
K分割交差検証のKを学習データ数にする方法です.
一般的にKが非常に大きくなる分,作成されるモデルも多くなり,処理時間が増えます.
また,analysisが各foldでほぼ一緒になることから,網羅的に学習するということが難しくなります.
ただし,学習データ数が極端に少ない場合,leave-one-outは有効です.
学習データ数が少ない場合は検討してもいいでしょう.
3.4.stratified分割
分類タスクの場合に,foldごとに含まれるカテゴリの割合を等しくしてデータを分割することをstratified分割(日本語だと層化抽出)と呼びます.
データ分割の基本原則に従いましょうということですね.
例えばあるfoldのanalysis,assessmentのカテゴリの割合と別のfoldのanalysis,assessmentのカテゴリの割合が全然違うと,それぞれの予測のぶれも大きくなる可能性が高いです.
特にカテゴリが多クラス分類で頻度がすごく少ないカテゴリがある場合はstratifiedを使用したほうがいい場合が多いです.
3.5.時系列分割
時系列交差検証は,学習データと評価データが時系列に沿っている場合(要は,学習データが古くて評価データが新しい場合)に使用します.
学習データと評価データの時系列関係に合わせ,学習データを分割する際も以下のようにanalysisの後にassessmentが来るように分割します.
パターンとしては左と右の2パターンが考えられますが,一概にどちらがいいとは言い切れません.
データの性質を考慮し,適切な分割を選択するようにしましょう.
4.過学習と汎化性能の関係
次の図を見てください.(ana:analysis,ass:assessment)
上が学習データをそのまま全部使用して最適な学習ルールを探したパターン,下が学習データを適切に分割して最適な学習ルールを探したパターンです.
上下ともに色がついた実践部分が予測値,水色の点線部分が正解を示しています.
上は,学習データに該当する部分はうまく予測できていますが,それ以外の部分は予測と正解が大きく外れていることがわかります.(このことを過学習といいます.)
一方,下は,いい感じに予測できていることがわかります.(このいい感じに予測できていることを難しい言葉に直すと汎化性能が高いと言います.)
下は学習データを3つに分割し,それぞれでanalysisとassessmentのペアを作成します.
そして,それら3つのペアそれぞれに対し,assessmentの正解と予測値の差が少なくなるように学習するのです.
こうすることで,上のように,学習データにある値しか予測できないということを避けることができるのです.
この部分は正直,実際にデータを見て,モデリングを実装しないとイメージするのが難しいと思います.
なので,今はなんとなくの理解でいいので,学習データを全部使って学習するとよくないってところだけ理解できればOKです!
まとめ
今回はデータ分割についてやってきました!
データ分割は未知データに対する汎化性能が高いモデルを探すために実施します.
分割の仕方は,以下2つのデータ分割の基本原則に従います.
- 学習データと評価データの関係と各foldのanalysis,assessmentの関係を類似させる.
- 各foldのanalysisを網羅的にする.
そして,分割した後にいい学習ルールを探すために交差検証をするのでした.
代表的なデータ分割の種類として以下があります.
0.初期分割
1.K分割
2.hold-out分割
3.leave-one-out分割
4.stratified分割
5.時系列交差検証
もちろんこれ以外もあります.
大事なのはデータ分割の基本原則に従い,適切にデータを分割することです.
最初は難しいかもしれないですけど,慣れていきましょう!
今回もお疲れさまでした!