Watson StudioのSPSS Modelerを使って回帰モデルをWebサービス化する

# はじめに
これから記述するガイドが最終的に目指すのは、**Watson Studio**上の**SPSS Modeler Flow**を使って作った**回帰モデル**を、**OpenScale**の管理対象にして、更に**説明性**の機能のセットアップをすることです。
そのため、次の3つのステップに分けてそれぞれの手順を別記事として解説します。

1. Watson StudioのSPSS Modelerを使って回帰モデルをWebサービス化する
2. 上記WebサービスをPython FunctionとしてWatson Machine Larningに登録する [リンク](https://qiita.com/makaishi2/items/35e277c34eadcce1fb7c)
3. 2.の結果登録したPython Function(回帰モデル)をOpenScaleの管理対象とする [リンク](https://qiita.com/makaishi2/items/de5630912fbbea7d879f)

2.と3.の組み合わせによって、任意の機械学習モデルがPythonから呼出し可能であれば(この条件は機械学習モデルがPublicからアクセス可能なWebサービスになっていれば自動的に成立します)OpenScaleの管理対象にできることを意味しています。
つまり、2.と3.の組み合わせだけみれば「**Python Functionを利用したOpenScale説明性のセットアップ手順書**」としても利用できることになります。

[2020-04-25] セットアップ手順修正

# モデルの説明
モデルは回帰モデルとしてメジャーな、**boston dataset**を利用します。
データセットの意味については、ググれば沢山出てきますが、例えば [Scikit-learnで機械学習（回帰分析）](https://momonoki2017.blogspot.com/2018/01/scikit-learn_28.html)などを参考にしてください。

# データ準備
これからのガイドでは以下のデータを利用します。必要に応じて事前にダウンロードしておきます。

|ファイル名|リンク|目的|
|---|---|---|
|boston-all.csv|[boston-all.csv](https://raw.githubusercontent.com/makaishi2/sample-data/master/data/boston-all.csv)|SPSSモデル学習用|
|boston-10-test.csv|[boston-10-test.csv](https://raw.githubusercontent.com/makaishi2/sample-data/master/data/boston-10-test.csv)|SPSSモデルテスト用|
|boston-web-test.json|[boston-web-test.json](https://raw.githubusercontent.com/makaishi2/sample-data/master/data/boston-web-test.json)|Webサービステスト用|
|flow-step1|[spss-boston-step1.str](https://github.com/makaishi2/sample-data/blob/master/data/spss-boston-step1.str)|(参考) SPSS フローファイル(step1)|
|flow-step2|[spss-boston-step2.str](https://github.com/makaishi2/sample-data/blob/master/data/spss-boston-step2.str)|(参考) SPSS フローファイル(step2)|

# 環境準備
IBM Cloud上で、Watson Studioのプロジェクトが作成済みで、Watson Machine Lerningとの関連づけも済んでいる必要があります。

具体的な手順は別記事 
[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)
を参照してください。
手順書でオプションとなっている機能のうち、**Machine Learning**は必要ですが、**Spark**は不要です。


# CSVファイルのアップロード
事前にダウンロードした2つのCSVファイル``boston-all.csv``と``boston-10-test.csv``をWatson Studio上にアップロードします。
Watson Studioのプロジェクト管理画面から、「**Add to project**」->「**Data**」を選択します。

![スクリーンショット 2019-07-13 12.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e15bcc9d-46b8-604b-ef34-4a62c104e20a.png)

下のような画面が右側に出てくるので、2つのファイルを**drag and drop**でアップロードします。

![スクリーンショット 2019-07-13 12.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1a23f50e-3670-0efa-c5d4-edf7fd653b9b.png)

# モデラーの起動
Watson Studio管理画面から「Add to project」->「Modeler flow」を選択します。

![スクリーンショット 2019-07-13 12.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0c342841-e6fa-fa1f-d2f5-403513f3e37e.png)

下のような画面になるので、名称だけ適当に設定して、後はデフォルト値のまま、画面右下の「Create」ボタンをクリックします。

![スクリーンショット 2019-07-13 12.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/87a3de90-474b-d32d-0b7f-dc360c0cd66d.png)

# Modeler Flowによるモデル作成 step1
本ガイドの目的はSPSSの使い方ではないので、ここからの手順は省略した書き方にします。
より詳細な手順を知りたい場合は、別ガイド[SPSSクラウド版で簡単機械学習](https://qiita.com/makaishi2/items/85d7694168e71ee3c094)を参照してください。

#### 部品の配置
次の3つの部品を配置し、結線します。

Import -> Data Asset

Field Operations -> Type

Modeling -> linear

![スクリーンショット 2019-07-13 13.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d03212da-6eb8-4dbe-a0ee-cfcfa76f808c.png)

#### Data Assetの設定
先ほどアップロードした``boston-all.csv``と関連づけます。

![スクリーンショット 2019-07-13 13.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/55e58534-8d0a-5362-917d-e2bf4f193d98.png)


#### Typeの設定
項目のうち、一番上の``PRICE``のRoleを**Target**にします。

![スクリーンショット 2019-07-13 13.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ea23197d-2be5-a777-0761-bd7299babf54.png)

#### 学習の実施
「Run」アイコンをクリックして学習を実施します。下の図のようになっていれば学習完了です。

![スクリーンショット 2019-07-13 13.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/01a7f7b0-4080-69d2-4d61-f9eb4bca93ff.png)

# Modeler Flowによるモデル作成 step2
これで予測モデルとして動作するフローは完成したのですが、Webサービス用に最適化した2つめのフローを作成します。

#### 部品の配置
次の3つの部品を追加します。

Import -> Data Asset

Field Operations -> Filter

Outputs -> Table

#### 学習済みモデルのコピー
次の操作で学習済みモデルのコピーを作ります。

学習済みモデル(オレンジの方)にマウスをあわせてコンテキストメニューから**Edit**->**Copy**

![スクリーンショット 2019-07-13 13.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9b5a787c-db81-670b-4318-80fa592df475.png)


白いキャンバスにマウスをあわせてコンテキストメニューから**Paste**

![スクリーンショット 2019-07-13 13.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ad6c2ed0-3d1b-266c-ea5a-7b3a06342c51.png)

この段階で、次の図のようになるはずです。

![スクリーンショット 2019-07-13 13.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/878495fc-ebf4-8b7c-58d5-5ad7f52e17a5.png)

#### フローの完成
4つの部品を結線した後、Data Assetは事前にアップロードした``boston-10-test.csv``と関連づけます。
**Filter**ノードに関しては、下の図のような設定をします。これは、入力パラメータを全部カットして、``$L-PRICE``という予測値の項目のみを出力とすることを意味しています。

![スクリーンショット 2019-07-13 13.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f87c594a-ed2a-9831-a7ac-9ffc52b8e78d.png)

設定が終わったら再度「Run」アイコンをクリックします。うまくいくと次のような画面になるので、テーブルの内容を確認します。

![スクリーンショット 2019-07-13 13.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/884f2a56-86a6-874a-b345-5684aa9cf13c.png)

下のような10行1列のデータになっていれば成功しています。

![スクリーンショット 2019-07-13 13.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d4129c9b-8815-523f-c83f-3c20b2b6a275.png)

# 2つめのフローの意味
下に完成したフロー図を添付しました。

![スクリーンショット 2019-07-13 13.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4b88cd4e-f610-078d-9f6c-7cf585d97b40.png)

ここには

①　学習に使ったオリジナルのフロー
②　学習済みモデルを使って作った派生的なフロー

の2つのフローがあります。Modeler Flowを使ったWebサービスを定義するときには、

* 入力はImport Node
* 出力は一番右の末端のノード

というルールがあります。このため、①のフローを使ってWebサービスを定義すると、

* 入力で予測に不要な項目(PRICE)も入力値で定義しないとエラーになる
* 出力に本来不要な入力項目も含まれてしまう

という結果になってしまいます。これに対して②のフローをWebサービス化すると、

* 入力が予測に必要な項目のみでいい
* 出力は予測値の項目(``$L-PRICE``)のみ

というWebサービスとして必要最小限の条件を満たしたシンプルなものになっていることがわかります。
それで、この2つめのフローをWebサービス化して、きれいな入力、出力インターフェイスを持つWebサービスとすることができるのです。(これは私もつい最近知ったことです。。。)

# Webサービスの作成
それでは、いよいよWebサービスの作成を行います。

#### モデルの保存
最初のステップは、モデルの保存です。Flowの編集画面で、**Table**アイコンにマウスをあわせてコンテキストメニューを表示し、**Save branch as a model**を選択します。

![スクリーンショット 2019-07-13 14.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/020f2f7c-332b-ee10-c854-61ea89232998.png)

下のような画面が出てくるので、**Model Name**の欄を、「SPSS boston model」など、それっぽい名前に変更します。あとは全部デフォルト値で、右下の**Save**ボタンをクリックします。
ちなみに、上から2つめに**Branch Terminal Node**をもう一つの候補**PRICE**に変更すると、オリジナルの①のフローがWebサービス化されることになります。

![スクリーンショット 2019-07-13 14.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c1971614-1c13-0d4e-ebbc-0b1eaeddf030.png)

#### Webサービスの生成

モデルの保存までできたら、Watson Studioのプロジェクト管理の画面に戻り、**Watson Machine learning models**を確認します。今保存した**SPSS boston model**が一覧に含まれているはずなので、そのリンクをクリックします。

![スクリーンショット 2019-07-13 14.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ff72f482-5b5e-36be-82e7-bb62f7e5c1e3.png)

ここから先は普通のWastson Studioの使い方とまったく同じです。
「Deployments」タブをクリックして画面右側の「Add Deployment」のリンクをクリックします。

![スクリーンショット 2019-07-13 14.36.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/11ac74f0-b72a-406b-a072-138ae2921240.png)

「SPSS boston web service」など適当な名前を入れて、「Save」をクリックします。

![スクリーンショット 2019-07-13 14.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c2064229-96f5-874b-4186-03925ee5d718.png)

下の画面に遷移するので、ブラウザをリフレッシュして、ステータスを確認します。ステータスが下のように**DEPLOY_SUCCESS**になっていればWebサービスが完成してます。

![スクリーンショット 2019-07-13 14.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/058f085a-ff83-b968-b439-39cf9df66b34.png)

# Webサービスのテスト
Watson Machine Learningで持っている簡易テスト機能を利用して、Webサービスのテストを実施します。そのため、上の画面の左側のリンクをクリックしてください。

Webサービスの管理画面になったら

①　**Test**タブを選択
②　**JSON**アイコンをクリックして入力形式をJSONにします
③  事前にダウンロードしておいた``boston-web-test.json``をテキストエディタで開いて、全体をクリップボートにコピーし、③の場所に張り付けます
④ **Predict**ボタンをクリック

![スクリーンショット 2019-07-13 14.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/66ad7d9f-8955-c041-cc7d-f09d2100a9da.png)

下の図のように結果が帰ってくれば、Webサービスのテストに成功しています。

![スクリーンショット 2019-07-13 14.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fcdb6527-970d-39a1-48bd-e1273f2724d8.png)

お疲れ様でした。
これで、三部作シリーズの第一部である、「Watson StudioのSPSS Modelerを使って回帰モデルをWebサービス化する」は完了したことになります。