t_kahi’s blog

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

【KNIME】KNIME Workflowのサンプリングノードについて

こんばんは,@PKです.

KNIME Workflowでデータのサンプリングをする方法をいくつか調べていたのですが,主に3つのサンプリング手法のノードが提供されているようです.

それぞれのノードを使った詳細なWorkflowは別の機会で紹介したいので,今回はそれぞれのサンプリングノードについて簡単に紹介したいと思います.

KNIME Workflowの概要

今回お示しするWorkflowは以下の通りです. f:id:t_kahi:20190702212651p:plain

「R Source」でサンプルデータとしてIrisを読み込み,それぞれのサンプリングのノードで処理しています.
ご存知の方がほとんどだと思いますが,IrisデータにはSpeciesカラムに"setosa", "versicolor", "virginica"がそれぞれ50サンプルずつ含まれています.

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

現在KNIMEには主に3つのデータサンプリング用のWorkflowがあります.

  • Row Sampling
  • Bootstrap Sampling
  • Equal Size Sampling

それぞれの機能を簡単に紹介していきます.

Row Sampling

nodepit.com 「Row Sampling」では,入力されたデータから一定数の行を抽出することができます.
以下に設定画面と,下記条件での実行結果を示しています.
f:id:t_kahi:20190702214002p:plain

設定画面では以下のサンプリングの設定ができます.
Absolute:抽出するサンプルの絶対値
Relative:相対的にサンプルデータを取得する(%)
Take from top:行の上から順にサンプルを取得する
Linear sampling:最小値と最大値を含んで一定間隔ごとにサンプリングしていく
→値の大きさを変えずにダウンサンプリングできる
Draw randomly:ランダムにサンプリングをする.乱数シードを設定できる.
(*乱数シードを設定すると,毎回同じ乱数が出力される.)
Stratified sampling:選択したカラムで指定したグループの分布を変えずにサンプリングする
→母集団の分布を変えずにダウンサンプリングできる
[学習用実装]層別サンプリング(Stratified Sampling)をPythonで実装する(1) - Qiita

Row Samplingにも様々な設定があり,用途に応じて選べました. 例では"Absolute" ; 100で実行し,100個の行をランダムに抽出しています.

乱数シードって何…?という方は下記資料が参考になりました.
pythonメモ:乱数生成でシードを設定するとはどういうことなのか - Qiita

Bootstrap Sampling

nodepit.com 「Bootstrap Sampling 」は入力されたデータから重複を許してデータを抽出する手法です.

機械学習や母集団の信頼区間を求めるときに使うようです. ブートストラップサンプリング(Bootstrap Sampling)法とそのscikit-learnを用いた実行 - Qiita
色んな統計量のバラツキを求めたい!再標本化 (Bootstrap)のススメ - Qiita
Bootstrap法については次の記事でもう少し突っ込んで触れようと思っているので,今回は設定画面の簡単な紹介にとどめます.

以下に設定画面と,下記条件での実行結果を示しています.
f:id:t_kahi:20190702220925p:plain

主な設定部分です.
Sample size in %:入力データに対する出力データ量
Absolute sample size:出力するデータの絶対値
Use random seed:乱数シードを設定する
Append count of occurrences:同じ行が抽出された数が含まれたカラムを作成する

今回の設定ではサンプルサイズ100%で実行したので,入力データと同じ量の出力サンプルが得られました.

Equal Size Sampling

nodepit.com 「Equal Size Sampling」は指定したカテゴリーのサンプル数が同じになるようにサンプリングをする手法です.
カテゴリーのサンプル数が大きく違う場合,ランダムにサンプリングをすると少ないほうのサンプルの情報が無い・極端に少なくなり,今後の解析に大きな影響を与えます.

例として以下のように,「Row Filter」で121~150行目を除いたデータを作成します.
f:id:t_kahi:20190702221628p:plain
この操作によって,”virginica”のサンプル数が50→20になります.
その後,「Equal Size Sampling」でカテゴリーカラムを"Species"と設定します. また,"Use exact sampling"と"Use approximate sampling"という選択項目があります.
"Use exact sampling"を選択するとカテゴリーごとのサンプリング数は同じになりますが,"Use approximate sampling"では異なる場合があるようです.
非常にカテゴリーの数が多い場合以外は"Use exact sampling"を選択して問題ないそうです.
こちらでもシードの設定が可能なので同じ結果を得たい場合はチェックをつけておきます.

実行すると,"setosa", "versicolor", "virginica"が20サンプルずつランダムに取得できています.

まとめ

KNIME Workflowのサンプリングノードについて,それぞれの設定を簡単ですがまとめました.
設定画面でいくつか選択肢がありましたので,目的に応じてうまく使い分けるのが良さそうです.
個人的にBootstrap samplingが気になっているので次回以降少し詳細を紹介したいと思います.