2008/05/29

ランダムフォレスト(Random Forest)法を用いて株価予測を行ってみた。-02

第二回。今回は予測を行うにあたって、統計ソフトであるRの"randomForest"パッケージを利用する方法を用いました。


randomForestパッケージのインストール


randomForestパッケージをRに追加するには、CRANからネットワークインストールを行うやり方が最もてっとり早いです。具体的にはRを起動させてから


> install.packages("randomForest")

と入力してください。コンパイルが開始されます。
もしコンパイラが存在しないとかでエラーがでた場合、apt-getかなんかで適当にインストールしてから、再度試みるとうまくいくはずです。


randomForestパッケージの利用


randomForestパッケージの利用手順は、おおまかに以下のようになります。

  1. library(randomForest)でパッケージを読み込む。
  2. dat.rf <- randomForest(formula ,data=dat ,ntree=500)
    でRFに学習させる。dataには学習に用いるデータテーブルを指定。formulaには推測に用いる変数を"y~x1+x2"のようにして記述する。y以外のすべての変数を推測に用いるならば"y~."とする。ntreeには発生させる決定木の数を指定する。
  3. dat.pred <- predict(dat.rf ,newdata=dat.test)
    でRFに推測させる。newdataには推測に用いるデータテーブルを指定する。
※補足
  • plot(dat.rf)とすると、決定木の数と予測精度の推移をグラフで見ることができる。
  • varImpPlot(dat.rf)とすると、各説明変数の予測に対する寄与度を見ることができる。
詳細は「randomForestパッケージのリファレンス(pdf)」を参照してください。
次回はこのパッケージを用いて実際に予測してみます。

2008/05/27

Pythonでiniファイルとかの設定ファイルを読み込んでみる

Python上でiniファイルなどの設定ファイルを読み込むための方法。Pythonは"Battery Included"の発想があるため、特に何も用意しなくても設定ファイルを読み込むライブラリ"ConfigParser"が標準でついてくる。このConfigParserがとっても便利で感動したのでおもわず投稿。

ConfigParserを用いて設定ファイルを読み込むには、ただ以下の数行を付け加えるだけでよい。



import ConfigParser

config = ConfigParser.RawConfigParser()
config.read('settings.conf')
directory = config.items('Directory') #Directoryセクションの読み込み
print directory # [('item1','value1'),('item2','value2'),...]
print config.get('Directory','item1') # 'value1'

実質設定ファイルの読み込みが3行ですんでる!すごい!

これをC#で行うとなると結構大変で、StringBuilderなどを使って構文解析をする必要がある。
実際はもうiniファイルではなく、XMLなどを用いて設定ファイルを読み込むのが主流になっているはずだからフェアな比較とは言えないけど、ちょっとしたアプリケーションを作るときにXMLは少し気合が入りすぎというか、そこまでしなくても・・・という感じはある。


なのでこうやってたった3行、しかもリファレンスを見ただけで動作がきっちり理解できるpythonはやっぱすごいなと思ったのでした。

Random Survival Forestなるものがあるらしい

RandomSurvivalForest
(Photo by Keith Marshall , "Savernake Forest Tree")

Random Forest(RF)自体最近出来た新しい手法ですが、それを発展させたRandom Survival Forest(RSF)なる手法が最近発表されたらしいです。発表されたのは2007年ぐらいで、2008年の4月8日にRのCRANパッケージに追加されました。

ざっと見た感じだと、ブートストラップを用いてN組のデータセットを生成するところまでは同じですが、その後に不必要な枝を剪定しているのが違いでしょうか。そんな劇的にパフォーマンスが上昇するとまではいかなそうですが、RFよりよい精度で推測が行えるかもしれません。ちょっと試してみたいと思います。

てゆーか発展速度早いって!2008年の4月ってつい最近のことですよ。ほんと機械学習の領域はぐんぐん進んでいきますね。


5/28 追記
ちゃんと読んでみたら、このRandomSurvivalForestはRandomForestを生存分析に適応した手法であることがわかりました。なので今回はあんまり使えなさそうな気がします。というか名前まんまですよね。はぁ。

2008/05/24

ランダムフォレスト(Random Forest)法を用いて株価予測を行ってみた。-01

randomForest

さて、今回は2001年ごろに登場した、比較的新しい手法と言われる集団学習の一派『ランダムフォレスト(Random Forest)』法を用いて株価の予測を行ってみました。

ランダムフォレストって?

ランダムフォレスト(RF; random forest)法は,集団学習法の一種である.集団学習(ensemble learning,アンサンブル学習とも呼ぶ)法は決して精度が高いとは言えない複数の結果を組み合わせ,精度を向上させる方法である.いわば,「三人寄れば文殊の知恵」である.集団学習法の中の代表的な方法としてはバギング法,ブースティング法,ランダムフォレスト法がある.
(p.256 金 明哲,村上 征勝『ランダムフォレスト法による文章の書き手の同定』,2007)

大体のイメージとしては、あんまり精度が良くない予測システムを200〜500個くらい作って組み合わせることで、精度の良い結果を得ようとする感じです。

他の手法に比べて利点は?

そもそも「データを元に何かを推測する」というやり方はとっても応用範囲が広い、しかも「推測」っていうのは人工知能と絡んでくるため、ずっとずっと前から研究が続けられてきて、様々な手法が開発されてきました(e.g. Artificial Neural Network(ANN),Genetic Algorism(GA),Support Vector Machine(SVM),...and more!!)。その中の1つとして集団学習があり、さらにその中の1つとしてランダムフォレストがある感じです。

それじゃあランダムフォレストは他の手法と比べて何か利点はあるの?というと、以下の通りとなります。

  • 多くのデータセットを用いることによって、とても正確な分類を行うことができる。
  • 非常に多くの説明変数を扱うことができる。
  • データマイニングにおける分類問題において、説明変数の重要度を見積もることができる。
    (結構重要。他の手法は主にどの変数によってアウトプットが決定されるのか分からないものがある。)
  • 欠損したデータを良い精度で推測できるので、データの大部分が欠損していても正確さを保つことができる。
  • 従来の手法に比べて、学習速度が早い。

などなど…(英語版のwikipediaよりいくつかの項目を超訳しました)
ランダムフォレストについて詳しく知りたい方は、『Breiman, Leo (2001). "Random Forests". Machine Learning (pdf)』を参照してください。

とりあえず長くなりそうなので今日は概要まで。次回から具体的な手法に入っていきます。

う〜ん…

最近は映像だけじゃなく、投資についての勉強を両方してる感じなんで、もういい加減このブログのタイトルを変えるか、新しくブログをブランチする必要がでてきました。正直ダサいですしねこのタイトル。むぅ…今はまだ考え中ですけど、数日中に決める予定。

どっちにしろ、自分が書く情報がだれか他の人の役に立てるような記事を書きたいと思っています。映像にしろ金融工学にしろシステムトレードにしろ、そういう情報を日本語で公開しているとこって書籍でもネットでも少ないですし。

まだ自分は大学2年生なのであんま大したことは書けないですが、自分ができる最大限のことを実行していきたいと思います。更新量が他のブログと比べて極端にすくないこのブログですが、1人でも読んでくれる人がいるかぎりまだまだやっていくつもりですので、どうぞよろしくお願いします。

2008/05/10

Psyop: Happy Valentine's Day

※結構グロいです!閲覧注意!※

久々にPsyop(NYの映像製作集団)を見ていたら出会いました。会社なのにこういうメッセージ性の強い作品を、しかもなんの目的もなく作るあたりがさすがPsyopだなぁと。

メッセージの内容はよくあるシンプルな主張なのですが、それだけにとても難しい。難しいです。

2008/05/08

python + BeautifulSoupでHTML解析を行ってみた。

諸事情により株価について整理されたデータを作ることになったんで、pythonとBeautifulSoupを使ってHTMLスクレイピングを行うことにしました。

最初は「えーpythonってインデントで識別するんでしょー慣れなさそー気持ちわるそー」って思ってたんですが、実際やってみると簡単で数時間後にはきちんと動作するスクリプトが組めたのでびっくり。すいません侮ってました。これは便利!

いやぁーそれにしてもすごいっすよBeautifulSoup。なにしろ名前が綺麗っすよね。混沌としたHTMLのSoupからBeautifulな部分を取り出すぜ!っていう思いが伝わってきて凄くいいです。そしてなによりHTML解析が便利すぎる。他の言語はどーやって行っているのかよく分かりませんが、トップレベルで使いやすいことは確かです。

これがHTMLスクレイピングの主要部分↓

soup = BeautifulSoup(rawdata)      
target = soup("tr",{'bgcolor':'#ffffff'},{'align':'right'})[0]('small')

こんな気持ち悪い文法で動くのはBeautifulSoupだけ!:)

こんな文初めて書きました。いやぁーすごいっす。