t_kahi’s blog

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

【KNIME】〈前編〉KNIMEでRandom Forest:「Random Forest」ノードを使ったWorkflowの紹介

こんばんは,@PKです.

以前,ブログで「Bootstrap」と「Decision Tree」についてそれぞれ紹介しました.
www.t-kahi.com
www.t-kahi.com

このBootstrap SamplingとDecision Treeを組み合わせた機械学習の手法が「Random Forest」です.
今日は機械学習の手法である「Random Forest」をKNIME Workflowを使って紹介したいと思います.

Random Forestノードの単純な使い方に加えて,パラメータ設定や交差検証の手法を絡めたり,Rノードを使ったWorkflowを3回に分けて紹介したいと思います.

Random Forestについて

ランダムフォレスト(英: random forest, randomized trees)は、2001年に Leo Breiman によって提案された[1]機械学習アルゴリズムであり、分類、回帰、クラスタリングに用いられる。決定木を弱学習器とする集団学習アルゴリズムであり、この名称は、ランダムサンプリングされたトレーニングデータによって学習した多数の決定木を使用することによる。ランダムフォレストをさらに多層にしたアルゴリズムにディープ・フォレスト (機械学習)がある。対象によっては、同じく集団学習を用いるブースティングよりも有効とされる。
ランダムフォレスト - Wikipedia

Random Forestの説明はわかりやすい記事がたくさんあります.
ランダムフォレストの概要を大雑把に解説 - 具体例で学ぶ数学
決定木とランダムフォレスト - Qiita
この記事ではKNIMEでRandom Forestを行う際の設定や,バリデーションの手法などについて紹介できればと思います.

KNIME Workflowの概要

今回紹介するKNIME Workflowの全体図を以下に示します f:id:t_kahi:20190714133502p:plain

いつも通り使用するデータはIrisです.「Partitioning」でサンプルを学習:60%,テスト:40%に分けて,Random Forestを実行していきます.
Workflowは目的によって主に3つ分かれています.

前編:「Random Forest」ノードを使ったWorkflowについて
中編:「Parameter Optimization」と「Cross Validation」の実行
後編:Caretパッケージを使ってRノードでRandom Forest

前編(真ん中のWorkflow)はKNIMEの「Random Forest」ノードを使って学習とテストを行います.
中編では,「Random Forest」のパラメータを「Parameter Optimization」で変化させ,交差検証でより良いパラメータを探す手法を紹介します.
最後に後編で「R Learner/Predictor」を使ってRの汎用機械学習パッケージであるcaretを使ったRandom Forestを紹介します.

「Random Forest」ノードを使ったWorkflowの紹介

本題の「Random Forest」ノードのWorkflowについてです.
f:id:t_kahi:20190714140944p:plain

Random Forestは以下にお示しするKNIMEの「Random Forest Learner」と「Random Forest Predictor」を組み合わせて使用します.
nodepit.com
nodepit.com

それぞれのノードの使い方について紹介していきます.

「Random Forest Learner」について

まず「Random Forest Learner」で学習データを使ってモデルを構築します.
設定画面を以下の通りです.
f:id:t_kahi:20190714142513p:plain

上図の青矢印で示した部分の設定について,以下に簡単な説明を示します.

  • Target Column
    • 学習するターゲットのカラムを設定する(今回は"Species")
  • Use Column Attributes
    • モデルの学習に使用する特徴量
  • Split Collection
  • Limit number of levels (tree depth)
    • ツリーの深さの制限(細かすぎると過学習になるかも)
  • Number of models
    • 学習するDecision Treeの数

"Split Collection"はGini Indexで行いました.
また,"Limit number of levels (tree depth)"は今回"3"で設定してありますが,これは〈中編〉でパラメーターをいろいろ変えて一番精度が良かったのでこの数字を設定しました.詳細は後ほど…
"Number of models"はある程度学習する数が多ければ安定すると思うので500で設定しました.
また,実行のたびにランダムな結果がでるといやなので,random seedを設定しておきました.

「Random Forest Learner」を実行して右クリックすると以下の画面が出てきます.
f:id:t_kahi:20190714160756p:plain

Tree Viewsでは,今回行った500の決定木の結果を見ることができます. 詳細は動画でご紹介したいと思います.
また,"out-of-bag error estimates"ではleave-one-out交差検証を行った結果が示されています.
続いて,"Attribute Statistics"では属性の統計値を得ることができるので,ここからどの属性がより分類に重要か(属性重要度)を算出することができます.
最後に"Random Forest Model"で作成したモデルの出力を行います.

属性重要度の可視化について

続いて属性重要度の可視化です.
Random Forestなどで,実際にどの属性が分類に重要なのかは必要な情報だと思います.
下記KNIME Forumを参考にして,属性重要度を算出しました.
How to get the variable importance from the Random Forest model? - KNIME Analytics Platform - KNIME Community Forum

f:id:t_kahi:20190714164446p:plain 「Bar CHart」の結果を以下に表示します.
Petal.LengthとPetal.Widthが判別に重要だということがわかります.
f:id:t_kahi:20190714164627p:plain

「Random Forest Predictor」

「Random Forest Predictor」は先ほどのLearnerと比べるとシンプルな設定で,モデルのノードとテストデータを繋げて実行します.
得られた結果は以下のように,元データに予測カラムが追加された形で出力されます.
f:id:t_kahi:20190714165503p:plain

また,正しく判別できたかを確認するために,「Scorer」を用いて予測値の統計データを出力します.
上図のように,判別結果の混同行列から,それぞれの種の誤判別の結果と,統計値からAccuracyを求めることができます.

まとめ

今回はKNIMEでRandom Forestを行うWorkflowの紹介を行いました. 中編・後編ではパラネーター調整やRノードを使った処理について紹介したいと思います.

最後に今回のWorkflowの動画をお示しします.
youtu.be