こんばんは,@PKです.
これまでRandom ForestをKNIMEで行うためのノード紹介やパラメーターの最適化などを紹介してきました.
www.t-kahi.com
www.t-kahi.com
今回は〈後編〉ということで,これまで〈前編〉〈中編〉で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を以下に示します.
上図に示しているように,「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) #上下でグラフを表示
実行すると以下のような図を得ることができます.
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」でまとめた結果を以下に示します.
Accuracyは0.983となり,これまで説明した手法と変わらない結果となりました.
まとめ
三回に分けて,少し角度を変えながらKNIMEでRandom Forestを行う手法を紹介してきました.
今回はRで行いましたが,もちろんPythonのノードを使っても良いと思います.
RのcaretパッケージのRandom Forestの手法とKNIMEノードを使った手法を横並びで理解することで,KNIMEでできること,できないことを少しでも理解できればと思います.
最後にこの部分のWorkflow動画をご紹介します.