Edited at

XGBoostの実装(R編)

More than 3 years have 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