訓練・検証・テストの3つにデータを分割する理由

MLの教科書とか記事を読んでいると,データを訓練,検証, テストの3つに分けている場合が多い。 訓練と検証の2つじゃだめなの?とついつい勘違いしてしまうのでメモ。

テストはなんのため?

  • ここの勘違いが全てなんだと思う。
  • テストの目的は実運用時の性能を推定すること。勘違いしがちなのは,モデル選択にテストデータでの評価結果を使うこと。
  • 繰り返すが,テストは性能を推定するだけ,モデル選択するためじゃない。

テストデータと検証データの使い方

  • MLのモデルはハイパーパラメタがある場合がほとんど。
  • よくある勘違いは訓練データで種々のモデル(モデル自体やハイパーパラメタが違うモデル)を訓練し,テストデータで性能を測定し,最も性能が良いものを採用してしまう方法。これはあくまでも,そのテストデータに対して最も良いモデルを選んだだけであって,その値を持って実運用時の性能を推定することはできない。
  • くどいけれど,あくまでも,テストはテストであって,選択基準にしてはならない。
  • 適切な使い方は,訓練データでパラメタを学習して,検証データでモデル選択をして,テストデータで性能を測定する。
  • だから,名前のままなんだ。訓練データで訓練して,検証データで検証してみて,テストデータでテストする。
  • そうか,検証とテストという言葉が似すぎているのか!検証は自分側に裁量がまだあるが,テストはもはや裁量権を失っているようなイメージなのかな。モデルを検証しましたので,テストお願いします,みたいな感じなのかな。

補足(クロスバリデーション)

  • データを分割すると,貴重なデータ数が目減りして見える。
  • より有効的に訓練と検証をする方法がクロスバリデーション。
  • データを訓練データとテストデータに分けて,訓練データに対して交差検証をする方法。これはデータをうまく使いつつ,良いモデルを選択できる。