KNIME: SVMを用いた機械学習 (1)

By | 2015年6月12日


今回は、SVMを用いて機械学習を行うワークフローを構築します。
学習用データとテスト用データは共に、Databaseから取得します。
データセットは、以下のサイトにある化合物のlogS値(Huuskonen dataset)を利用しました。
入手先: http://sourceforge.net/p/rdkit/code/HEAD/tree/trunk/Docs/Book/data/


knime_svm_01a

各ノードの設定方法を説明します。
各ノードを配置、接続した後、ノードをダブルクリックするとConfigureが開き、設定を行うことができます。

JDBCドライバーの登録

今回は、Databaseとして、PostgreSQLを使いますので、対応するJDBCドライバーをKNIMEに登録する必要があります。
私の環境では、以下のドライバーを使いました。

入手先:https://jdbc.postgresql.org/download.html#current
入手ファイル名:postgresql-9.1-903.jdbc4.jar

メニューから、[File]→[Preferences]→[KNIME]→[Databases]でダウンロードしたJDBCドライバーを登録します。

knime_svm_02

DBから学習用データの読み込み

Database Readerノードを使って、PostgreSQLから、学習用データを読み込みます。
学習用データは、knimedbに入っており、”SELECT * FROM descTrainTable”で取り出します。

knime_svm_03

PostgreSQLから、読み込んだ学習用データは、テーブルの左から、rid, comp_id, act1, act2, 記述子1 ,記述子2, ….という構成になっています。
ここで、act1は、logS値のカテゴリーを表す数値,0(低),1(中),2(高)であり、act2は、logS値となります。

knime_svm_04

活性値の変換1

Java Snippet(simple)ノードを使って、act1に収められている数値を文字に変換します。
具体的には、0→’L’, 1→’M’, 2→’H’に変換します。

knime_svm_05

正規化1

Normalizerノードを使って、記述子の正規化を行います。
正規化を行う列を右のInclude枠に入れます。
ここでは、Min-Max Normalizationを選択します。

knime_svm_06

学習データのみ抽出

Column Filterを使って、学習に使う列のみ選択を行います。

knime_svm_07

学習

LIBSVMLearnerノードを使って、機械学習を行います。
Target columnでact1を選択して、教師データとします。

knime_svm_08

学習モデルのファイル出力

Model Writerノードを使って、LIBSVMLearnerで構築した学習モデルをファイル出力します。

knime_svm_09

DBからテスト用データの読み込み

Database Readerノードを使って、PostgreSQLから、テスト用データを読み込みます。”SELECT * FROM descTestTable”で取り出します。

knime_svm_10

活性値の変換2

活性値の変換1と同様に、Java Snippet(simple)ノードを使って、act1に収められている数値を文字に変換します。
具体的には、0→’L’, 1→’M’, 2→’H’に変換します。

knime_svm_05

正規化2

Normalizer(Apply)ノードを使って、正規化を行います。
ここでは、正規化1のNormalizerノードで計算された値を利用して正規化を実施しています。
特にConfigureで設定する内容はありません。

予測

LIBSVMPredictorノードを使って、テスト用データのlogSのカテゴリーの予測を行います。
特にConfigureで設定する内容はありません。

評価

Scorerノードを使って、予測結果の評価を行います。
First Columnには、答えであるact1を、Second Columnには、予測値であるLIBSVM_Classを選択します。

knime_svm_11

以上で設定は終わりです。
実行して、ScorerノードからConfusion matrixを選択すると以下の様な結果を得ることができます。

knime_svm_12


利用したソフトウェア:
KNIME 2.11.3