chakokuのブログ(rev4)

日々のごった煮ブログです

機械学習、ランダムフォレストをPythonで実装してみる

またまた例によって、周りが機械学習だBigなDataだ、Data利活用だと騒がしくて、自分自身、AIがこれからどうなっていくのかかなり危機感を抱いています。危機感の理由その1は、自分の仕事への影響、その2は、学者やエンジニアが暴走*1して、AI技術を危険な領域に適用、普及させないか?ということ。
機械学習は基本が確率・統計学だったり数学だったりするので、根本から理解するのは自分の頭では無理なのだけど、、それでもある程度は知っておかないと、仕事上、足元をすくわれる危険性がある。(黒船にやられるとか、、あるいは、仕事で関連技術を導入したものの、全く間違った使い方をしてしまうとか)
手始めに、、ランダムフォレストを勉強した。ランダムフォレストって、決定木を複数並べて*2、多数決でクラス分けするシステムと理解しているのですが、、どう決定木を作るのか(さらに言うと、木の枝分かれの部分のルールをどう決めるのか?)がポイントなのですが、一番シンプルな方法としては、学習データに着目し、学習データの一変数を基準に>か<か?で木を右に分岐するか、左に分岐するかを決める手法があると。で、、学習データのどの変数を用いるのが最も効果的な分岐になるか?は分岐させた結果、分割された学習データの集合がもっとも綺麗に分離(=エントロピーが最小)になるのを選べばよいと。
それで、学習データをランダムに選択して弱く学習させた木を複数並べて、実際に使う際には、複数の木をたどって得られた候補から多数決で決めればよいということだと理解しました。
一応そのように自分では理解したので、Pythonで組んでみて、簡単なデータを突っ込んで勉強させてみた。

今回勉強させたのは左のデータ。明らかに切れ目がはっきりわかる、だれでもルールが手で書けるデータ。データが少ないので、複数の木ではなくて、木は1本だけ、データもランダム抽出ではなくて、すべてのデータを利用して最適ルールを選定

4つのデータで学習させたランダムフォレスト(ただし、今は木が1本)の獲得ルール。まぁそらそうだろうという内容。


左は学習した木を使って、検証用データ(N=100)を分類させたところ。全然説明していない領域も、赤、青のどちらかに落とし込んでいる。過学習ではないけど、こんなもんでいいのか。。

ちなみに、、描画は、iPython/Notebookでやっています。これは便利。
ご参考のため、へなちょこPythonソース一式(rf_sample_YYMMDD.zip)は以下に貼り付けています。http://dune.sakura.ne.jp/dl/

■追記
もう少し複雑な分布の学習データを使って学習させた。データが少ないので、木は1本で、すべてのルール候補を試して判断木を作成。

400以上のデータ(0〰21の整数の全組み合わせ)を使って検証。x=14の場合、青か赤か?は学習データでは何も言っていないので、どちらでも正しいのだけど、心情的には、ここは青では?という気にはなる。システムではx=14で赤としても学習データとの矛盾が生じないのでこういうルールに落とし込んでいる。サポートベクターマシンだったら、青と赤の真ん中の距離に分離線を引くのでこういう分け方にはならないはず。

■ご参考URL
じじいのプログラミング様ランダムフォレストのつくりかた(C++の実装例つき);
http://shindannin.hatenadiary.com/entry/2014/12/26/184624
自分のプログラムは上記サイトの解説とC++サンプルソースをベースに作りました。感謝でございます。

*1:AI技術は人を助けるとか楽観的な意見もありますが、ウイルス攻撃等による個人情報漏えいとか、技術を悪用する人は絶対に出てくるので、プラス効果だけを享受するなんて無理なのでは?と思っています。

*2:木がいっぱいだからフォレスト。。ランダムはどこから??