XGBoostの実装(R編)

# XGBoostとは
XGBoostとは，[DMLC](http://dmlc.ml/)によって開発されている[Gradient Tree Boosting](https://en.wikipedia.org/wiki/Gradient_boosting#Gradient_tree_boosting)を実行するライブラリです．
C++, R, python, JuliaそしてJavaのライブラリが公開されています．
XGBoostとは，**eX**treme **G**radient **Boosting**の略称です．

# Boosted trees
XGBoostでは，[Random Forest](https://www.stat.berkeley.edu/~breiman/randomforest2001.pdf)の学習アルゴリズムを利用して教師あり学習を行う，Boosted treesが実行できます．
至極単純に言うと，Gradient Boosting(重み付きアンサンブル学習)とRandom Forest(決定木のアンサンブル学習)を組み合わせたアルゴリズムです(そのまんま)．
理論については，[ドキュメント](https://xgboost.readthedocs.org/en/latest/model.html)にも書かれていますが，そのうち別記事で書く予定です．

# XGBoost for R
XGBoostのRパッケージについては，[CRAN](https://cran.r-project.org/web/packages/xgboost/index.html)から入手できます．
ビルドが不要なため，install.packageのコマンドから簡単に利用できます．

# 実装
## 各種パッケージの入手
```r
install.package("xgboost")
install.package(c("data.table","dplyr")) ## 入力データを変換するために必要
require(xgboost)
require(Matrix) ## dgCMatrixへ変換するために必要
require(data.table)
```
## 学習データの準備

今回はirisのデータセットを使用して，多クラス分類の学習，推定を行います．
操作は[e1071](https://cran.r-project.org/web/packages/e1071/index.html)パッケージのsvmなどを利用する時とほとんど同じなため，容易に実装できます．

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

```r
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に，ラベルを整数値に，それぞれ変換します．

```r
## 先頭行と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"*)を選択します．

```r
## 多クラス分類
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*とすることで，各ステップで作成されたツリーの詳細が確認できます．

```r
## 多クラス分類(ツリーの詳細)
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
```
その他，細かなパラメータ設定が可能で，チューニングも容易です．
各パラメータの詳細は，[こちら](https://github.com/dmlc/xgboost/blob/master/doc/parameter.md
)をご確認下さい．

## 推定結果
```r
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
```