t_kahi’s blog

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

【KNIME】〈後編〉Support Vector Machine (SVM) のKNIME Workflowについて:RとPythonノードの実行

こんばんは,@PKです.

前回の記事では,Support Vector Machine (SVM) のKNIME Workflowについて紹介しました.
www.t-kahi.com

今回はSVMのKNIME WorkflowをRやPythonのノードを使って行うWorkflowを紹介します.

KNIME Workflow概要

Workflowの概要を以下に示します.
f:id:t_kahi:20190721221405p:plain

前編では「SVM Learner/Predictor」を使って,交差検証やパラメータ最適化,SVMのモデル構築を行って,実際のテストデータを解析する手法を紹介しました.
後編では,RとPythonをそれぞれ使ってKNIME上でSVMを実行するWorkflowを紹介していきます.
Rはcaretパッケージを,Pythonはscikit-learnライブラリを用いてSVMを行います.
PythonとRノードはKNIME extensionでインストールすることができます.
今回は,「R Predictor/Learner」と「Python Predictor/Learner」を使用しました.
f:id:t_kahi:20190723224902p:plain

Rについては何度もこれまでの記事で紹介していますが,PythonをKNIMEで処理する際にはいくつか事前の設定が必要です.
How to Setup the Python Extension | KNIME

KNIME Python Integration Installation Guide

「R Learner/Predictor」を使ったWorkflow

Rのcaretパッケージを使ったSVMについては下記記事を参考にしました.
Rによる機械学習:caretパッケージの使い方 | Logics of Blue
The caret Package
【R】SVMの基礎

まず,「R Learner」でグリッドサーチと交差検証を行い,最適なパラメーターを見つけます.その後得られたパラメーターを用いて学習データからモデルを作成します.

#R Learner
library(caret) 
library(rlang)
library(e1071)

library(doParallel)
cl <- makePSOCKcluster(4)
registerDoParallel(cl)

data <- knime.in 
set.seed(0)
irisSVM <- train(
  Species ~., 
  data = data, 
  method = "svmRadialSigma",
  tuneLength =10,
  tuneGrid = expand.grid(C=seq(1,10,1), sigma=seq(0.1, 2, 0.1)),
  trControl = trainControl(method = "cv")
)

knime.model <-irisSVM

パラメーターの最適化について可視化するために「R Views」を用いました.
parameter_CとsigmaによってAcuracyがどう変化するかを可視化します.

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

model <- knime.model

model_plot <- ggplot(model$results, aes(x = C, y = sigma, fill=Accuracy)) + 
  geom_tile() +
  geom_text(aes(label = round(Accuracy, digits = 3)), color = "white")
  #geom_point(aes(colour = Accuracy), size = 8) + 
  #scale_colour_gradient(low = "#0068b7", high = "#f39800")
  #scale_x_log10()

model_plot

実行結果を以下に示します.
f:id:t_kahi:20190723224447p:plain

続いて,「R Predictor」でテストデータの予測を行います.

predIrisSVM <- predict(knime.model,knime.in)
predIrisSVM
knime.out <- cbind(knime.in, predIrisSVM)

最後に「Scorer」で結果を出力します.
f:id:t_kahi:20190723230644p:plain

Python Learner/Predictor」を使ったWorkflow

続いて,Pythonのscikit-learnを使ってSVMを行います.
前編でも紹介した参考書と,以下の記事を参考にしました.
[機械学習] iris データセットを用いて scikit-learn の様々な分類アルゴリズムを試してみた - Qiita
scikit-learnのSVMでirisデータセットを分類 | note.nkmk.me

Python Learner」の結果を以下に示します.

# Python Learner
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
from IPython.display import display
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

iris_data = input_table._get_numeric_data()
iris_label = input_table['Species']

param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
print("Parameter grid:\n{}".format(param_grid))

grid_search = GridSearchCV(SVC(), param_grid, cv=10)

output_model = grid_search.fit(iris_data, iris_label)

print("Test set score: {:.2f}".format(grid_search.score(iris_data, iris_label)))

得られたモデルを用いて,「Python Predictor」で解析を行います.

#Python Predictor
import pandas as pd

test_data = input_table._get_numeric_data()
test_label = pd.DataFrame(input_table['Species'])

test_label.index = range(60)

print(test_label)

SVM = input_model

pred = pd.DataFrame(SVM.predict(test_data))

print(pred)

results = test_label.join(pred)

output_table = results

最後に「Scorer」で結果を出力します.
KNIMEノードやRノードと同様に精度よく分類することができました. f:id:t_kahi:20190723231130p:plain

まとめ

KNIMEで行うSupport Vector Machineについて,2回に分けてご紹介しました.
今回はテストデータが非常に簡単なものでしたが,実際にはもっと複雑なデータに対してSVMを適応していきます.
パラメーターの最適化もRやPython,KNIMEノードそれぞれで少しずつ異なっている部分はあると思うので,それぞれ好みに合わせて選んでよいと思います.

今回は,前回同様グリッドサーチでパラメーターの最適化を行っていきましたが,Pythonなら「optuna」が良いのでは,と勧められたので,今後勉強していきます.

optuna.org