訓練・検証・テストの3つにデータを分割する理由
MLの教科書とか記事を読んでいると,データを訓練,検証, テストの3つに分けている場合が多い。 訓練と検証の2つじゃだめなの?とついつい勘違いしてしまうのでメモ。
テストはなんのため?
- ここの勘違いが全てなんだと思う。
- テストの目的は実運用時の性能を推定すること。勘違いしがちなのは,モデル選択にテストデータでの評価結果を使うこと。
- 繰り返すが,テストは性能を推定するだけ,モデル選択するためじゃない。
テストデータと検証データの使い方
- MLのモデルはハイパーパラメタがある場合がほとんど。
- よくある勘違いは訓練データで種々のモデル(モデル自体やハイパーパラメタが違うモデル)を訓練し,テストデータで性能を測定し,最も性能が良いものを採用してしまう方法。これはあくまでも,そのテストデータに対して最も良いモデルを選んだだけであって,その値を持って実運用時の性能を推定することはできない。
- くどいけれど,あくまでも,テストはテストであって,選択基準にしてはならない。
- 適切な使い方は,訓練データでパラメタを学習して,検証データでモデル選択をして,テストデータで性能を測定する。
- だから,名前のままなんだ。訓練データで訓練して,検証データで検証してみて,テストデータでテストする。
- そうか,検証とテストという言葉が似すぎているのか!検証は自分側に裁量がまだあるが,テストはもはや裁量権を失っているようなイメージなのかな。モデルを検証しましたので,テストお願いします,みたいな感じなのかな。
補足(クロスバリデーション)
- データを分割すると,貴重なデータ数が目減りして見える。
- より有効的に訓練と検証をする方法がクロスバリデーション。
- データを訓練データとテストデータに分けて,訓練データに対して交差検証をする方法。これはデータをうまく使いつつ,良いモデルを選択できる。