機械学習

過学習とは?機械学習を実装する際に過学習を回避する方法をまとめていく!

ウマたん
ウマたん
当サイト【スタビジ】の本記事では、データ分析時に気を付けなくてはいけない過学習についてまとめていきます。過学習はどんな時に起こるのか理解した上で、過学習を回避する方法についても詳しく見ていきますよー!データ分析時の参考にしてくださいね!

こんにちは!

データサイエンティストのウマたん(@statistics1012)です!

普段、嘘みたいに高い予測精度を何も考えず使っていませんか?

アカデミックの世界では、当たり前のように過学習について注意されているのですが、ビジネスの世界では意外とないがしろにされていることも多いようです。

この記事では、モデル構築時に必ず陥る罠「過学習」について見ていきたいと思います。

ウマたん
ウマたん
過学習は非常に危険な罠なので注意しよう!

以下の動画でも解説しています!

過学習とは

Social strategy

過学習は別名「オーバーフィッティング」・「過適合」とかとも言ったりしますが、データ分析の分野では有名な罠です。

簡単に言うと、手元にあるデータだけにピッタリ合い未知データに対して全く合わないモデルを作ってしまうこと。

手元のデータだけ説明できても未知のデータを説明できるとは限らないんですね。

むしろ手元のデータに対してフィッティングし過ぎると未知データの予測精度は下がってしまいます。

データには必ずノイズ(誤差)が存在するため、完璧に当てることはほぼ不可能です。

完璧に当てようとするとノイズ自体にも適合したムダに複雑なモデルを作ってしまい、未知データには上手く当てはまらなくなってしまうのです。

そんな過学習はバリアンス・バイアスと関係性が深いです。

■バリアンスは予測結果のばらつき
■バイアスは予測結果と実測値の差

もちろんバイアスが低い方がモデルとしては優秀なのですが、バイアスを低くしすぎるとノイズに対しても適合することになるので予測結果のばらつきが大きくなってくる、すなわちバリアンスが大きくなってきます。

つまり、「バリアンスが大きい状態」=「過学習している可能性がある」ということです。

バイアスとバリアンスは基本トレードオフになりますが、バイアスとバリアンスのバランスをとることが重要です。

バリアンス・バイアスに関してはこちらの記事で詳しくまとめています。

アンサンブル学習とは?バギングとブースティングとスタッキングの違い当サイト【スタビジ】の本記事では、アンサンブル学習についてまとめていきます!アンサンブル学習とは機械学習を学ぶ上で非常に重要な考えであり、いくつかのモデルを組み合わせて汎化能力を上げるもの。有名なランダムフォレストやXgboostなどもアンサンブル学習によって生み出されているんです!...

過学習を回避する様々な方法

そんな過学習ですが、回避する方法は非常にたくさんあります。

学習データと検証データを分ける

手元の全てのデータを用いてモデルを作成しようとするから過学習が起きてしまうのです。

学習モデルと検証データを分けてモデルを構築することで過学習の起きにくいモデルを作成することができます。

分けた後の学習モデルを使ってモデルを構築して検証データの推定値を算出し、得られた推定値と検証データの実測値の誤差を計算します。

この時、学習データは上手く推定出来ているのに検証データでは誤差が大きいのであれば、
上手くモデル構築出来ていないということになります。過学習の疑いがあります。

このように疑似的に将来のデータを作り出すことで過学習を未然に防ぐモデル構築が行えるのです。

そしてこの学習データを検証データを分けて検証を行うことをバリデーションを呼びます。

実は、バリデーションにはいくつかの方法があるんです。

ざっくり学習データと検証データにランダムに振り分けてモデル構築を行うhold-out法、データをいくつかグループ分けして1つのグループデータセットを他のグループで作成したモデルで予測するcross-validation法、データを1個だけ取り出してそれ以外でモデル構築を行い1個の予測を行う作業をサンプル数分繰り返すleave-one-out法などなど。

hold-out法はランダムに分けたデータセットの組み合わせ次第では精度がムダに高く出てしまう可能性があるので、シミュレーションを何回か繰り返して平均を取った方が良いです。

leave-one-out法はサンプル数が多いと物凄く計算負荷がかかるのであまりオススメしません。

ちなみに僕の場合は普段hold-out法を1000回くらい繰り返して精度比較しています。

データ分割する手法について詳しくは以下の記事にまとめています!

交差検証法とは?実際にRで行ってみよう!当サイト【スタビジ】の本記事では、データ分析の場面で非常に重要である交差検証法についてまとめていきます。過学習を抑え未知データに対しても汎化能力の高いモデルを作成していくことが可能です。ぜひ交差検証法をマスターしてくださいね!...

AIC/BIC

実は、学習データと検証データを分けなくても過学習を回避する方法はあるんです。

AIC(赤池情報量基準)・BIC(ベイズ情報量基準)などは、変数の数を罰則項として考えることで、過学習を回避しています。

モデルの評価=(予測精度)ーf(変数の数)

変数の数に対してどのように罰則を付けるかは情報量基準によって違いますがどれも変数が多ければ多いほどモデルの評価を下げる式になっています。

ウマたん
ウマたん
情報量基準にはAICやBIC以外にもたくさんの種類があるよ!

これにより、あまりにも多くの変数を用いて作った複雑なモデルは評価が低くなり、過学習を回避することができるのです。

正則化

正則化は推定した回帰係数に対して罰則項を設けることで、過学習を防ぐ方法です!

主にL1正則化L2正則化という考え方があります。

正則化に関しては以下の記事で詳しくまとめていますので良ければご覧ください!

正則化 正則化手法についてざっくりと説明していきます。 正則化とは、目的関数に対して最適化したいパラメータの関数を追加することでパラメ...

またL1正則化であるスパース推定に興味のある方はこちらもご覧ください!

スパース推定とは?理論とオススメ本を紹介!当サイト【スタビジ】の本記事では、スパース推定についてまとめていきます。スパース推定とは特定のパラメータを0と推定すること。はたしてパラメータを0と推定することでどのようなメリットがあるのでしょうか?...

手法やパラメータを簡易的なものにする

高度な手法でゴリゴリのパラメータチューニングを行う場合、過学習に陥りやすいです。

ただ、この場合でもしっかり適切な形に学習データと未知データを分けてバリデーションをおこなえば大丈夫。

ただ、まずは過学習しにくい簡易的な手法でパラメータチューニングをせず実装してみるのも手です。

過学習 まとめ

過学習を抑える方法を4つ紹介してきました!

学習データと検証データを分ける
AIC/BIC
正則化
手法やパラメータを簡易的なものにする

実際に過学習を回避するようにモデルを構築しても、未知データの予測がどうなるかは分かりません。

最強のデータサイエンティストが集うデータ分析コンペ「Kaggle」でも最後の最後まで順位は分かりません。

既存のデータに対するフィッティングで仮順位が出ているのですが、最終的な順位は本番データによって決まります。

本番データで順位が大変動することも往々にしてあるのです。

ウマたん
ウマたん
そうなんだよねー!過学習には細心の注意を払わないとね!

過学習は気を付けておけば基本大丈夫ですが、突き詰めようとすると非常に奥が深い分野なんです!

機械学習についてもっと詳しく知りたい方はぜひ以下の記事を見てみてください!

機械学習入門に必要な知識と独学勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!