こんにちは。
今、KaggleのRestaurant Revenue Predictionをやっていて、その中でアンサンブル学習について再度学習してみたので、まとめました。
結構ながくなっちゃったかもですが、頑張って参考文献に飛ばしたりとかしてまとめました(笑)
アンサンブル学習とは
機械学習における目標は、汎化性能が高い学習機をデータから構築することです。汎化性能を向上させる方法はいくつかあるわけなんですが、以下の2つの方針があります。
- 単一の学習器の性能を向上させる
- 複数の学習器を用意して、それらの予測結果を統合して汎化性能を高める
後者の方法がいわゆるアンサンブル学習といわれるものです。複数の学習器を利用して高い精度を出すことを実現します。
参考文献や本
- アンサンブル学習(Ensemble learning)とバスケット分析(basket analysis) - Qiita
- アンサンブル学習
- 【翻訳】scikit-learn 0.18 User Guide 1.11. アンサンブルメソッド - Qiita
- アンサンブル学習の勉強をした話(雑記?) - Data Science by R and Python
- バッギング、ランダムフォレスト、ブースティング - アイアナ:データ分析や人工知能(AI)などの技術雑記
上の本のサポートページが以下。アンサンブル学習は7章。アンサンブル学習がいくつかscikit-learnで実装されていて、とても参考になります。
なぜアンサンブル学習は有効か
なぜアンサンブル学習が有効か、なんですが、これはこちらの資料に概要が乗っていました。
ちょっと私のググり力じゃなぜ有効なのかのガッツリした説明をみつけることができませんでした……(誰か知っている人がいたら教えてください)。
その資料では、2値判別問題の例があげられていました。以下は引用です。
・アンサンブルの方法として、単純に弱学習器の多数決としたとする。
・この時、2値判別問題では、(m+1)/2個以上の弱学習器が誤判定を起こすと、多数決によりアンサンブルの判定は誤りとなる。
・各弱学習器が統計的に独立とし、かつ弱学習機の誤り確率を一律θとすると、m個の弱学習機の内、半分以上の分類機の判定が謝る確率を考えた時に、その確率は非常に小さくなる。
上の引用は一部書き換えていますので、元のやつは資料をご確認ください。
これはあくまで直感的な説明とされていますが、こう考えるとたしかにうまくいかないほうが珍しいとなりそうだなぁと。
また、BaggingやPastingといったアンサンブル学習の方法では、各学習器は独立に学習することができます。精度もあげつつ、同時に複数のCPUを用いて並列計算を行うことも可能となれば、いよいよ使わない理由は特になさそうだなとなりますよね笑。
アンサンブル学習をより効果的にするために
次の点を考えて実装すると、より精度が高くなるようです。
- 出来る限り異なる弱学習器を用いること
- 出来る限り異なるデータ・セットを用いて各弱学習器を学習すること
つまり、それぞれの弱学習器が独立であればあるほど、アンサンブルした結果がより良い物になるということです。
良い学習結果を各弱学習器で得られている場合は特に問題はないのですが、相互に関係のある学習器を用いてアンサンブルすると、間違えるときはすべて同じように間違えると言った形になるため、アンサンブルする意味がなくなってしまうからです。
そのために、独立な学習器を用いることや同一のデータではなくランダムにサブサンプリングしたデータを用いることで、よりアンサンブル学習の成果を高めることができます。
アンサンブル学習の大まかな分類
分類は以下の3つになります。
- Bagging(バギング)
- Boosting(ブースティング)
- Stacking(スタッキング)
以下では、それぞれの手法と関連するテーマについてそれぞれ述べていきます。
Stacking(スタッキング)
スタッキングは、その名の通り、モデルをスタック(積み上げる)みたいな意味です。
概要
以下では簡単に概略を話します。まず、訓練用のデータセットを分けて以下の図の用に複数の学習機で学習します。
引用:Géron, Aurélien. "Hands on Machine Learning with scikit-learn and Tensorflow." (2017).
その後、その学習した学習器を用いて、訓練に使ったデータセットで予測して値を取得します(以下の図参照)。各学習機から取得した値を「特徴量」として使用し、学習器を更に作ります。これがスタッキングです。
引用:Géron, Aurélien. "Hands on Machine Learning with scikit-learn and Tensorflow." (2017).
上の図では一つだけしかスタッキングしませんでしたが、もちろん複数個の学習器を以下のようにスタッキングさせるのもありです。
引用:Géron, Aurélien. "Hands on Machine Learning with scikit-learn and Tensorflow." (2017).
scikit-learnにはこれを実現するものがないっぽいんですが(かなり以外)、以下のモジュールとかで実現できるみたいです。まぁふつうに実装しても問題はなさそうだけど、モデル試す時に楽になるならパッケージとか使っても良いかもですね。
参考文献
以上です。
もう少し書かないといけない部分とか、Pythonの実装とかもこれに追加していきたいので、まだまだ書くんですが、一旦コレで更新します。