教師あり学習における訓練、検証、テストデータについて(図解なし)

今回は、少し教師あり学習におけるデータの扱いに考えたので整理します.訓練とか検証とかテストの話です.

私なりのかみくだいた解釈であり、言葉などは素人用語を多用しています.間違っていたら叱咤なりコメントなりください.

データセットとは

おそらくデータセットという言葉に関しては、データのまとまりであるとか、関連データの集まりというような掘り下げだすとかなり深そうな雰囲気がするのですが、教師あり学習に関して言えば、入力データとそれが何を表すラベルがセットになったデータが集まったものという理解で十分かと思います.入力データの部分はテキストであったり、画像や動画、音声や音楽なども含まれます.


公開されているデータセットの例
MNISTデータセット:手書き数字の画像データと、その画像が0~9のどの数字を表すかがセットになっている
Kineticsデータセット:約30万件のYouTube動画に、400種に分類された人間のアクションがラベリングされている.DeepMindによる

こんな感じで公開されているものをまとめている記事もありました.ありがたい.
【24個掲載】機械学習で使えるデータセット一挙勢揃い!

画像を扱う機械学習のためのデータセットまとめ - Qiita

教師あり学習

今更ですが、ある入力に対してそれがどういった出力を出すかの関係(複雑な関数、大体ブラックボックス)を、教師データを使って学習するのが教師あり学習です.教師データは、その名の通り教師ですから、その入力データが表しているものはこれですよという正解ラベルが付いています.そのため、教師データを使えば、推定したラベルが正解ラベルと合っているかを判断することができます.

現実のデータにラベルは付いていない

ただし、現実世界のデータは入力でしかなく正解ラベルは付いていません.そんなものなくても私たち人間は目の前の人が女の人でおそらく30代、アジアの人だろうな、というようなことを瞬時に推定できるわけです.
機械にもそういった推定をさせるためには、教師データで学習した入出力の関係性がラベルを持たない未知の入力データにも使えるような関係性である必要があります.このように未知のデータにも対応できる性質を汎用性と言い、汎用性を持たせることを汎化とか汎化性能を高めるとか言います.

では、どのように高い推定精度を持ちかつ汎用性の高い関係性を見つけるのかいうのが次の問題になりますが、ここでいったん言葉の整理をしておきます.正式な定義じゃないです.

  • モデル:入力データと出力(ラベル)の関係を内部に持つ識別器.どんなニューラルネットを使うのか、あるいはサポートベクターマシンを使うのかなど枠組み(識別手法)の部分は人間が決める必要があります.学習率などのハイパーパラメータも人間が与える必要があります.
  • ハイパーパラメータ:モデルの構造・構成に関わる値.ニューラルネットであれば何層にするか、学習率はいくつにするかなどの数値のこと.この数値で決められたモデルの構造に従って学習は進められます.この値は人間が与える必要があります.
  • 重み:モデルが内部に持っている、入力と出力の関係性を示す関数の係数にあたる部分.学習はこの重みをコンピュータが試行錯誤して決めていく作業になります.選択したモデルによっては理論的に試行錯誤なしで求まったりしますが、今は忘れましょう.

どうやって学習させるか

モデルに汎用性を持たせるためによく用いる方法として、クロスバリデーション(Cross Validation、交差検証)と呼ばれる手法があります.学習用データセットを訓練用と検証用に分けて、学習は訓練データのみで行い、その汎用性の検証を検証データで行うという方法です.

学習はあくまで訓練用データを使って行いますので、学習で得られる重みは訓練用データを推定するのに適した重みとなります.しかし、それでは訓練用データに入っていないデータに対して推定ができない(汎用性がない)ことになりますので、それを確認するために検証用データを使います.

訓練用データで学習したにも関わらず、ちゃんと検証用データに対しても高精度の推定ができるのであれば、それは汎用性が高いと言えます.

検証用データとは別にテスト用データが必要

しかし、検証データで検証すれば汎用性は十分かと言うとそうとは言えません.もし検証の結果、いい精度が出せなかった場合、検証データに対しても精度が上がるようにモデルの設計やハイパーパラメータを見直すことになります.つまり、検証用データがいい結果になるようにチューニングを行っていることになります.別にそのつもりはないとしても、そうなってしまっているのです.

そのため、最後の最後には、検証用データとは別のテスト用データ(訓練にも検証にも出てこなかったデータ)で、モデルの最終評価、まさにテストを行う必要があります.それで結果がダメなら、そのモデルはまだ不十分だと判断しなければなりません.

以上のことから、手元にあるデータセット訓練用、検証用、テスト(最終評価)用に分ける必要があると言えます.

  • 訓練用データ:重みの学習に使用します.
  • 検証用データ:学習済モデルが汎用性があるのかどうかを検証するために使用します.
  • テスト用データ:テストに使用します.最後の最後まで使いませんので、訓練・検証が終わるまでは存在を忘れてもいいレベル.

データの数が十分でない場合、K-foldクロスバリデーションという方法で、訓練用データと、検証用データを入れ替えながら検証を行う方法もありますが、ここで説明は省きます.このときもテスト用データは使いません.


クロスバリデーションに関しては以下の記事が図解付きで参考になりました.
モデルの汎化性を評価する「交差検証」について、Pythonで学んでみた

最終的な学習済モデルはどれを選べばよいのか.

順を追って勉強していれば、おそらくこのような疑問は持たなかったのかもしれませんが、これは私がずっと疑問に思っていた内容です.

例えば、5-Fold クロスバリデーションで検証を行った場合、5つの学習済モデルが出来てしまいます.じゃあ、テストに使う最終的なモデルってどれ・・?.一番スコアが良かったやつ?などと悩んでいたのですが、いろいろ記事を読んで得られた結論は以下です.

ハイパーパラメータも決まって、クロスバリデーションで精度も確認できた.
では次にやることは

訓練用データ、検証用データをまとめた学習用データでもう一度学習

です.


は?と思われるかもしれませんが、モデルをうまく学習させる方法(NNの設計とか、ハイパーパラメータの値)が決まったのであれば、訓練データ・検証データの役割はひとまず終わりです.クロスバリデーション中に学習した様々な重みなども忘れてください.

今使えるデータ(訓練用+検証用)を最大限に使ってモデルを学習させましょう.テスト用データは別にしといてください.

学習後にこれまで触らずにとっておいたテスト用データを使って学習済モデルの確認を行います.ここで精度が悪ければ、あきらめてモデルを見直しましょう.(そのときは、テスト用データの存在はまた忘れてください)


同じ疑問を持った人はいたみたいで、以下の記事も参考になります.

machinelearningmastery.com

まとめ

今回は、訓練データ、検証データ、テストデータについて、自分の記録として残しました.

正直まだ少しモヤっとはしているところもあります.

検証もOK、最終テストもOKとなった場合、実務で最終的にリリースする場合はテストデータ含め持っているデータ全て使ちゃってもいいんでしょうか. 何かを実務でリリースするなんてことは考える必要もない話なんですが、ちょっと気になります.

以下の記事も参考にしました

機械学習のテストデータは2種類用意すべき - へたれプログラマーのメモ

scikit-learn を用いた交差検証(Cross-validation)とハイパーパラメータのチューニング(grid search) - Qiita

交差検定(クロスバリデーション)など機械学習の評価方法まとめ : 新規事業のつくり方