機械学習における「validation」と「test」の違い

## 機械学習における「validation」と「test」の違い

### Q. 何故 train データ以外のデータが必要なのか？

**A. train データを使って学習したモデルが train データ以外のデータに対してどれぐらいの予測精度があるか確認する必要があるから.**  

データを使った学習では, 原則として学習に使ったデータ (train データ) に対する予測精度しか考慮していない.  
なので「train データに対しては良い精度で予測できるがそれ以外のデータでは予測が全く当てにならない」という学習結果も起こり得る (→ 過学習).  
過学習がどの程度起こっているかは実際に train データ以外のデータで予測をしてみないと分からないので, そのための train データと別のデータが必要になる.  
ここで過学習の確認のため使うデータを **validation データ**と呼ぶ.  

### Q. 何故 test データが必要なのか？

**A. train データと validation データに過学習していないか確認する必要があるから.**  

train データで学習して validation データで評価して学習時のハイパーパラメータをチューニングすることを繰り返すと, 「train/validation データに対しては良い精度で予測できるがそれ以外のデータでは予測が全く当てにならない」という結果も起こり得る (train データと validation データに対する過学習).  
なので validation データが必要なのと同様に 「train データと validation データに対する過学習」がどの程度起こっているか確認するための **test データ**が必要になる.  

また, validation データによる評価はしばしば学習の終了判定に用いられる.  
この場合も validation データの内容に依存したモデルを選ぶことになるため, test データによる確認が必要である.  

validation データでの評価を受けて再学習するという反復を行わない場合 (モデルや学習方法を事前に決めている場合, 単にアルゴリズムの性能を調べたい場合等) は validation データに対する過学習は起きにくいと考えられる.  
その場合は test データが必要にならない.  

実務上は train/validation データにモデル作成のための作為性が含まれている可能性を考えて, 本番環境で取得したデータを test データとして使う意味合いを持たせることもある.  

test データに対する評価がモデルの最終評価となるため, このデータには本番環境に対しての差異や偏りが存在しないよう注意する必要がある.  

### Q. じゃあ test データに対する過学習は考えなくていいのか？

**A. 考える必要がある. そのため「test データで評価した後はモデルを更新してはいけない」と言われる.**  

test データに対する予測結果を受けて学習時のハイパーパラメータのチューニングやモデルの再学習をすると train データと validation データと test データに対する過学習が起こっていく.  
しかし test データでの評価が満足でない場合にモデルの更新ができないと困るので, 以下のような対応が取られる:  

#### 対策1. 予め複数のモデルを作成しておく

候補となるモデルを複数作っておき, test データでの評価によって最終的にモデルを選択する.  
PoC 等でモデルの候補が限定されている場合には有効だが, 一般には作成した全てのモデルで十分な精度を得られないリスクがある.  
他に test データを用意し直すコストが高い場合にもこの施策が必要になる.  

#### 対策2. 評価の度に新たな test データを使う

本番環境等でデータを取得する環境が整っていれば一度評価に使った test データは破棄するか train/validation データと合併するかして, 新たに収集したデータを test データとして評価に使うことができる.  
異なるデータでの評価結果は単純比較できない場合も多いので, 以前のモデルも新たな test データで評価して新たなモデルと比較するといい.  

また, 1組のデータセットを train/validation/test に分割してモデルを作成する場合は, 分割方法を変えることで疑似的に新たな test データを得ることができる.  
ただし実際には train/validation に使ったデータを test データとして評価することになるので, 評価と再分割を繰り返すことで過学習が進んでいくことに注意.  

さらに, 更新した test データに偏りがあるなど品質面で問題があった場合, 過去の test データに対しての精度が悪化していることに気づけなくなってしまう懸念も存在する.  
過去の test データやそれに対応したモデルも保持しておき, 新しい test データのものと比較することでこの問題を緩和することはできる.  

#### 対策3. test データへの過学習に目を瞑る

validation の時点で十分な精度が見込まれる等, test データによる評価の回数が少なそうな場合は多少の過学習を無視して test データを使い回してもいい.  
発展して, validation データへの過学習を許容して test データによる評価を行わない場合もある.  

### Q. クロスバリデーション (公差検証) って何でやるの？ test データの扱いは？

**A. 「たまたま精度が良くなる train/validation の組み合わせだった」という偏りを避けるため.  
&emsp;test データは学習に使われることを避けるためクロスバリデーションは適用しない.**  

モデル作成には学習/評価に使ったデータが持つ偏りが大きく影響し, 「train データで学習したモデルを validation データで評価するとたまたま良い精度が出た」という結果が起こり得る.  
そのため出来るだけ様々な組み合わせの train/validation データでモデルを学習/評価することが望ましい.  
その効率的な組み合わせ方を与える方法が, 1組のデータセットをいくつかに分割して train/validation データに振り分けるクロスバリデーションである[^crossvalid].  

[^crossvalid]: クロスバリデーションの効果は[数理的にも研究がなされている](http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/summer2017.pdf). 最適化の文脈ではモデルチューニングが多目的最適化となって最小化しにくくなる (= 過学習しにくくなる) という効果もあるように思う.  

test データは学習やモデルチューニングに使わなかったデータでモデルを評価するという目的があるため, クロスバリデーションの枠組みで扱う (分割したデータのいずれかを test データに割り振る) ことはしない方がいい.  

### Q. 「データセットを train と test に分ける」的な記述を読んだけどその時の validation データってどうなってるの？

**A. たぶんこの記事で言う validation データのことを test データと呼んでいる. 文脈を読むこと.**