t_kahi’s blog

KNIMEやCellProfiler、創薬に関する記事と,日々のメモです

【KNIME】〈後編〉KNIMEでRandom Forest:Rのcaretパッケージを使ってRandom Forest

こんばんは,@PKです.

これまでRandom ForestをKNIMEで行うためのノード紹介やパラメーターの最適化などを紹介してきました.
www.t-kahi.com
www.t-kahi.com

f:id:t_kahi:20190714133502p:plain

今回は〈後編〉ということで,これまで〈前編〉〈中編〉でKNIMEの専用ノードで行った処理を,Rのcaretパッケージを使って同様に実行していきます.

Rのcaretパッケージについて

The caret package (short for Classification And REgression Training) is a set of functions that attempt to streamline the process for creating predictive models.
The caret Package

caretパッケージは,様々な機械学習の手法,前処理,バリデーション手法,特徴量選択などが一つになったもので,caretだけで様々な機械学習を行うことができます.

caretパッケージの使い方については多くの方がわかりやすくまとめてくださっています.
caretパッケージを使った解析の一連の流れ - Qiita
Rで判別分析いろいろ(caretパッケージで自動チューニング 8種類) - Qiita
機械学習アルゴリズム〜caretパッケージの和訳〜
Rによる機械学習:caretパッケージの使い方 | Logics of Blue

このcaretを使うと,〈前編〉〈中編〉で紹介したWorkflowをさらに簡単にまとめることができます.
おそらくRandom Forestを行う方は,KNIMEを使っている方よりもRやPythonを使用している方のほうが多いと思います.
KNIMEだけでも完結するのですが,他の言語ではどのように解析しているかを知ることは重要かと思いますので,RでRandom Forestを同じように行う場合についてKNIME Workflowを絡めながら少し紹介したいと思います.

Workflowについて

Rノードを使用したWorkflowを以下に示します.
f:id:t_kahi:20190715233358p:plain
上図に示しているように,「R Learner」でcaretパッケージによる学習データの読み込み,交差検証,パラメーター最適化,モデル構築まで行います.
得られたモデルがどのようなものかを「R Views」で表示します.
結果に問題が無ければ,「R Predictor」でテストデータを実行し,その結果を「Scorer」で確認します.

「R Learner」について

「R Learner」ではcaretパッケージを読み込んで(事前にインストールしました),下記のスクリプトを実行しました.
この辺は冒頭で紹介したcaretに関するブログにすべて記載があるので,そちらのほうが詳しく説明があります.

#R Learner
library(caret)  #各種パッケージの呼び出し
library(rlang)
library(e1071)
library(doParallel)

cl <- makePSOCKcluster(4) #並列演算で訓練
registerDoParallel(cl)

data <- knime.in #学習データ読み込み 
set.seed(0) #乱数設定
irisRF <- train(  
  Species ~.,  #判別するカラムを選択
  data = data, 
  method = "rf", #Random Forestのメソッドを選択
  tuneGrid = expand.grid(mtry=1:8),  #パラメーター最適化
  trControl = trainControl(method = "cv") #交差検証(defaultが10-fold CV)
)

knime.model <-irisRF

irisRF

後は実行するとモデルが作成されます.
"irisRF"を実行して学習モデルの結果をConsoleで確認した結果を示します.

Random Forest 

90 samples
 4 predictor
 3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 81, 81, 81, 81, 81, 81, ... 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
  1     0.9555556  0.9333333
  2     0.9444444  0.9166667
  3     0.9555556  0.9333333
  4     0.9666667  0.9500000
  5     0.9666667  0.9500000
  6     0.9666667  0.9500000
  7     0.9666667  0.9500000
  8     0.9666667  0.9500000

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 4.

ちなみに,caretパッケージにはいくつかRandom Forestの手法がありますが,今回は"rf"を使用しています.
"rf"で動かせるパラメーターはmtryということがわかります.

Random Forest
method = 'rf'
Type: Classification, Regression
Tuning parameters:
mtry (#Randomly Selected Predictors) Required packages: randomForest A model-specific variable importance metric is available.
7 train Models By Tag | The caret Package

実行結果からmtry = 4と,最適なパラメーターを得ることができました.

「R VIews」

先ほど出力した結果をグラフで可視化します.
「R VIews」のスクリプトは以下の通りです.

#R Views
library(ggplot2)
library(gridExtra)
library(data.table)

model <- knime.model #モデルの読み込み

model_plot <- ggplot(model) #各パラメーターの精度のグラフを作成

model_var <- varImp(model,scale = FALSE ) 
model_var <- data.frame(model_var$importance)
setDT(model_var, keep.rownames = "Species")

model_var_plot <- ggplot(model_var, aes(x= reorder(Species, -Overall) , y=Overall)) +
geom_bar(stat = "identity") #属性重要度の棒グラフを作成

grid.arrange(model_plot, model_var_plot, nrow = 2) #上下でグラフを表示

実行すると以下のような図を得ることができます.
f:id:t_kahi:20190715235438p:plain

mtryを1~8へと変えたときに,mtry=4以降はAccuracyが頭打ちになっていることから,4が最適であることがわかります.
また,重要な属性としては"Petal.Width","Petal.Length"であることがわかります.

「R Predictor」&「Scorer」

作成したモデルを使って「R Predictor」でテストデータの予測を行います.

# R Predictor
predIrisRF <- predict(knime.model,knime.in)
predIrisRF
knime.out <- cbind(knime.in, predIrisRF)

得られた結果を「Scorer」でまとめた結果を以下に示します.
f:id:t_kahi:20190715235701p:plain
Accuracyは0.983となり,これまで説明した手法と変わらない結果となりました.

まとめ

三回に分けて,少し角度を変えながらKNIMEでRandom Forestを行う手法を紹介してきました.
今回はRで行いましたが,もちろんPythonのノードを使っても良いと思います.
RのcaretパッケージのRandom Forestの手法とKNIMEノードを使った手法を横並びで理解することで,KNIMEでできること,できないことを少しでも理解できればと思います.

最後にこの部分のWorkflow動画をご紹介します.

youtu.be