« 読了:Ture et al. (2005) 高血圧患者をいろんな手法で予測してみた | メイン | 読了:「惑星スタコラ」「大砲とスタンプ」「中国嫁日記」「OL進化論」「あれよ星屑」 »
2015年12月28日 (月)
Elith, Leathwick, Hastie (2008) A working guide to boosted regression trees. Journal of Anomal Ecology, 77, 802-813.
タイトル通り、ブースティング回帰木(boosted regresion trees, BRT)の使い方についての素人向けガイド。ええと、良く知らないけど、Rでいうとgbmとか、流行りのxgboostとかのことですかね。正直なところ機械学習の話は、学校出たてのチェックのシャツを着たお兄さんたちに任せておきたいんだけど、仕事となるとそうも言っていられない。
動物生態学についてはなんの知識もございませんが、こういう分野向けの啓蒙的文章は助かる。イントロによると、生態学では種の分布を予測したりするときにGLMやGAMをよく使うけど、機械学習手法はあまり使わない、ましてやBRTなんて... という感じらしい。そりゃそうでしょうね、何やってんだかわかんなくて気持ち悪いもん。
まず、決定木について。
決定木は、予測子の空間を矩形に分割し、それぞれに定数をフィットさせる。矩形は反応変数において等質的であることを目指してつくる。定数といっているのは、分類器ならばクラスだし、回帰木ならば平均である。
決定木に人気があるのは、なんといってもそのわかりやすさ。さらに、予測子の型を選ばない、単調変換なら影響なし、はずれ値に強い、交互作用をモデル化している、といった美点がある。いっぽう、滑らかな関数の表現が苦手、訓練データのちょっとした違いで構造がかわっちゃう、という弱みもある。
ブースティングについて。
根底にあるのは、ラフな目安をたくさんつくって平均する、というアイデア。兄弟分であるバギング、stacking、モデル・アベレージングとちがうのは逐次的に進むという点。モデルを訓練データに適合させ、うまくいかなかったケースの重みを増して...というのを繰り返す。
もともとブースティングは2クラス分類に注目していたので(AdaBoostとか)、機械学習の分野でブースティングについて論じる際には、重みをどう変えるかという観点から論じる傾向がある。でもここでは回帰木に関心があるのでちょっと違った観点からとらえてみよう。要するに、ブースティングとは一種の関数的勾配降下(functional gradient descent)である。ここになんらかの損失関数があるとしよう(たとえばデビアンス)。ブースティングは損失関数を最小化させる最適化テクニックで、それぞれのステップで、損失関数の勾配を降りるような木を追加する。
具体的にBRTの場合について考えると、まず最初の回帰木は、与えられたサイズの木のなかで、損失関数をもっとも減少させるような木である。次の木は最初の木の残差に適合させる。当然ながら変数も分割も全然違う。二本の木による予測は、それぞれの予測に学習率をかけて合計して求める。三本目の木は二本の木の残差に適合させる。これを延々繰り返す。一旦作っちゃった木は直さない、というのがポイント。なお、反応変数の型はいろいろ扱える(損失関数を反応の型にあわせて選べば済む話だから)。
ユーザの観点からいうと、BRTの特徴は以下の通り。
- 確率的な要素を含んでいる。乱数のシード次第で結果が変わります。
- モデル適合の過程で、焦点が「予測しにくいケース」へと徐々に移動する。
- 重要なパラメータは二つ。(1)学習率(lr)。シュリンケージ・パラメータともいう。それぞれの木がモデルに貢献する程度。(2)木の複雑さ(tc)。1だと端末ノードは2個、つまり単純な加算となり、2だと2変数交互作用まで扱える。この2つのパラメータが決まれば、木の本数も決められる。
- 予測はストレートだが、モデルの解釈は大変。どの変数・交互作用が大事かとか、フィットした関数をどう視覚化するかとか、それなりのツールが必要。
後半はケース・スタディ。ニュージーランドにおけるAnguilla australisの分布を予測する(調べてみたところ、日本の魚市場ではオーストラリアうなぎと呼ばれている由)。各観測地点で捕獲されるかどうかを11個の予測子で予測する。ソフトはRのgbmパッケージ。内容はこんな感じ。
- 学習にはランダムネスを導入したほうがよい。gbmでいうbag fraction。二値反応だったら0.5から0.75にするのがおすすめ。[xgboostでいうsubsampleのことらしい。デフォルトで1になっている]
- 学習率(lr)について。学習率を下げて木の本数を多くするのがおすすめだが、適切な値は交差妥当化(CV)で決めること。すくなくとも1000本くらいまでは増やすのが目安。[学習率とはxgboostでいうetaのことであろう。デフォルトで0.3。論文の事例では学習率は0.005というすごい値になっている。xgboostのetaとは単位が違うのかも]
- 木の複雑さ(tc)について。tcとは理屈からいえば「何次の交互作用までモデル化したいか」なのだが、普通はそんなのわかんないので、やっぱりCVで決めるかしかない。サンプルサイズが小さいときには小さくしておいたほうがよい。また、tcを倍にしたらlrを半分にするとだいたい予測性能は同じになる(木の本数が同じなら)。というわけで、サンプルサイズが十分あるなら、tcを高くしてlrを思い切り低くするのがよいけど、すると木の本数が増え計算時間がかかるわけで... 云々。[tcとはxgboostでいうmax_depthのことかな? デフォルトでは6になっている]
- CVの戦略について。木の本数を決める際のおすすめは以下の手順。(1)データを(たとえば)10個に分割する。(2)10個中9個を学習セット、残りを検証セットとする。これを1ペアとすると、全部で10ペアできるわけだ。(3)木の本数を適当に決めて(たとえば50本)、学習セットでモデルを作り、検証セットで性能を測る。10ペアを通じて、性能の平均と標準誤差を求める。(4)木の本数を徐々に増やしながら(3)を繰り返す。(5)木の本数が10水準目になったら結果比較をスタートする。6水準前から10水準前までの性能の平均を、現在の水準から5水準前までの性能の平均と比較する。後者が大きくなったら、最小値を通りすぎたと考えて繰り返しをストップする。(6)最小値を探す。こうして木の本数が決まる。
- 変数選択について。ブースティング木とはいえ、特にサンプルサイズが小さいときは、あらかじめ変数を削ることに意味がある。やりかたは付録を見よ。[ちゃんと読んでないけど、どうやら重要度が低いのを削って再推定ということらしい]
- モデルの解釈。まず、木に変数を使った回数に基づいて変数の相対的重要度を求めるやり方があって、gbmパッケージに載っている[xgboostにも載ってますね]。また、各変数についてpartial dependence plotを描くのがよろしい。交互作用については3次元のpartial dependence plotを描きなさい。
- なぜBRTで曲線的な関数にフィットできるのか、簡単な事例で説明。
そんなこんなで、付録に詳細なチュートリアルをつけたから読みなさい、とのこと[すいません、読んでないです]。
...というわけで、あんまりきちんと読んでないけど、勉強になりましたです。
xgboostなどを使っていると、ついつい細かいことを考えて混乱しちゃうわけだけど、割り切って考えちゃえばブースティングなんて最適化のテクニックに過ぎないわけで、シュリンケージ・パラメータ(eta)なんかについてあれこれ悩んでいるのはある意味で不毛というか、なんというか... いずれはパラメータを勝手にうまいこと決めてくれるようなソフトも出てくるんじゃないかと思う。
論文:データ解析(2015-) - 読了:Elith, Leathwick, Hastie (2008) ブースティング回帰木ユーザーズ・ガイド