Hatena::ブログ(Diary)

2014-07-20

因果推論祭り、Tokyo.R、機械学習ハッカソンなどの話

京都二週間目にしていきなり平日に休みをとり、東大で行われた"渾身のガチ企画:『夏の統計的因果推論祭り』"に参加しました。

http://takehiko-i-hayashi.hatenablog.com/entry/2014/04/30/120251

"調査観察データの統計科学―因果推論・選択バイアス・データ融合"の著者としても有名な東大の星野先生(Rubin学派の方)とJudea Pearlの"Causality"の翻訳者でPearlから直に電話がかかってくるという統数研の黒木先生が講演をされていました。この因果推論の主要二学派の話が3時間で両方聞けるのは世界でも稀な機会だったのではないかと思います。

星野先生は主にpotential outcome frameworkによる因果効果の定義の話、propensity scoreの概念的なはなし(具体的な手法というよりは概念的だったと思う)をしていました。おまけで計量経済のHeckman学派のはなしもしていましたが、難解すぎてよくわかりませんでした。Imbens & Rubinの因果推論本がついに出版されるらしいという耳寄り情報がありました。(Rubinの論文を見ると少なくとも2007年の時点では執筆中であったっぽいので足掛け7年?) propensity score modelに入れる変数の選択に関しては、随分"機械的"な方法が書いてあるらしく、星野先生自身もうちょっと各領域の専門知識による交絡因子の選択を重視したほうが(PSのむやみな乱用を防げるという意味で)望ましいのではないかと言っていたように思います。

この本はもうAmazonに予約枠あります。
http://www.amazon.co.jp/Causal-Inference-Statistics-Biomedical-Sciences/dp/0521885884/ref=sr_1_1?ie=UTF8&qid=1405857055&sr=8-1&keywords=rubin+imbens

上記のDraftの一部が下記にあります。(0のところを変えながらcURLか何かでダウンロード。24までとびとびであります)
http://www.ics.uci.edu/~sternh/courses/265/imbensrubin0.pdf


黒木先生は独特の自虐ネタがおもしろい先生で、graph theoryの基本のはなしをしていました。d-separation、backdoor path、collider stratificationなどのはなしで、疫学系の人間には目新しいはなしではなかったですが、この辺の話はPearlの流れであることを確認できたのはよかったです。ネタ的な話としてはPearlはRubinをリスペクトしているが、RubinはPearlを実質無視しているらしき様子でしたw。

Harvard School of Public Healthの因果推論は、何を言っているかわからない神Robinsと預言者Hernanの構成ですが、実質的にはRubin系とPearl系の両方の流れをくんでいる印象を受けました。Robinsは"Social scientists can't do much because they don't have data."とか危険な発言をする方で、Rubinとはお互いに仲が悪いのかお互いの業績を無視しあっています(ここ逆因果かも?)。ちなみに、Robinsは最近SWIGというRubin的potential outcome frameworkの概念と、Pearl的graph theoryを統合する試みをやっています。例によって引用文献にRubinは見られませんがw (http://www.statslab.cam.ac.uk/~rje42/uai13/Richardson.pdf)。

Inverse probability weighting重視がRobins学派の特徴で、最近わりと普通になってきたmarginal structural modelは一般的にRobinsが提唱したと考えられています。しかし、星野先生曰くRubinがすでに80年代propensity scoreのオリジナルの論文のあとにIPWについて言及していたことがあるらしいです。ちなみに、Hernan本のdraft(http://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/)を見るとIPWは1950年代のsurvey samplingの研究から着想を得たものとか書いてあっておもしろいですw。本祭りのあとは主にbioinformatics系の方と二次祭りに行ってたのしみました。

その週の土曜日は、"BUGS/stan勉強会 #3" (http://atnd.org/events/52769)がありました。R&統計本でも有名な、早稲田豊田秀樹先生(http://www.waseda.jp/sem-toyoda-lab/)がいらしていて発表をされていました。正規分布が良いのはfirst moment (mean)とsecond momemnt (standard deviation/variance)が独立して定義されるからであり、third moment (skewness)まで独立した分布を作れたらいろいろと捗る(かも)みたいなはなしでしたが、、私の稚拙な統計の理解ではあまりはなしについていけませんでした。BUGS/stan勉強会という名前でしたが、BUGSは誰も使っていなくて時代の流れはStanのようでした。ちなみに、Andrew Gelman(Rubinも共著者)のBayesian本も3版になってStanを例に使っています。

BUGS/stan会のあとはそのまま同じ会場でTokyo.Rでした。この会は渡米前に二回参加したことがあったので二年ぶり3度目の参加でした。せっかく参加するのでということで、CRANに登録しているtableone package (http://cran.r-project.org/web/packages/tableone/index.html)を作成した経験を踏まえて最近のRパッケージ作成の支援パッケージのはなしをする予定でした。しかし、emacs愛があまりに高まってしまいちょっとばかり(でなく)脱線してしまったかもしれませんw。

上記はtogetter参照。
http://togetter.com/li/691982

上記の発表スライド。一般的にはRStudioを使うとさらに便利かもしれません(その話は次回、他の方がしてくれる予定です)
http://www.slideshare.net/kaz_yos/r-devtools-roxygen2

ちなみに、参加者のなかにわりと低学年と思われる医学部の学生さんがいたようで、その歳ですでに脱線ぎみなのは将来に期待できると個人的には思いましたw。



今週末は、"第三回機械学習アルゴリズム実装会"というHackathon的なものに参加してきました。

第三回機械学習アルゴリズム実装会
http://mlhackathon.connpass.com/event/7115/?utm_campaign=&utm_source=notifications&utm_medium=email&utm_content=title_link

Tokyo.Rは比較的データ分析系の人のあつまりですが、こっちはどちらかというと、さらにsoftware engineerよりの人のあつまりだったようでした。Tokyo.Rぐらいの割と軽いノリ(わたしが思っているだけ?)を予想して行ったので、会場のガチな雰囲気に、とんでもないところに来てしまったと若干後悔しました。

今回のpresenterの方からお題のrandom forestアルゴリズムに付いて説明がありました。
http://www.slideshare.net/teppeibaba5/ss-37143977

そもそも、random forestについて、なんかensemble (複数のモデルを組合せる)というぐらいの知識しかなかったのですが、複数の決定木(decision trees)をデータにrandomな要素を加えながら、ensembleするのでrandom _forest_というのだということがわかりました。"randomな要素"というのは私が理解できた範囲では、データセットのなかからobservationをrandom sampleして少しずつことなるデータセットを作成する、また、変数のうちrandom subsetを用いてtreeを作成することをさすようでした。これにより少しずつことなる沢山のtreeが出来て、平均するとrandom forest modelが形成されるようです。


で、これを"解析してみる"のではなく、"実装してみる"のが会の主旨というわけでした。実装には"一本一本の木をはやす部分"と"それをensembleする部分"があるわけですが、Rでの実装例でも連続変数に対しての木の部分は複雑なので、できあいのmvpartパッケージを使っているようでした(https://github.com/watanabetanaka/randomForest/blob/master/rf.R)。

まったく無準備で来てしまったので、前半部分はあっさりあきらめ、後半部分だけ自分なりの方法で例示されたものを書きなおしてみるという方向で進めました。基本的に実装例とほぼ同じですが、ランダムデータセット作成をrandom subsetではなくbootstrap sample (observation数が小さくならない)と、選択肢に入れる変数の数を全変数からのrandom subsetになるようにしてみました。

関数と実行例のコード
https://github.com/kaz-yos/ML-hack3

稚拙ではあるもののなんとか時間内に完成して、実行してみることができたので、最初に実装の発表をさせていただきました。最初に例として使われていたirisデータセットは予測が比較的簡単で差がつかない様子だったので、RのrandomForestパッケージについていたimports85という車のスペックデータみたいなものを使って、スペックから車のメーカーを予測するというのをやってみました。データセットから2/3のtraining dataにして10本 or 100本の木をはやしてrandom forest、それぞれを10回ずつやって木の本数で、残り1/3のtest dataでの正答割合を見ました。木を増やすと70%程度から80%弱ぐらいまで多少正答割合が向上している印象でした。

f:id:kaz_yos:20140720220121p:image

私はそもそも木をはやすところは既存のパッケージを使ったというぬるい実装例だったのですが、その後発表されていた他のかたは極めて本気度が高い(というか前準備がすごい)ものばかりであっけにとられました。


Clojureでの実装例 (Tokyo.cljでおあいした方。私のくばったClojureステッカー貼ってくださってたw)
https://github.com/fanannan/randomforest/tree/master/src/randomforest
Juliaでの実装例 (bioinformaticsをやっている方とのこと)
https://github.com/bicycle1885/RandomForests.jl/tree/master/src

他の方はPython, Ruby, Cとかでやっていたようでした。C言語は私はさわったことがないのですが、親切なデータ構造みたいなものがなくて、データを保持するデータ構造から作成する必要があるらしく大変そうでしたw。懇親会では毎日メール配信を楽しみにしている"Gunosy"のco-founderの一人の方のおはなしが聞けておもしろかったです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kaz_yos/20140720/1405860974
Connection: close