2013年4月26日金曜日

randomForestの複数の決定木を合体させる方法 他


■調べたこと

 ◇randomForestの決定木をマージする方法
 
  CRAN
  randomForestマニュアル
  http://cran.r-project.org/web/packages/randomForest/randomForest.pdf

  combine関数で対応できる模様


 ◇BASH
 
  ・for文の組み方

    ファイヤープロジェクト
    for文
    http://www.fireproject.jp/feature/bash/basic/for.html

  ・BASHのsprintfっぽい役割をする関数の書き方
  
   それマグで!
   bashで指定回数ループして綺麗なファイル名を作る
   http://takuya-1st.hatenablog.jp/entry/20090217/1234871797

  
  ・変数に空白を含む文字列を与える場合

   HHeLiBeXの日記 正道編
   シェルスクリプトに空白を含むパスを渡した場合の扱い
   http://d.hatena.ne.jp/hhelibex/20100306/1267884583

   単に' 'でくくればOK

Twitter系参考資料(その1)



Twitterのサンプルソースを求めてWebをちょっと徘徊した時に見つかった
有益そうな情報のある参考サイト。



■Twitter Streaming API

 ★console.lealog();

  Twitter Streaming APIについてのメモ
  http://lealog.hateblo.jp/entry/2013/03/10/100845


 ★DoboWiki

  Twitter Streaming APIを使う 1
  http://wiki.dobon.net/index.php?.NET%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%A6%B5%E6%2F96



■OAuth

 ★OAuthライブラリ(PHP)

  https://github.com/abraham/twitteroauth

  ZIPボタンをポチる。


■OAuth認証+Twitter

 ★WEBOPIXEL

  PHPでOAuth認証して自分のつぶやきを表示する [Twitter API 1.1 対応版]
  http://www.webopixel.net/php/666.html


 ★きらら2号

  PHPでOAuthを使ったサンプルコード
  http://speit.blog78.fc2.com/blog-entry-50.html


 ★ITメモ帳

  twitter/PHPでつぶやき投稿(OAuth認証)
  http://hodade.adam.ne.jp/itmemo/index.php?twitter%2FPHP%A4%C7%A4%C4%A4%D6%A4%E4%A4%AD%C5%EA%B9%C6%A1%CAOAuth%C7%A7%BE%DA%A1%CB


2013年4月11日木曜日

CRANで提供されているパッケージのカスタマイズ方法のメモ

分類器の挙動をあまり良く知らなくても、
ライブラリの使い方がある程度把握できていれば
クラス分類とかが出来てしまう。

 しかも、それをフリーツールで実現できてしまう。


今はこんなご時世なので、「実際使ってみる方が先決」っていった
話になりやすい環境にあると感じるのですが・・・。

いろいろ検証し始めると、やっぱり自分専用に欲しくなってしまう機能なんて
出てきたりするもんなんですよ。
他にも、やっぱりライブラリの中身の挙動を
具体的に知りたいっていうときもあります。


そんなわけで、実際にCRANに公開されているrandomForestパッケージを使って
中身の改変に取り組んでみました。


実際の手順は次の通りになりました。
Rの開発実行環境があるのが前提です。
Mac OS X 10.8.xの場合です。

1.RToolsをインストールする。

2.CRANサイトから、randomForestのソースコードのtar.gzをダウンロードし、
  ワークディレクトリ上で解凍。
  解凍し終わったら、後に出来上がってくるtar.gzと区別する意味で
  どこか別のディレクトリに移しておくのをお薦め。

3.randomForest/srcやrandomForest/R で改変したいところを自由に編集する。

4.R CMD check randomForest --no-manual を実行。
  足りないパッケージが出てくるかもしれませんので、そういうのが出てきたら
  その都度R実行環境上でインストールする。

5.R CMD build randomForest でrandomForest.tar.gzを生成。

6.R開発実行環境を立ち上げ、R上でパッケージインストールからインストール。
  もしも、既にrandomForestをフレームワーク下に入れていたならば、
  フレームワーク側の方のrandomForestを削除してからR開発実行環境を立ち上げる。


ハマったのは、まず4。
--no-manualオプションを入れておかないと、マニュアル作成の処理までやろうとして
勝手にエラーを吐いて止まってくれちゃいます。。。
マニュアルが欲しい人はTexLiveを入れて対応するらしいのですが、
まずは改造してみたい人にとっては、マニュアル作成よりも先に
きちんと動かしたいのだと思います。
だから、--no-manualオプションは入れることをお薦めします。

ちなみに、私はTexLiveそのものをインストールしてみたんですが、
このセットアップだけで1時間弱の時間がかかってしまいました。

どうしてもインストールしておきたいならば、寝る前に回しておくことをお薦めします。


つぎに6。
普通にremove.packagesで本家のrandomForestを消してから6をやり直したりしたのですが、
自分で改変した箇所が反映されず、とても悩みました。
フレームワーク内にパッケージを入れているときは、
ユーザー領域にパッケージが入らないので、この点は注意です。



とりあえず、自分用のメモ書きとして、CRANで提供されているパッケージの
カスタマイズの方法を書いてみました。


あ、ちなみに、例題(ってほどでもないですが)で使ったrandomForestパッケージは
ライセンスがGPL2以上となっていますので、これを改造してCRANに上げたい方はご注意くださいね。


(参考)

iAnalysis ~おとうさんの解析日記~
 http://d.hatena.ne.jp/isseing333/20110117/1295197018

10分で分かるRパッケージの作り方
 http://www.slideshare.net/yokkuns/10r

生物統計学
 http://r.livedocs.net/dev/packging.html


2013年4月8日月曜日

kernlabパッケージのspamデータ

最近忙しくて、休みの日も仕事をする日々だったので、
記事が久しぶりになってしまいました。。。


Rのkernlabパッケージに入っているspamデータについて調べてみました。

私は、サンプルデータセットが充実している点がRの良いところの1つだと
思っているのですが、意外と日本語のページでデータそのもののことを
調べたという記事が見つからなかったので、興味のあるところだけを抜き出して
調べてみようというのが、この記事を書く発端です。

私が気になっているのは、このデータがクラス分類するにあたって
ふさわしいデータなのかどうか、ということです。

データが、1つの独立変数を選べば完璧にspam(nonspam)データだけを抽出できる
というものではクラス分類をわざわざ登場させる意味を感じませんし、
逆に全く分離できる希望を持てないような分布であっても、
サンプルとして適用するだけの価値はないようにも思えるのです。

だから、これらを足して2で割ったような感じの特性になっているのが
私はクラス分類のサンプルデータとしてふさわしいデータに思うんですね。

今回は、この視点で書いてみることにしました。
まずは、以下に置いてあるCRANのマニュアルを見てみました。
spamデータのことは、p90あたりに書いてあります。

このマニュアルから分かったことは、こんな感じ。
  •  HP研が収集したデータセットである。
  • 4601通のE-mailについて、スパムか否かを分類した。
    • spamは1813通, nonspamは2788通分である。
  • E-Mail中の単語や文字の出現頻度が示されている57の独立変数と、従属変数で構成されている。
    • 1〜48番目の独立変数は、変数名の出現頻度
    • 49〜54番目の独立変数は、記号文字の出現頻度である。
    • 55〜57番目の独立変数は、大文字の連なりの長さの平均, 最長, 合計を表す。
    • 58番目は従属変数であり、nonspam, spamのどちらかが記載されている。
  • spamは、製品やウェブサイトの広告,楽して儲けられる系のサイト,チェーンメール,アダルトなど。
  • non-spamは、仕事関係や個人のメールが対称。
    • george(データ提供者のご氏名)とかエリアコード650が含まれている単語はnonspamである。 
 
出現頻度と書いてあったので、単なるカウントかな?と思ったのですが、
実際にデータセットを見てみると、数値が小数点が入っていたり、
1以下の数値も出ていたりしました。
だから、単純なカウントではなく、何らかの正規化をかけているように見えます。


次にspamとnonspam別に独立変数別に平均と分散を見てみました。


この結果が以下の通りです。
各列の意味は、次の通りです。
  • spam Avg : spamクラスに該当するデータだけを集めて平均した結果。
  • spam Var : spamクラスに該当するデータだけを集めて分散を求めた結果。
  • nonspam Avg : nonspamクラスに該当するデータだけを集めて平均した結果。
  • nonspam Var : nonspamクラスに該当するデータだけを集めて分散を求めた結果。
  • 偏り: spam Avg / (spam Avg + nonspam Avg) の結果。
    • 0.5よりも小さいほどnonspamに偏って出現しやすい独立変数。
    • 0.5よりも大きいほどspamに偏って出現しやすい独立変数。

spam Avg spam Var nonspam Avg nonspam Var 偏り
make 0.1523 0.0965 0.0735 0.0887 0.6746
address 0.1646 0.1217 0.2445 2.6674 0.4025
all 0.4038 0.2311 0.2006 0.2530 0.6681
num3d 0.1647 4.9243 0.0009 0.0005 0.9946
our 0.5140 0.5001 0.1810 0.3776 0.7395
over 0.1749 0.1036 0.0445 0.0497 0.7970
remove 0.2754 0.3273 0.0094 0.0122 0.9671
internet 0.2081 0.2969 0.0384 0.0611 0.8442
order 0.1701 0.1259 0.0380 0.0394 0.8172
mail 0.3505 0.3986 0.1672 0.4137 0.6771
receive 0.1184 0.0630 0.0217 0.0224 0.8451
will 0.5500 0.4110 0.5363 0.9583 0.5063
people 0.1435 0.1228 0.0617 0.0671 0.6995
report 0.0836 0.1017 0.0424 0.1187 0.6634
addresses 0.1121 0.1499 0.0083 0.0089 0.9309
free 0.5184 1.0265 0.0736 0.3802 0.8757
business 0.2875 0.3922 0.0483 0.0479 0.8560
email 0.3192 0.4437 0.0973 0.1577 0.7664
you 2.2645 2.4551 1.2703 3.2171 0.6406
credit 0.2055 0.6216 0.0076 0.0093 0.9644
your 1.3804 1.5065 0.4387 1.0510 0.7588
font 0.2380 2.0757 0.0452 0.3724 0.8403
num000 0.2471 0.2695 0.0071 0.0046 0.9721
money 0.2129 0.3607 0.0171 0.0738 0.9255
hp 0.0175 0.0258 0.8955 4.2899 0.0191
hpl 0.0092 0.0099 0.4320 1.2216 0.0208
george 0.0015 0.0011 1.2653 18.0844 0.0012
num650 0.0188 0.0928 0.1938 0.4063 0.0884
lab 0.0007 0.0002 0.1628 0.5706 0.0042
labs 0.0060 0.0107 0.1659 0.3272 0.0347
telnet 0.0013 0.0013 0.1060 0.2634 0.0119
num857 0.0005 0.0002 0.0773 0.1757 0.0067
data 0.0146 0.0126 0.1510 0.4946 0.0880
num415 0.0018 0.0013 0.0778 0.1760 0.0223
num857 0.0069 0.0043 0.1695 0.4544 0.0393
technology 0.0295 0.0218 0.1417 0.2484 0.1724
num1999 0.0435 0.0721 0.1977 0.2397 0.1802
parts 0.0047 0.0025 0.0187 0.0786 0.2010
pm 0.0124 0.0080 0.1217 0.3019 0.0927
direct 0.0367 0.0231 0.0831 0.1862 0.3064
cs 0.0001 0.0000 0.0720 0.2133 0.0008
meeting 0.0024 0.0008 0.2168 0.9519 0.0111
original 0.0085 0.0025 0.0706 0.0795 0.1069
project 0.0062 0.0037 0.1266 0.6304 0.0470
re 0.1251 0.1042 0.4158 1.5883 0.2313
edu 0.0147 0.0179 0.2872 1.3292 0.0488
table 0.0012 0.0003 0.0082 0.0094 0.1295
conference 0.0021 0.0007 0.0512 0.1333 0.0394
charSemicolon 0.0206 0.0084 0.0503 0.0920 0.2904
charRoundbracket 0.1090 0.0796 0.1586 0.0679 0.4073
charSquarebracket 0.0082 0.0023 0.0227 0.0182 0.2655
charExclamation 0.5137 0.5538 0.1100 0.6738 0.8237
charDollar 0.1745 0.1299 0.0116 0.0049 0.9374
charHash 0.0789 0.3745 0.0217 0.0595 0.7841
capitalAve 9.5192 2484.6422 2.3773 26.1498 0.8002
capitalLong 104.3933 89571.4926 18.2145 1527.6210 0.8514
capitalTotal 470.6194 680758.9522 161.4709 126549.8115 0.7445


この表の 「偏り」列を見る感じですと、

num3d, remove, addresses, credit, num000, moneyがspamに、
george, lab, num857, cs, project, conference あたりはnonspamに
それぞれ出現しやすい単語?のようです。


逆に、spam, nonspamの両方に出やすいのは、
will, you, addressあたりでしょうか。

これらはクラス分類をするにあたっては
あまり意味をなさない独立変数なのかもしれませんね。


全体的には、多少出現頻度が偏っているんだけど、
必ずしもその独立変数のみではクラス分類できそうもないものばかりで、
クラス分類のし甲斐のあるデータセットになっているように思えました。



 データセットは、あともういくつか調べてみようと思います。