« 読了:「日本海軍はなぜ過ったか」「吉原はこんな所でございました」 | メイン | 読了:Ljungqvist, et al.(2015) 重度の精神疾患患者に毎月お金を渡したら? »
2016年1月 4日 (月)
Chen, T., & He, T. (2015) Higgs Boson Discovery with Boosted Trees. JMLR: Workshop and Conference Proceedings, 42, 69-80.
えーと、なんでも、Kaggleっていう予測モデリングのコンペティションがあるそうなんです。世界中の頭の良い人たちが寄ってたかって同じデータを分析して予測モデルを構築し、賞金と名誉を目指して優劣を競うのだそうです。わたしゃよく知りませんけど。弊社インターンの超優秀な青年は「オノさんKaggleとか出ないんですか...? ああそうですか...」と落胆しておられたが、そんなもん出るわけないじゃん、こちとら人文系の出自で、地を這う虫のような仕事してるのに。
Kaggleではいつも複数のコンペティションを開催しているけど、参加チームが多いコンペもあれば少ないコンペもあって、あの差はどうやって生まれているのだろう、賞金額で決まるわけでもないらしいし、よくわからない。一昨年話題になっていたのはHiggs Boson Machine Learning Challengeというコンペで、参加チーム数1785、かなりの人気コンペであった。
機械学習の分野は流行りすたりが早すぎて訳がわからないが、しばらく前から有名であるらしいライブラリにxgboostというのがあって、Kaggleのようなコンペでもよく使われているらしい。この論文はxgboostの開発チームが自ら語るHiggs Bosonコンペ戦記。調べたところ、彼ら自身も45位にランクインした模様。
そもそもHiggs Bosonというのはなんなのか、それさえも私にはさっぱりわからないが、wikipediaによると、素粒子?の名前?なんだそうです。素粒子ってなんだ? 高校で物理とか習っていれば出てきたのかしらん。原子とか物理学とか、そういった感じのなにかなのでしょうね。名前からして、なんかこうすごく小さな?粒?とか?そういう感じのものなのではないかと思う。でなければ、そうでないなにかであろう。
ま、事情はともあれ、死ぬほど巨大なデータのなかに、稀にHiggs Bosonなるもののシグナルが含まれている、でもノイズは大きいし、どういうときに出てくるかは複雑すぎてわからない。この際理屈はどうでもいいから、とにかく特徴ベクトルでシグナル有無を予測する二値分類器をつくれ。というお題だと思えばいいらしい。
まずは著者ら謹製、xgboostのご説明から。
以下、特徴ベクトルを$x_i$, 対応するラベルを$y_i$とする。予測スコアを
$\hat{y}_i = \phi(x_i) = \sum_{k=1}^K f_k (x_i), \ \ f_k \in F$
とする。$f_k$とはなんらかの関数で、話の先取りになるけど、 ここでは回帰木である。
目的関数を次のように定義する:
$L(\phi) = \sum_i l (\hat{y}_i, y_i) + \sum_k \Omega (f_k)$
第一項は予測と目標のずれである。$l$は微分可能な凸関数だとみなす。第二項は正則化項で、$\Omega$でモデルの複雑さを測っている。
さて、この目的関数を直接最適化するのではなく、$f_1, f_2, \ldots, f_t, \ldots$を順につくって協調させる。$f_t$はそのiterationにおいて目的関数を最適化するような関数である。$t$回目のiterationにおけるケース$i$の予測を$\hat{y}^{(t)}_i$としよう。この時点における目的関数は
$L^{(t)} = \sum_i^n l(y_i, \hat{y}^{t-1}_i + f_t(x_i)) + \sum_i^t \Omega(f_i)$
ポイントは、明示的に正則化項を入れている、という点。
具体的には...入力変数空間を$T$個の領域にわける。このマッピングを$q$と呼ぼう。領域に与えるスコアのベクトルを$w$とする。で、
$f_t (x) = w_{q(x)}$
とする。この関数のクラスに含まれるものとしては回帰木があるが、別に回帰木でなくてもよい。
正則化項の関数は
$\Omega(f_t) = \gamma T + (1/2) \lambda \sum_j^T w^2_j$
とする。[ああそうか、領域数つまり葉っぱの枚数と、スコア二乗和つまり葉っぱごとの予測値の二乗和に、ペナルティを与えてるのか...]
[以下、目的関数をさらに書き直して、あるitarationで追加する木を具体的にどうやって作るか、欠損値があったらどうするか、というアルゴリズムにまで話を持っていくんだけど、そういうこみ入った話にはあんまり関心ないので省略。木を伸ばすのは要するにgreedy searchであるらしい]
... というのが、著者らが開発しているxgboostである。ここからはコンペの話。
特徴量をいろいろ工夫して...[物理学の知識がないとわからない箇所。パス]
元のデータではシグナルの数が少なすぎるので、物理学の知識に基づくシミュレーションで学習データと検証データをつくって...[パス]
木の最大の深さは6, シュリンケージ・パラメータは0.1, 木の本数は120にして、xgboost, Rのgbm, pythonのsklernを比較。このコンペでは、精度はAMS(approximate median significance)というヘンな指標で測ることになっているので[説明省略]、ここでもAMSで比較する。結果、xgboostの勝ち。パラメータをファイン・チューンしたらともっと勝てた[←そこのコツのようなものが聞きたいんですけどね...]。ちなみにスピードも圧勝。
なお、上で「パラメータのファイン・チューン」といっているのは、主に正則化パラメータ$\gamma$と$\lambda$のことのようで、いくつかのパターンについてAUCを示しているのだけれど、なるほど、全然違ってくる。コンペでは$\gamma=0.1, \lambda=0$にした由。
... 正直、機械学習の難しい話はよくわかんないし、数年待てばもっと素人フレンドリーになるような気がして勉強する気力が沸かないんだけど、ともあれ、勉強になりました... なったような気がします。
仕事の都合上、xgboostの実装上のパラメータ名をメモしておくと、おそらく、木の最大深さとはmax_depth(デフォルト6)、シュリンケージ・パラメータとはeta(デフォルト0.3)、$\gamma$とはgamma(デフォルト0)、$\lambda$とはL2正則化パラメータ lambda(デフォルト1)であろう。ほかにL1正則化パラメータalphaというのもあるんだけど(デフォルト0)、この論文には出てこなかった。
話の本筋からは離れちゃうけど、配られているデータで学習するんじゃなくて、いったんシミュレーションで架空データをつくって学習しているのね。機械学習のコンペとはいえ、やっぱり領域知識(ここでは素粒子物理学の知識)が生きてくるわけだ。このへんはマーケティング・データでも事情は同じで、面白いところでもあり、辛いところでもある。
論文:データ解析(2015-) - 読了:Chen & He (2015) xgboostかく戦えり