R
MachineLearning
xgboost
randomForest
gradientTreeBoosting
More than 1 year has passed since last update.

XGBoostとは

XGBoostとは,DMLCによって開発されているGradient Tree Boostingを実行するライブラリです.
C++, R, python, JuliaそしてJavaのライブラリが公開されています.
XGBoostとは,eXtreme Gradient Boostingの略称です.

Boosted trees

XGBoostでは,Random Forestの学習アルゴリズムを利用して教師あり学習を行う,Boosted treesが実行できます.
至極単純に言うと,Gradient Boosting(重み付きアンサンブル学習)とRandom Forest(決定木のアンサンブル学習)を組み合わせたアルゴリズムです(そのまんま).
理論については,ドキュメントにも書かれていますが,そのうち別記事で書く予定です.

XGBoost for R

XGBoostのRパッケージについては,CRANから入手できます.
ビルドが不要なため,install.packageのコマンドから簡単に利用できます.

実装

各種パッケージの入手

install.package("xgboost")
install.package(c("data.table","dplyr")) ## 入力データを変換するために必要
require(xgboost)
require(Matrix) ## dgCMatrixへ変換するために必要
require(data.table)

学習データの準備

今回はirisのデータセットを使用して,多クラス分類の学習,推定を行います.
操作はe1071パッケージのsvmなどを利用する時とほとんど同じなため,容易に実装できます.

入力データですが,一度data.table形式に変換し,更にdgCMatrix形式へ再変換する必要があります.
まず,irisの元データをdata.table形式に変換し,ラベルとなるSpeciesラベルをテーブルから除去します.

data(iris)

## irisの元データをdata.table形式に変換
df<-data.table(iris,keep.rownames=F)

## (変換前)
head(df)

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
 1:          5.1         3.5          1.4         0.2  setosa
 2:          4.9         3.0          1.4         0.2  setosa
 3:          4.7         3.2          1.3         0.2  setosa
 4:          4.6         3.1          1.5         0.2  setosa
 5:          5.0         3.6          1.4         0.2  setosa
 6:          5.4         3.9          1.7         0.4  setosa

## Speciesラベルのデータを除去
df[,Species:=NULL]

## (変換後)
head(df)

   Sepal.Length Sepal.Width Petal.Length Petal.Width
1:          5.1         3.5          1.4         0.2
2:          4.9         3.0          1.4         0.2
3:          4.7         3.2          1.3         0.2
4:          4.6         3.1          1.5         0.2
5:          5.0         3.6          1.4         0.2
6:          5.4         3.9          1.7         0.4

data.tableからdgCMatrixに,ラベルを整数値に,それぞれ変換します.

## 先頭行とSpeciesラベルのデータを除いてdgCMatrix形式に変換
sparse_matrix<-sparse.model.matrix(Species~.-1,data=df)
## 3つのラベルを整数値に変換(0,1,2)
output_vector=as.integer(as.factor(iris$Species))-1

学習

xgboostで学習を行います.
irisは3クラスあるので,多クラス分類(objective="multi:softmax")を選択します.

## 多クラス分類
bst <- xgboost(data = sparse_matrix, label = output_vector, max.depth = 4, eta = 1, nthread = 2, nround = 5, num_class=3, objective = "multi:softmax", verbose = 1)

[0] train-merror:0.020000
[1] train-merror:0.013333
[2] train-merror:0.006667
[3] train-merror:0.006667
[4] train-merror:0.000000

verbose > 1とすることで,各ステップで作成されたツリーの詳細が確認できます.

## 多クラス分類(ツリーの詳細)
bst <- xgboost(data = sparse_matrix, label = output_vector, max.depth = 4, eta = 1, nthread = 2, nround = 5, num_class=3, objective = "multi:softmax", verbose = 2)

tree prunning end, 1 roots, 2 extra nodes, 0 pruned nodes ,max_depth=1
tree prunning end, 1 roots, 12 extra nodes, 0 pruned nodes ,max_depth=4
tree prunning end, 1 roots, 4 extra nodes, 0 pruned nodes ,max_depth=2
[0] train-merror:0.020000
tree prunning end, 1 roots, 2 extra nodes, 0 pruned nodes ,max_depth=1
tree prunning end, 1 roots, 10 extra nodes, 0 pruned nodes ,max_depth=4
tree prunning end, 1 roots, 8 extra nodes, 0 pruned nodes ,max_depth=3
[1] train-merror:0.013333
tree prunning end, 1 roots, 2 extra nodes, 0 pruned nodes ,max_depth=1
tree prunning end, 1 roots, 10 extra nodes, 0 pruned nodes ,max_depth=4
tree prunning end, 1 roots, 8 extra nodes, 0 pruned nodes ,max_depth=3
[2] train-merror:0.006667
tree prunning end, 1 roots, 2 extra nodes, 0 pruned nodes ,max_depth=1
tree prunning end, 1 roots, 8 extra nodes, 0 pruned nodes ,max_depth=4
tree prunning end, 1 roots, 10 extra nodes, 0 pruned nodes ,max_depth=3
[3] train-merror:0.006667
tree prunning end, 1 roots, 2 extra nodes, 0 pruned nodes ,max_depth=1
tree prunning end, 1 roots, 6 extra nodes, 0 pruned nodes ,max_depth=3
tree prunning end, 1 roots, 6 extra nodes, 0 pruned nodes ,max_depth=2
[4] train-merror:0.000000

その他,細かなパラメータ設定が可能で,チューニングも容易です.
各パラメータの詳細は,こちらをご確認下さい.

推定結果

prds<-predict(bst,sparse_matrix) ## 推定するデータは教師データと同じ
table(prds,iris$Species)

prds setosa versicolor virginica
   0     50          0         0
   1      0         50         0
   2      0          0        50