4章では、ディープラーニングに限らず機械学習全般に関わる内容を扱っている。このエントリの内容は、主に4章中盤部の内容をまとめたもの。
4.2 機械学習モデルの評価
訓練(training), 検証(validation), テスト(testing)
機械学習モデルの評価をする際には、データセットを訓練データ、検証データ、テストデータの3つに分けて使用する。訓練データを用いて機械学習モデル自体を調整(学習)し、学習に使用していない検証データを用いて、学習の結果を評価する。最後に、モデルの学習が完了した時点で、学習にも検証にも使用していないテストデータを使ってモデルの最終的な予測結果を評価する。
ここで、シンプルに訓練データとテストデータの2つに分ければ十分ではないかと思うかもしれない。それではダメな理由は、一言で言うなら、検証データに対する過学習を避けるため。
機械学習モデルを開発する際には、機械学習モデル自体(ハイパーパラメータ)のチューニングを行う。このチューニングは、実質的にはある種のハイパーパラメータ空間内での学習であると言え、検証データが持っている情報がモデル自体に取り込まれてしまう。その結果、モデルが検証データに対して最適化されてしまい、一度も入力されたことのないデータに対する性能 (汎化性能) はむしろ低下してしまうかもしれない。それを避けるためには、元のデータを訓練、検証とテストの3つに分け、テストデータはモデルの学習時には直接的にも間接的にも一切使用しないことが必要となる。
訓練データと検証データの分離法
テストデータを予め取り分けておいた上で、訓練データと検証データを分離する方法はいくつかある。
注意点
機械学習の実践上の注意点。
- データの代表性
訓練データもテストデータも両方とも、データセットを正しく代表するものでなければならない。MNISTのように数字の画像データを分類する問題を例に取ると、仮に数字順にデータが並んでいた場合、先頭から8割を訓練データ、残り2割をテストデータとして取ってしまうと、0〜7の数字の画像を使って訓練を行い、8,9のデータに対してテストを行なうことになってしまう。バカバカしい間違いのように思えるかもしれないが、ありふれた間違いなのだそうだ。現実のデータは完全にランダムであることは少なく、普通何らかの形でソート、分類されていることが多いからだと思う。これを防ぐためには、データをランダムにシャッフルした上でテストデータを分離する必要がある。
- 時系列データ
上記の例とは逆に、データが時系列で何らかの意味を持っている場合は、データをランダムにシャッフルしてはならない。この種のデータには、天気、株価の変動などがある。もしもデータがシャッフルされていた場合、未来の結果を知っている状態で未来を予測する状態になってしまう。時系列データのテストデータは、訓練データよりも時間的に後のデータを用いる必要がある。
特徴量工学 (Feature engineering)
特徴量工学 (Feature engineering) とは、対象データと機械学習アルゴリズムについて人間が持つ知識を使用して、モデルの予測性能が向上するように、データを事前に変換する方法を指す。
ディープラーニングで特徴量工学が不要になったと言われるけど、そんなこともないよという話。
- 良い特徴量を使えば、問題を少ないリソースでエレガントに解決することができる。たとえば、時計の画像から時刻を読む問題を畳み込みニューラルネットで解くのはバカげている。
- 良い特徴量を使えば、少ないデータで問題を解くことができる。ディープラーニングモデルが特徴量を学習する能力は、多数のデータが利用できることが前提となる。データが少ない場合は、特徴量として抽出する情報の価値は上がる。
本日はここまで。次回は、過学習を防ぐための手法を取り上げ、「Deep Learning with Python」の前半部分終了の予定。