「Watson Machine Learning」でSPSS Modelerみたいな「Flows」を使ってみた


:warning: <Font color="red">当記事は2017/8月に投稿しましたが、現時点(【2019/2月】)では既に古くなっています。記事自体はアーカイブの目的でこのまま残しますが、当記事の内容を参考になさらないようにお願いいたします。FlowsはWatson Studioに含まれましたので、代替の記事としては下記などがございます。</font>

- [IBMのThink 2018で発表されたAIプラットフォーム「Watson Studio」をザクッと紹介してみる](https://qiita.com/ishida330/items/cd851bb2c461f64b02dd)


<hr>

# はじめに
こんにちわ！この記事は「[Bluemix上で機械学習モデルを簡単に作れる「Watson Machine Learning」を使ってみた](http://qiita.com/ishida330/items/0b60bc6f715df9da641c)」の続きです。今回はブラウザー上でSPSS Modelerみたいに簡単に機械学習モデルをつくれるFlows(Canvasとも呼ばれる)をご紹介します。
```
以下は記事執筆時点(2017/08月）のものです。Flowsはまだベータなので先々、画面が変わっていたり機能が強化されていたらすいません。
```

# Flowsとは？
百聞は一見に如かず、で要はこんなのです。ブラウザー上でSPSS ModelerのようなUIと操作性で機械学習モデルを作成・デプロイできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1c27e9cf-c728-a966-0f51-228f567d8801.png)

- 現在(2017/08)はベータですので、**「お披露目」的な意味合い**が強いです
- ランタイムとしてSpark環境向け/SPSS環境向けの2種類が提供されています
- ２つの環境のUIや操作性はほぼ共通していますが、各々の環境で提供されている手法・ノードは異なっています。(今はSPSS Flowの方がノード数は多いです。当記事の末尾に[パレット上のノード一覧](http://qiita.com/ishida330/items/f36c6206637fbc97cf07#%E3%81%94%E5%8F%82%E8%80%83-spss-flow%E3%81%AE%E3%83%91%E3%83%AC%E3%83%83%E3%83%88%E8%A8%98%E4%BA%8B%E5%9F%B7%E7%AD%86%E6%99%82%E7%82%B9)を付けましたので、よろしければご参照ください)
- SPSS Flowも現時点ではデスクトップ版のSPSS Modelerほど多くの手法・ノードが実装されているわけではありませんので、「SPSS Modelerの代わり」にはなりません。


# SPSS Flowをやってみる

ネタ元: [このチュートリアル](https://datascience.ibm.com/docs/content/analyze-data/ml-example-kidney-disease-flow.html)です。
### 1. シナリオ

ある人が慢性腎臓病(chronic kidney disease)かどうかを判定する機械学習モデルを作ります。結果はYES/NOなので「分類」(Classification)の問題です。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9bcc36c2-a5e5-132b-b2fb-98defba01e41.png)

### 2. データのダウンロード

[WML-KidneyDiseaseTutorial](https://github.com/IBMDataScience/WML-KidneyDiseaseTutorial)からClone/Downloadしてzipを解凍します。filesディレクトリーにchronic_kidney_disease_full.csvができます。

データは以下のようなCSVで、一番右側の「class」フィールドの値が「ckd(chronic kidney disease)」か「notckd」かを予測することになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ea38f046-dbbf-f1ee-1963-fc7b6a33ec88.png)

### 3. DSXにログインしてデータをアップロードする
具体的な手順は重複するので割愛します。[前の記事](http://qiita.com/ishida330/items/0b60bc6f715df9da641c)などご参照ください。こんな感じでファイルがDSX上に登録されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2a6163cf-4df6-4d0e-41f5-04301f475da5.png)

### 4. プロジェクトにFlowを登録する 
「Add to project」で「Flow」を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2a561320-d95d-6c96-57ae-4afca3f18722.png)

お好きなフローの名前を入力し、ランライムは「IBM SPSS Modeler」を選択して「Create Flow」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8df66137-e040-4d38-b631-94a4b760a214.png)

空のキャンバスが開きました

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/517bfbf1-00f8-e599-c89d-7f1129cbcd3c.png)

### 5. フローを作る

まずは右側のリストから先程のファイルをキャンバス上にドラッグ＆ドロップします

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/23bae081-ccaf-de44-8721-ecf9dd240264.png)

左下の十字をクリックするとパネルが開きます。「Field Operations」のタブから「Partition」を選んでキャンバスにドラッグ＆ドロップします

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/27b84197-8b0c-8c7e-dd5f-2874ede6abbe.png)

データとPartitionを接続します。繋ぐ際は操作上のコツがあるのですが、①起点となるファイルのノードの上にマウスを持っていくと、青い丸で囲まれます　②この状態でマウスの選択を離さずに終点であるPartitionのノードまで伸ばします。(接続は点線で表示されます)　③終点上でマウスの選択を離すと２つのノードが実線で結ばれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/07b57bea-0c91-1705-7968-ebce5a17ea4b.png)

同様の操作でパレットから以下2つのノードも追加します。

| タブ | ノード |
|:-----|:----|
| Field Operations | Type |
| Modeling | C5.0 |

結果、以下のようなフローができました

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f06475b2-6d2f-6d75-6ab7-7e4d22c2e138.png)

ノードで右クリックするとコンテキスト・メニューが表示されます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/577173bc-26e0-4895-8556-432dfc300b2b.png)

### 6. ノードの設定をする 
まだノードを繋いだだけです。各ノードをダブルクリックすると設定パネルが表示されますので順番に見ていきましょう。

##### 1) ファイル・ノード
ファイル名以外に区切り文字、文字コードなどの設定ができます。今は「見るだけ」にします。（＝「Cancel」）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/05ec638e-fadb-7413-6510-182d82ed3171.png)

##### 2) Partitionノード
レコードを教師データとテスト・データに分割する比率を指定します。品質評価用のデータを取り分けておくこともできます。今は「見るだけ」にします。（＝「Cancel」）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3f469eca-a527-4eb3-902b-06ba817e738c.png)

##### 3) Typeノード
ここで「予測したいこと(目的変数)」が何であるか、の設定をします。
今回のデータでは「慢性腎臓疾患かどうか」を表すフィールドは「**class**」ですので、左側のフィールドのリストから「**class**」を選択して「>」ボタンで目的変数に設定します。するとclassが右側に移動します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3c5a2aed-f655-b65b-7e6e-fd94451fcb15.png)

右側の「Edit」をクリックすると
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6511e91d-c560-097f-90dc-f9e62d2d6418.png)

パネルが開くので「Role」を「Target」に変更して「OK」。これで「classが目的変数だよ」と指定したことになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ad53c231-4d24-cf51-6a27-6b6caf7e2bff.png)

##### 4) C5.0ノード
今は空ですが、Typeノードの設定が引き継がれるのでこのままでいいです。今は「見るだけ」にします。（＝「Cancel」）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5e860cb4-8cde-eed9-788f-0a292d6d51bb.png)

### 7. モデルを作る
ではお待ちかね、モデルを作りましょう！「C5.0」ノードで右クリックして「Run」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/01e86925-983c-1a4f-1bad-07f0c4e0ec92.png)

SPSS Modelerでお馴染みのモデル（ゴールデン・ナゲット）ができましたね！

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4b24b28a-9eea-b3e1-a607-9a712dc3ce95.png)

作られたモデルの内容を見てみます。ナゲットを右クリックして「View Model」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1a118066-e04b-6b61-e8e2-592c5b52b975.png)

こんな感じでモデルの内容が見られます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0c5c7389-d251-a406-5e99-0732ba035d36.png)

モデルの評価もできます。パレットから「Analysis」ノードをドラッグ＆ドロップしてナゲットと接続します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ab8fa2cf-236f-2cfd-c904-0fd7b0fc401c.png)

「Analysis」ノードをダブルクリックで開いて、分析したい内容４つにチェックして閉じます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/747ec472-0fd5-4c0f-7b2d-0d0eb01c87e0.png)

右クリックして「Run」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4cb83913-fd13-5cf6-fea3-88c1fec9ec22.png)

右側にOutputが表示されるのでダブルクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e793ac3b-ba33-0995-3d21-248eb86853a8.png)

モデルの評価結果のレポートが表示されます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5458ac8d-1faa-1a01-c1cd-7321b20af062.png)

### 8.モデルをデプロイする

Sparkの場合とちがい、今のところSPSSの場合は実行環境への１クリックでのデプロイはできません。（先々の計画はあるそうですが）現時点では、*.strファイルをダウンロードしてご自身で改めてSPSS Scoring Serviceにデプロイしていただく必要があります。

「Analysisノード」の「Deploy」メニューを実行すると、SPSS Modelerのストリーム全体が*.strとしてPCにダウンロードできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4fc08a0c-563e-591c-27ab-818577012d58.png)

ダウンロードした*.strファイルはSPSS Modelerでそのまま開けます。スコアリング枝も緑の線で設定されています。(もしされていなければ、してください）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/76d799dd-10d0-c2a0-90fa-f7aac5c758a0.png)

あとはこのストリームをWMLの「SPSS Streams Service」にアップロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e307e8cb-2691-4b4d-6e83-19d8b4e932b0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/fef05cc3-35c5-7a78-caa3-d75cfc3c1619.png)

入力ノードが無効なためか、下記のエラーが出ますがモデルのデプロイはできています。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8d494342-7bbf-04be-9c2a-654b19d8073d.png)

残念ながらSPSS側のサービスはUIで簡単にスコアリングを行う機能が無いようなので、RESTで確認する必要があり今は割愛します。ご興味のあるかたは[BluemixのPredictive Analyticsを使ってみた](http://qiita.com/ishida330/items/fab1706977d20a6bae24)をご参照ください。

SPSS Modeleと同じ操作感でモデルが作れるのがおわかりいただけたかと思います。

# SPSS Modelerのストリームファイルの再利用や互換性

一からフローをつくらなくても、SPSS Modelerの既存のストリームを再利用することもできます。フローを作成するときに「From File」を選択して下のボタンから既存のSPSS Modelerのストリーム・ファイルを指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9b013749-c06b-27f1-d65a-deddcfa0e4ce.png)

下記はSPSS Modelerの入門用のストリーム「modelingintro.str」を使った例ですが、ほぼ同じ形で取り込まれていますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/00b49438-29a0-511b-ae31-9f5a0c29c8db.png)

- 元々の入力ファイルはPC上であり、まだObject Storage上に存在しないので？になっています。ここはファイルをアップロードのうえ、修正する必要があります。
- SPSS Modeler側の多様なノードが全部WML側に用意されているわけではないので、残念ながら使えないノードも色々あります。
- 今はPC上のSPSS Modeler -> WML方向のアップロードの話ですが、WML->SPSS Modelerの逆方向も可能です。(「モデル」や「テーブル」ノードを右クリックして「Deploy」でstrファイルがダウンロードできます）
 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c94907e0-7334-c19b-3e55-9dea462af3eb.png)

# Sparkでもやってみる（と思ったが中断）

[Spark環境(Spark ML)でのチュートリアル](https://datascience.ibm.com/docs/content/analyze-data/ml-example-kidney-disease-flow-sparkml.html)

今まではSPSS側のフローでしたが、Spark側のフローも利用可能です。フローを作る際に「Scala Spark 2.0」を選択すればよく、操作性はほぼ同じなのですが、今やるとエラーになり記事が書けません。（ガックリ。。まあベータなんでご容赦ください）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0d3726e1-2766-d695-4251-3c60fcbd928f.png)

こちらはまた動くようになったら更新します。すいません、


# 参考文献/URL
[Data Science Experience - Flows](https://datascience.ibm.com/docs/content/analyze-data/ml-canvas.html) -ドキュメントです。
以下のチュートリアルは同じ例を２つの環境で行ってます。
[SPSS環境でのチュートリアル](https://datascience.ibm.com/docs/content/analyze-data/ml-example-kidney-disease-flow.html)
[Spark環境(Spark ML)でのチュートリアル](https://datascience.ibm.com/docs/content/analyze-data/ml-example-kidney-disease-flow-sparkml.html)
[Build model by using IBM Watson Machine Learning in Data Science](https://developer.ibm.com/recipes/tutorials/build-model-by-using-ibm-watson-machine-learning-in-data-science/)

# ご参考) SPSS Flowのパレット（記事執筆時点)
[ここ](https://datascience.ibm.com/docs/content/analyze-data/ml-canvas-spss.html)に各ノードの簡単な説明があります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9d61ad07-8e5c-725c-5a05-28289aa40836.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6aef7269-ab32-635e-5768-0ab704051bf1.png)

# ご参考) Spark Flowのパレット（記事執筆時点)
[ここ](https://datascience.ibm.com/docs/content/analyze-data/ml-canvas-sparkml.html)に各ノードの簡単な説明があります。
SPSSに比してまだまだ少なく、「これから」って感じでしょうか。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bceb257c-ccb0-70db-6444-55c46b4e0266.png)