XGBoostによる機械学習(R : caretパッケージを使ってみた)

P&Dアドベントカレンダー8日目！3回目の登場です！

今回は、XGBoostをcaretパッケージを用いて実装してみたいと思います。

前々回の記事はこちらです！
[XGBoostによる機械学習(Rを用いて実装)]
(https://qiita.com/drafts/ae91fde4a0fe3f3a48c2/edit)

前回の記事はこちらです！
[XGBoostパラメータのまとめとランダムサーチ実装]
(https://qiita.com/FJyusk56/items/0649f4362587261bd57a)

#caretパッケージ

前回の記事で機械学習の基本的な手順として

1. 使用する機械学習手法の決定
2. 実装方法と環境構築
3. **パラメータチューニング**
4. モデルを使っての予測
5. **予測結果の評価**

の５ステップがあると話しました。

そして手順3と5が機械学習において**鬼門**と言われる部分であるということもお話しました。

ですがご安心ください！

なんと今回用いる**caret**パッケージは以下のことができます！
・予測モデルの作成
・パラメータチューニング
・モデル予測

前回、前々回の記事と比較するとコードの量がものすごく簡潔になります！！

#実装


```R
install.packages("doParallel") #並列処理用パッケージ
install.packages("caret") #caret用パッケージ

library(data.table) #data.frame型だけで良い
library(doParallel)
library(caret)


#並列処理、使用するコア数4(使用できるコア数を知りたい場合は「detectCores()」を実行すればわかる)
cl <- makePSOCKcluster(4)
registerDoParallel(cl)


#奇数を学習データ、偶数を評価データとする
odd.number <- 2*(1:75)-1 #1~150の奇数のみ
model.data <- iris[odd.number,] #irisデータの奇数番目
pre.data <- iris[-odd.number,] #irisデータの偶数番目


##caretパッケージ使用
#caretパッケージのtrain()関数を用いてモデルを作成
set.seed(0)
result <- train(
  Species ~ .,                              #formula:目的変数と説明変数の指定          
  data = model.data,                        #トレーニングデータ
  method = "xgbTree",                       #使う手法:XGBoostのgbtree(ツリーモデル)
  preProcess = c('center', 'scale'),        #データの前処理:正規化
  trControl = trainControl(method = "cv"),  #クロスバリデーション
  tuneLength = 4                            #パラメータチューニングの範囲
)

#caretパッケージのpredict関数を用いて予測
pred <- predict(result, pre.data)

#結果を表示
print(table(pre.data[,5],pred))


#予測結果
>
            pred
             setosa versicolor virginica
  setosa         25          0         0
  versicolor      0         23         2
  virginica       0          1        24
```

複雑なデータの前処理を行わずして実装することができました！！


###簡単なcaretパッケージのtrain関数の引数の説明

####・formula
目的変数と説明変数の指定を行うことができます。

今回は目的変数をirisの「Species」、残り全てを説明変数として学習したので
　**Species ~ .**　となります。

もし説明変数を指定するのであれば、
　**Species ~ Sepal.Length + Sepal.Width**　のようにすれば可能です。
 

####・data
トレーニング用データを指定します。
今回の場合だと、**data = model.data**　のように指定します。
 

####・method
機械学習の手法を指定することができます。
今回はXGBoostのgbtree(ツリーモデル)を使用するので
　**method = "xgbTree"**　となります。

XGBoostのgblinear(線形モデル)を使用したい場合は
　**method = "xgbLinear"**　となります。

XGBoostの他にもニューラルネットワークなら「nnet」など様々な手法を指定できるので以下のページを参考にしてみてください。
[caretパッケージで指定できるmethod一覧]
(http://topepo.github.io/caret/train-models-by-tag.html)
 

####・preProcess
データを正規化したい場合、以下の様に指定すれば正規化が可能です。
　**preProcess = c(‘center’, ‘scale’)**


####・tuneLength または tuneGrid
ここでは、パラメータチューニングの範囲を指定できます。
　**tuneLength = 4**　と指定すれば4通りのパラメータを適用するという意味になります。
　数値次第では、実行時間が長くなるので注意です。

tuneGridを用いればパラメータ範囲をもっと細かく指定することが可能です。

例　tuneGrid = expand.grid( eta = c(0, 0.5, 0.05 ) )
この場合だと、パラメータetaを0から0.5まで0.05ずつ変更するという意味になります。

細かく指定できるパラメータも以下のページに記載されています。
[caretパッケージで指定できるmethod一覧]
(http://topepo.github.io/caret/train-models-by-tag.html)

####・trControl
その他様々な指定をすることができます。
今回はクロスバリデーションを使用する場合のみを紹介しています。
　**trControl = trainControl(method = "cv")**

#まとめ
パラメータチューニングやデータの前処理が難しいと思ったら迷わず**caret**パッケージを利用しましょう！
XGBoostパッケージを使うことで確かに様々なパッケージのチューニングを試すことが可能ではありますが、断然**caret**パッケージの方が楽です。
もっと勉強しようと思います。


今回はこの2つの記事を参考にさせていただきました。(ほとんどこの記事と同じ内容です・・・)
[Rによる機械学習：caretパッケージの使い方](https://logics-of-blue.com/r%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%EF%BC%9Acaret%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
[機械学習アルゴリズム〜XGBoost〜](http://rtokei.tech/machine-learning/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%9Cxgboost%E3%80%9C/)