Gradient Boosting Decision Treeでの特徴選択 in R

Gradient Boosting Decision Tree(GBDT)を勉強したので、その概要とRでのパッケージの簡単な使い方を乗っけておきます。

 

314

 

1. そもそもGBDTってなんだよっていう話。

単純に言えば、複数の決定木を作成して、集団で学習させる方法の事です。

1本決定木を作り、上手くモデルで説明が出来なかったobservationに対して重みを付け、重みのついた状態で次の木を作り、また重みを付けて・・・

というステップを指定した本数分だけ繰り返します。

誤差に対して学習しなおしてくれるので、決定木よりもっと良いモデルが出来上がります。

理論の詳細はこちらの本を参考にしていただければと。

英語版は著者サイトで無料公開されています。英語大丈夫な人はこちらを参照するとよいかと。

http://statweb.stanford.edu/~tibs/ElemStatLearn/

あとこのイケメンの説明もわかりやすかったです。イケメン好きで英語大丈夫ならいいかと。

https://www.youtube.com/watch?v=IXZKgIsZRm0

 

2. GBDTで特徴量抽出

最近知ったのですが、KaggleではGBDTが多用されているようです。

10 R Packages to Win Kaggle Competitionsというスライドでも一番最初に出てくるくらいです。

[slideshare id=36610234&doc=final10r-xc-140703174637-phpapp02]

Criteoのコンペで優勝したチームはこのGBDTを特徴量の抽出(生成)に利用し、GBDTの結果から得た特徴量をFactorization Machine(SVMみたいなやつ。よくわかってないっす。)に入れています。

データをGBDTに投入すると、すべてのobservationに対して、M本ある決定木の一本一本でどの葉に属しているかを出すことが出来ます。これを行うと、すべてのobservationがM個のカテゴリ変数を持つことになります。

gdbt

 

ここでキーとなることは、これらの新しいカテゴリ変数は、GBDTに投入した変数の交互作用を加味した情報を持っているという事です。

自分のおかれている状況からどんなデータセットを作るか?というところに関してはまだドメイン知識を必要としていますが、すでにあるデータセットのどんなデータをどこまで組み合わせるか?という点においてはGDBTはかなり分析者の助けになるのではないかなと思います。

 

 3.RでGBDT

さて、じゃぁこれをやりたい!という話になるわけですが。やっぱりRで出来ちゃうわけです。ありがたや。

元々gbmというパッケージが有名らしいのですが、なかなか遅いらしく、reference内でgbmの10倍速いぜと宣言しているxgboostパッケージを使います。

データはkaggleの別のCTR prediction contestをやっているAvazuのtrain.csvを使います。

https://www.kaggle.com/c/avazu-ctr-prediction/data

コードはこんな感じです。何も考えずにデータを突っ込むことだけに集中すると結構あっさりですね。

library(data.table)
library(dplyr)
library(xgboost)
library(Matrix)
data <- fread(“data/train.csv”,stringsAsFactors=TRUE,nrows = 2000000)
testdata <- data[1:1000000,]
model <- sparse.model.matrix(click ~ .,testdata)
gbdt.model <- xgb.DMatrix(model, label = testdata$click)
gdbt.result <- xgboost(data = gbdt.model, booster = “gbtree”, nrounds = 10)
predleaf <- predict(gdbt.result,gbdt.model, predleaf = T)

 

xgb.DMatrixという形式でしか読んでくれないので、読み込んだデータをsparse.model.matrixにしてからxgb.DMatrixに変換しています。

ここはもっとスムーズな方法がありそうです。

xgboostがgbdtの関数で、nroundsで木の数を決定し、max.depthで木の深さを決定します。この二つが基本的なチューニングするパラメータのようです。

並列化のオプションもあるので、忘れずに付けましょう。(ここでは忘れてましたが)
※訂正:referenceには勝手に並列化するよって書いてありました

ある観測値がどの木でどの葉に属していたか?が重要なので、predictでは葉の番号を出してもらうためにpredleaf = Tにしています。(この機能は2015年1月の段階ではCRANで配っているバージョンにはまだ付いていないので、必ずgithubからインストールしないといけません。)

 

これでR使ってkaggleに殴り込みに行けますね。

何か不備があったら教えてください。

カテゴリー: R   パーマリンク


Gradient Boosting Decision Treeでの特徴選択 in R への3件のコメント

  1. ピンバック: Japan.Rに参加して得た情報 | かものはしの分析ブログ

  2. ピンバック: 機械学習で広告の効果を推定したいお話。 | 分析のおはなし。

  3. ピンバック: Kaggleゼミ成果報告(Rossmann編) | Tech Blog

コメントを残す