Going Faraway

渡辺遼遠の雑記帳。技術ネタと読んだ本の紹介。

【Deep Learning with Python】機械学習の基礎

4章では、ディープラーニングに限らず機械学習全般に関わる内容を扱っている。このエントリの内容は、主に4章中盤部の内容をまとめたもの。


4.2 機械学習モデルの評価

訓練(training), 検証(validation), テスト(testing)

機械学習モデルの評価をする際には、データセット訓練データ、検証データ、テストデータの3つに分けて使用する。訓練データを用いて機械学習モデル自体を調整(学習)し、学習に使用していない検証データを用いて、学習の結果を評価する。最後に、モデルの学習が完了した時点で、学習にも検証にも使用していないテストデータを使ってモデルの最終的な予測結果を評価する。

ここで、シンプルに訓練データとテストデータの2つに分ければ十分ではないかと思うかもしれない。それではダメな理由は、一言で言うなら、検証データに対する過学習を避けるため。

機械学習モデルを開発する際には、機械学習モデル自体(ハイパーパラメータ)のチューニングを行う。このチューニングは、実質的にはある種のハイパーパラメータ空間内での学習であると言え、検証データが持っている情報がモデル自体に取り込まれてしまう。その結果、モデルが検証データに対して最適化されてしまい、一度も入力されたことのないデータに対する性能 (汎化性能) はむしろ低下してしまうかもしれない。それを避けるためには、元のデータを訓練、検証とテストの3つに分け、テストデータはモデルの学習時には直接的にも間接的にも一切使用しないことが必要となる。

訓練データと検証データの分離法

テストデータを予め取り分けておいた上で、訓練データと検証データを分離する方法はいくつかある。

  • シンプルなホールドアウト
    MNIST問題やIMDB問題で使用した方法。データセットから単に一部の検証データを取り分ける方法である。データが大量に利用できる場合は有効。
  • K分割交差検証 (KFCV)
    Boston Housing問題で使用した方法。データ数が比較的少ない場合に、検証の精度を上げるために使われる。利用可能なデータセットをk個に等分し、そのうち1セットだけを検証用に取り分けておく。残りのk-1個のデータでモデルを学習させ、取っておいた1セットのデータで検証スコアを算出する。それぞれの分割に対して同様の処理を行ない、最終的な検証スコアはk個のスコアの平均を取ったものとなる。
  • シャッフル付き繰り返しk分割検証
    この手法は、利用可能なデータが少ない状況でモデルの精度を可能な限り上げたいときに有効。ショレさんがKaggleのコンペティションなどで使用した際に有効だったという。基本的にはKFCVを何度か繰り返す手法であるが、それぞれの繰り返しにおいてデータセットをk個に分割する前に、データをランダムにシャッフルするものである。この方法では、(KFCV自体の繰り返し回数) x (KFCVの分割数) 回のモデル訓練と評価が必要であり、計算量が大きくなることに注意。

注意点

機械学習の実践上の注意点。

  • データの代表性
    訓練データもテストデータも両方とも、データセットを正しく代表するものでなければならない。MNISTのように数字の画像データを分類する問題を例に取ると、仮に数字順にデータが並んでいた場合、先頭から8割を訓練データ、残り2割をテストデータとして取ってしまうと、0〜7の数字の画像を使って訓練を行い、8,9のデータに対してテストを行なうことになってしまう。バカバカしい間違いのように思えるかもしれないが、ありふれた間違いなのだそうだ。現実のデータは完全にランダムであることは少なく、普通何らかの形でソート、分類されていることが多いからだと思う。これを防ぐためには、データをランダムにシャッフルした上でテストデータを分離する必要がある。
  • 時系列データ
    上記の例とは逆に、データが時系列で何らかの意味を持っている場合は、データをランダムにシャッフルしてはならない。この種のデータには、天気、株価の変動などがある。もしもデータがシャッフルされていた場合、未来の結果を知っている状態で未来を予測する状態になってしまう。時系列データのテストデータは、訓練データよりも時間的に後のデータを用いる必要がある。
  • データの重複
    仮に、データに重複があり(現実のデータではよくある)、重複したデータが訓練データセットとテストデータセットに分けられてしまった場合、同じデータを用いて学習とテストを行うことになってしまい、テストスコアの妥当性が低下してしまう。データをきちんと前処理して重複データを排除することが必要となる。

特徴量工学 (Feature engineering)

特徴量工学 (Feature engineering) とは、対象データと機械学習アルゴリズムについて人間が持つ知識を使用して、モデルの予測性能が向上するように、データを事前に変換する方法を指す。

ディープラーニングで特徴量工学が不要になったと言われるけど、そんなこともないよという話。

  • 良い特徴量を使えば、問題を少ないリソースでエレガントに解決することができる。たとえば、時計の画像から時刻を読む問題を畳み込みニューラルネットで解くのはバカげている。
  • 良い特徴量を使えば、少ないデータで問題を解くことができる。ディープラーニングモデルが特徴量を学習する能力は、多数のデータが利用できることが前提となる。データが少ない場合は、特徴量として抽出する情報の価値は上がる。

本日はここまで。次回は、過学習を防ぐための手法を取り上げ、「Deep Learning with Python」の前半部分終了の予定。