P&Dアドベントカレンダー8日目!3回目の登場です!
今回は、XGBoostをcaretパッケージを用いて実装してみたいと思います。
前々回の記事はこちらです!
[XGBoostによる機械学習(Rを用いて実装)]
(https://qiita.com/drafts/ae91fde4a0fe3f3a48c2/edit)
前回の記事はこちらです!
[XGBoostパラメータのまとめとランダムサーチ実装]
(https://qiita.com/FJyusk56/items/0649f4362587261bd57a)
#caretパッケージ
前回の記事で機械学習の基本的な手順として
- 使用する機械学習手法の決定
- 実装方法と環境構築
- パラメータチューニング
- モデルを使っての予測
- 予測結果の評価
の5ステップがあると話しました。
そして手順3と5が機械学習において鬼門と言われる部分であるということもお話しました。
ですがご安心ください!
なんと今回用いるcaretパッケージは以下のことができます!
・予測モデルの作成
・パラメータチューニング
・モデル予測
前回、前々回の記事と比較するとコードの量がものすごく簡潔になります!!
#実装
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パッケージの使い方
機械学習アルゴリズム〜XGBoost〜