目次
はじめに
機械学習を行っていく上で、まず真っ先に気をつけなければならないことがあります。それが、「過学習」です。統計学の分野では「過剰適合」とも呼ばれるこの概念は、機械学習に慣れていない初心者がまず陥ってしまう罠であると言えると思います。
そこで、今回は、「過学習とは何か?」について、あなたが1人のデータサイエンティストだとして、具体的なシーンを想定しながら、基本的なイメージを掴んでみましょう(ただし、今回はあくまで概念の輪郭を捉えることが目的のため、数学的な話は抜きにします。なので、もう少し詳しい話を知りたい方に向けての解説は、また別の記事に譲ります)。
過学習の定義
解説に移る前に、まずは「過学習」の客観的な定義を参照してみます。誰に聞くかによって答えも微妙に変わってくるかと思うので、おそらく最も被引用数の多いであろう、我らがWikipedia兄さんに定義を聞いてみましょう(一部抜粋)。
-統計学や機械学習において、訓練データに対して学習されているが、未知データ(テストデータ)に対しては適合できていない、汎化できていない状態を指す。汎化能力の不足に起因する。-
うーん、わかったような、わからないような・・・。ただ、なんとなく、「何かしらの能力が不足していることで、あるデータに適合ができていない状態」であることは理解できました。理解を妨げているのは、恐らく次の3つでしょう。
- 訓練データ
- 未知データ(テストデータ)
- 汎化性能
そこで、上記3つの概念について、具体的なシーンの中に位置づけながら、簡単に解説したいと思います。
モデルをつくる:「訓練データ」「未知データ」とは?
ある日、あなたはデータが沢山用意されたファイルを渡され、上司からこう言われました。
いやいやいや、何をですか、ってところですが、ひとまず冷静になります。今回、私達には100組のカップルのデータが渡されました。データの中には、身長、体重、年齢、学歴、収入、付き合った年数、相手の好きなところ、出会った場所、などなど、プライベートもびっくりの個人情報がてんこ盛りだったとします。
少し思案を巡らせた後、あなたは気が付きます。恐らく、今回のミッションは、「うまくいくカップルの条件」でしょう。恋愛の「予測」を行うことで、お見合いマッチングか何かのビジネスに使われるはずです。
そこで、私たちがまず行うべきことは、恋愛の予測を行えるような「モデルをつくる」ことです。具体的には、上司に渡されたデータをもとにコンピューターに学習を行わせ(これぞ「機械学習」!)、多項式の関数を組みます。この関数が、モデル(あるいはアルゴリズム)です。多項式の関数、っていうのは、現時点では中学校の数学で習ったy=ax+・・・みたいなやつだとイメージしていただけると良いです。言い換えるならば、何かのデータをインプットすると、何かをアウトプットしてくれる、「ハコ」のようなものだと思ってください。例えば、次のようなイメージです。
- カップル1…「男性:180cm、女性:165cm」、1年で破局
- カップル2…「男性:172cm、女性:170cm」、4年で破局
- カップル3…「男性:165cm、女性:155cm」、6年間継続中
- カップル1+カップル2+カップル3+・・・→(モデル)
「男性:180cm、女性:165cm」→(モデル)→「3年以内に別れる率:80%」
このモデルをつくることで、適当な男女2人のデータを使って、あの2人はああでもないこうでもないと楽しめます。
要は、人生経験が豊富で、「あの子とあの人は3ヶ月以内に付き合うわ!」とか「あの2人はダメ。じきに別れるわよ。」とか見事にあてちゃうオバ様を想像してください。私たちは、データをもとに彼女(オバ様)をつくりたいわけです。
そして、このオバ様の元となるデータのことを「訓練データ(学習データ)」、まだ上司から渡されていない新しいデータのことを「未知データ(テストデータ)」と呼びます。
何はともあれ、私たちは、100組のカップルの訓練データをもとに、カップル予測モデルをつくることができました。
モデルを検証してみる:「汎化性能」とは?
さて、意気揚々と、上司にカップル予測モデルを提出しました。しかし・・・
上司は、私たちの作ったモデルに対して、100組とは別の男女50人のデータをインプットして、モデルが正しいかどうかを確かめてみたのです。すると、100組のデータではうまくいっていたはずのカップル予測モデルが、別のデータでは、全然的外れになってしまいました。
このように、ある訓練データをもとにつくったモデルが、他のデータ(=未知データ)に対して同じような予測精度を示すかどうか、というモデルの性能のことを「汎化性能」と呼びます。
過学習(過剰適合)とは何か?
まとめると、次のことがわかりました。
- 訓練データ:モデル作成の基となるデータ群
- 未知データ(テストデータ):あるモデルの訓練データに含まれない新しいデータ群
- 汎化性能:ある訓練データをもとにつくったモデルが、他のデータ(=未知データ)に対して同じような予測精度を示すかどうか、というモデルの性能
これを、過学習の定義に当てはめてみると、次のようになります。
- 過学習:統計学や機械学習において、あるデータ群を基につくったモデルが、そのデータ群に含まれない新しいデータ群に対しては、同水準の予測精度を示すことができない状態
つまり、「過学習」というのは、あるデータでは優れていたはずのモデルが、他のデータに対しては全く使い物にならない、という状態のことを言うのです。
なぜ過学習が起こるのか?原因はなに?
どうして、過学習が起こってしまうのでしょうか?過学習には、大きく2つの要因が考えられます。
- 訓練データの量が少ない、あるいは典型的でない
- 未知データに対してモデルが複雑すぎる
一言で言うと、「偏ったデータに対してモデルを合わせすぎた」ということです。
これは、多くの場合、モデル生成時に、訓練データの「説明」を目的としてしまうことが原因ではないでしょうか。本来であれば、モデルは未知データに対する「予測」を行うために構築されるべきものであり、訓練データはモデル構築のための手段に過ぎません。
しかし、例えば上述のようなシーンにおいて、上司から「何としてでも結果を出せ!」というような圧力がかかっていたとすれば、どうでしょう。部下であるあなたは、上司に認めてもらうために分かり易い成果を求め、訓練データに対するモデルの予測精度を上げることだけを考えてしまうかもしれません。すると、冷静に考えれば疑うべき数字(予測精度98%など)が弾き出された際も、それを疑うことなく、「良いモデル」として認めてしまう恐れがあります。そして、訓練データのばらつきをうまく説明できる一見きめ細かなモデルが採用され、訓練データから大きくハズレたデータの予測には何ら役に立たないアルゴリズムがビジネスに使われてしまうのです。その結果は、惨憺たるものでしょう。
過学習の回避策は?どうすれば過学習を避けられる?
こうした状況を避けるためには、予め、過学習を回避するような分析手法をとる必要があります。一番の方法は、理想的な訓練データと未知データを十分に用意することでしょう。しかし、データ分析の現場において、データが十分に整っている環境は稀です。そこで、限られたリソースの中でも、間違いのない分析を行う工夫が求められます。
本記事では詳しく解説しませんが、その代表的な手法の一つに、「交差検証」があげられます。「交差検証」は、今あるデータを分割して、一部を学習用に、残りをテスト用に回すことで、限られたデータの中で解析の妥当性を検証する方法です。交差検証には、より具体的には次のような手法があります。
- ホールドアウト検証
- K-分割交差検証
- leave-one-out 交差検証
それぞれ分割の方法が異なるのですが、目指すべきところは一緒です。Webマーケティングの担当者の方であれば、「ABテスト」のイメージをもっていただくと理解しやすいのではないでしょうか?(もちろん、厳密には異なる概念です)
いずれにせよ、重要なことは、解析によって「それらしい」結果を出す前に、その解析自体の妥当性を疑い、検証しようとする姿勢を保つことです。この基本的な姿勢さえ持てていれば、過学習などの過ちが起こることは随分と減るのではないでしょうか?
編集部の考察
いかがでしたでしょうか?過学習は、データサイエンスにおいては、避けては通れない落とし穴です。今回の例では、上司が訓練データの一部からテスト用の未知データを確保しておいてくれたため、悲惨な状況は避けることができましたが、いつも優秀な上司が助けてくれるとは限りません。
データサイエンティストを始め、仕事でデータを扱った分析を行う方は、このことを肝に銘じた上で、過学習の概念をしっかりと理解して、ミスを起こさないように気をつけましょう。
※本記事では、過学習の学術的な解説は行わなかったため、もっと詳しく知りたい方は、別の記事を読むか、専門書を読むことをオススメします。
補足:参考リンク