読者です 読者をやめる 読者になる 読者になる

Data Science by R and Python

統計学を、広く、深く、わかりやすく。

アンサンブル学習の勉強をした話(雑記?)

アンサンブル学習?バギング?ブースティング

f:id:tomoshige_n:20141207011141p:plain

ここ2~3日ほど、アンサンブル学習って一体なんだ!?と思って、色々と本、論文を読みあさっておりました。たまに、データの分析で「バギング」とか「ブースティング」で解析しましたとか意味わからない言葉を並べられて、「それ何してるんですか?」と聞いても「もやっと」しかならなかったので、ここを解消しようと思い立ちまして、、、3日間ほど全力を出しました。本業の研究は見事に進んでいませんが、、、これもきっといつか役に立つと信じて(笑)

で、にわかに理解したので、その覚え書きも含め、どんな本とか、資料を参考にしたかというのをここに備忘録として残しておきます。まず、最初はもちろんwikipediaから始まります(笑)。まず、僕の中に予備知識として「バギング」と「ブースティング」が「アンサンブル学習」なる機械学習の1つであることだけは持っていたので、、、まず「アンサンブル学習」から勉強します。

勉強スタート!

アンサンブル学習(EN):Wikipedia

Ensemble learning - Wikipedia, the free encyclopedia

ほうほう、これによると、アンサンブル学習にはいくつかの種類があるとのことですね。とりあえず3章が参考になりそうなので、ここをコピペ。

3.1 Bayes optimal classifier
3.2 Bootstrap aggregating (bagging)
3.3 Boosting
3.4 Bayesian model averaging
3.5 Bayesian model combination
3.6 Bucket of models
3.7 Stacking

まず、「バギング」=「Bootstrap aggregating」のことなんですね。つまり、ブートストラップ標本を使って、なんかモデルつくって、アグリゲート(統合)的なことをするんでしょう。ということで、次のwikipediaへ。

バギング(EN):Wikipedia

Bootstrap aggregating - Wikipedia, the free encyclopedia

バギングに属する有名な方法は「ランダムフォレスト」です。これは得られているデータからランダムに標本再抽出(ブートストラップ標本の作成)を行って、それぞれに対して決定木を当てはめて、それを統合して精度をあげるんでした。正確には、多数決投票をする方法(?)でしたよね。この考え方で一般化線形モデルなどもうまく拡張してしまえばいいんですね、例としてnearest neighbour classifiers(最近傍判別器)なんていうのも載っています。この辺りの議論はブートストラップと似ていそうなので、この本を参照すれば良さそうです。議論としてもきっと自然でしょう。

An Introduction to the Bootstrap (Chapman & Hall/CRC Monographs on Statistics & Applied Probability)

An Introduction to the Bootstrap (Chapman & Hall/CRC Monographs on Statistics & Applied Probability)

実際の論文はこれみたいです。読んでみましたが、結構わかりやすかったです。
http://statistics.berkeley.edu/sites/default/files/tech-reports/421.pdf

ということで、ここはこれぐらいにして、ブースティングに移ります。

ブースティング(EN):Wikipedia

Boosting (machine learning) - Wikipedia, the free encyclopedia

。。。これは、やばいんじゃないか。英語のWikipediaに詳細が載っていない=なかなか説明するのが難しいので、自分で本探して頑張れ!というお決まりのパターンに落ちてしまいました。仕方ないので、大学のメディアセンターに走りまして、、、この本を借りてきました。

ブースティング - 学習アルゴリズムの設計技法 (知能情報科学シリーズ)

ブースティング - 学習アルゴリズムの設計技法 (知能情報科学シリーズ)

さて、読み始めてみるとですね、「確率的近似学習アルゴリズム(通称:PAC Learning Algorithm)」が最初に登場しまして、、、この段階で気づいたのは、これはたぶん「直感的説明」なるもので難しいところが飛ばされる本であるということです。でも、第4章、5章には「ブースティングの統計的解釈」というテーマの章がありました。ここでは、実際にどのようにAdaBoostが導出されるのかという議論がされていて、結構参考になりましたが、残念ながら「定義」が曖昧でわかりにくい箇所があったので、参考文献を見て、遂に見つけました、、、「Additive Logistic Regression: A Statistical View of Boosting」なる論文を!

ちなみに、この論文を書いている人は「Friedman, Hastie, Tibshirani」というスタンフォード大学の教授陣ですが、昨日紹介したこの本の著者でもあります。この方の本は、何冊も読んだことがありますが、とにかくレベルが高い。ということで安心して論文へ。。。

The Elements of Statistical Learning: Data Mining, Inference, and Prediction, Second Edition (Springer Series in Statistics)

The Elements of Statistical Learning: Data Mining, Inference, and Prediction, Second Edition (Springer Series in Statistics)

論文へ

http://web.stanford.edu/~hastie/Papers/AdditiveLogisticRegression/alr.pdf

すると、例にも漏れず、こういうことになります(笑。
f:id:tomoshige_n:20141207010540p:plain

ただ、読んでみてわかったことは、ブースティングがきちんと統計的に導出されるものであるということと、なぜ「ある程度うまく機能するのか」がわかりました。これで、にわかブースターになれました(笑。あと、どのようなケースではうまく機能しないのかも、ある程度理解できたので調べてみてよかったかなと。アルゴリズムの設計も難しくなさそうなので、時間を見てpythonで実装してみようかなと思います。

ちなみに、、、PythonのScikit-Learnを使えば一瞬で使うことができます。世の中便利ですね。
1.9. Ensemble methods — scikit-learn 0.15.2 documentation

まとめ

ということで、楽しいアンサンブル学習の学習が終わりました。あとは、アウトプットの形を拡張したり、はずれ値に対するロバスト性の議論などが残っていますが、今回はここまでとします。