Python Function(回帰モデル)をOpenScale説明性の管理対象とする

# はじめに
[Watson StudioのSPSS Modelerを使って回帰モデルをWebサービス化する](https://qiita.com/makaishi2/items/cd9382a8be9a1b5d6a51)
[Watson Machine LeaningにPython Functionを登録する](https://qiita.com/makaishi2/items/35e277c34eadcce1fb7c)
と続く三部作シリーズの第三部です。
三つの手順を全部まとめると、**SPSS Modeler Flowで作成した回帰モデルをOpenScale説明性の対象とする**ことが可能となります。

# データ準備
第一部で利用したboston-all.csvを再度利用します。
今度の目的は、学習用テーブルにロードしてOpenScaleセットアップで必要なdb2テーブルを作ることです。
Jupyter Notebookは、説明性の設定を行った後、テストのため利用します。

|ファイル名|リンク|目的|
|---|---|---|
|boston-all.csv|[boston-all.csv](https://raw.githubusercontent.com/makaishi2/sample-data/master/data/boston-all.csv)|DB2テーブル作成用|
|spss-openscale-test.ipynb|[spss-openscale-test.ipynb](https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/spss-openscale-test.ipynb)|OpenScale SPSSで説明性テスト用|

# 環境準備
[Watson Openscaleでscikit-learn モデルの説明性を確認する　【セットアップ編】](https://qiita.com/makaishi2/items/cd54e91c635cd32437ad)が一通り終わっていることを前提とします。手順も一部省略して書いているところがありますが、細かい手順はこちらの記事を参照してください。

# 学習用テーブルの準備
上の記事と同じ手順で、boston-all.csvデータをDb2のテーブルにロードします。テーブル名は``BOSTON``としてください。

# OpenScaleの設定
https://aiopenscale.cloud.ibm.com/aiopenscale からOpenScaleの管理画面を起動します。

下の画面で「**Add Deployment**」をクリックします。

![スクリーンショット 2019-07-13 17.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5cd77856-f12f-3675-e7ae-15b35e06ec21.png)

その次のdeploymentの選択画面ではPython Functionのdeploymentとして登録した"SPSS boston deployment"を選択して、「**Confugure**」とします。

![スクリーンショット 2019-07-13 17.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/579495b9-426b-6a99-b7bc-69986f987876.png)

その次の画面では、「**Configure monitors**」を選択します。

![スクリーンショット 2019-07-13 17.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/60a1ca81-a130-6189-6558-9a8f0b7e00f5.png)

下の画面になるので、**Data type**は、「**Numerical/Categorical**」を、**Algorithm type**には「回帰」を選択して、「**Save**」とします。

![スクリーンショット 2019-07-13 17.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b0542674-4ce1-2380-5e75-4252f7e910ba.png)

下の画面になったら、Pyhthon FunctionのWeb Deployment管理画面を出します。

![スクリーンショット 2019-07-13 17.58.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c997026e-4f41-7b97-6beb-7a0352c32510.png)

一番右のテストタブから、下記のjsonを張り付けてテストを実行してください。

```json
{"fields": ["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", 
  "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT"], 
"values": 
[[0.00632,18.0,2.31,0.0,0.538,6.575,65.2,4.09,1.0,296.0,15.3,396.9,4.98],
[0.02731,0.0,7.07,0.0,0.469,6.421,78.9,4.9671,2.0,242.0,17.8,396.9,9.14]]}
```

テスト実行後のDeployment管理画面は下のようになります。

![スクリーンショット 2019-07-13 19.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2cf75ead-5baa-5300-1011-b90e40e45d60.png)

この状態で、OpenScaleの管理画面に戻り、画面左の「**Model Details**」をクリックします。

![スクリーンショット 2019-07-13 17.58.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9e2ec793-309c-aee6-14bb-294cf8808cea.png)

Webサービスの呼出しが正しく行われていると、下の画面右下の「**Begin**」のボタンがアクティブになっているはずなので、そのボタンをクリックします。

![スクリーンショット 2019-07-13 19.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6e934a14-57d2-7a98-bdbb-1a867cf88bb3.png)

その次の**モニタリングの構成**の画面では、左側の「**手動構成**」を選んで「次へ」とします。

![スクリーンショット 2019-07-13 19.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/60ad7c98-f3df-ff6c-381b-7ee82fa603e0.png)

下の画面では、学習用データをロードしたDb2の接続情報を入力します。詳しい内容は、[Watson Openscaleでscikit-learn モデルの説明性を確認する　【セットアップ編】](https://qiita.com/makaishi2/items/cd54e91c635cd32437ad)を参照してください。

![スクリーンショット 2019-07-13 19.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e5412c03-2f1a-2313-bc04-8c954058306d.png)

その先の「**訓練テーブルを選択**」の画面では、事前に学習用データをロードしたテーブルのスキーマ名(**接続ユーザー名と同じ**)とテーブル名(**BOSTON**)を入力します。

![スクリーンショット 2019-07-13 19.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/55aead8b-1083-6556-22d9-71e04bd6a363.png)

次の「**予測された値を含む列**」は**PRICE**を選択します。

![スクリーンショット 2019-07-13 19.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/aaaedde8-e3c9-552f-3519-ffa698852df2.png)

その次の「AIデプロイメントのトレーニングに使用する特徴量」はデフォルトで全部選ばれているはずなので、そのまま「次へ」とします。

![スクリーンショット 2019-07-13 19.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/049bde6e-b9ed-8cfb-64a2-1c567cd5b339.png)

その次の「テキストの特徴量と分類の特徴量」はデフォルトで何も選ばれていないはずなので、そのまま「次へ」を選びます。

![スクリーンショット 2019-07-13 19.11.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/05183888-f0e0-4a4d-d45f-6a959255382c.png)

「**デプロイメント予測列の選択**」は**$E-PRICE**を選択します。

![スクリーンショット 2019-07-13 19.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/571f404a-8200-21b5-1619-72cc42158508.png)

設定が全部終わると下のような画面になります。設定値に問題がないことを確認した上で「保存」をクリックします。

![スクリーンショット 2019-07-13 19.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4e7e0b23-b1ae-cabb-8301-3a5a36c62109.png)

**Model details**と**Explainability**の欄にチェックがついていれば設定は正常にできています。このことを確認した上で、画面左上の「**←**」アイコンをクリックして、元の画面に戻します。

![スクリーンショット 2019-07-13 19.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4dab18a8-e1a9-e315-3507-921f04a7960e.png)

# 説明性要求の呼出し
これで設定はすべて終わったので、最初の説明性要求を行います。呼出しはPythonのコードで行う形になります。
これからの手順で使うJupter Notebookは、以下のURLによりブラウザから全体にアクセス可能です。

https://github.com/makaishi2/sample-data/blob/master/notebooks/spss-openscale-test.ipynb

## Jupyter Notebookの読み込み
事前にダウンロードした``spss-openscale-test.ipynb``をWatson StudioのJupyter Notebookとして読み込みます。

## 認証情報の設定
Notebookの2番目のセルにあるcredentail情報を設定します。
詳細は [Watson Openscaleでscikit-learn モデルの説明性を確認する　【動作確認編】](https://qiita.com/makaishi2/items/a3f9330fe17b5eaf8d26) を参照してください。

## Notebookの実行
あとは、Notebookのセルを上から順に shift + enterで実行すると、spss modelerの回帰モデルの説明性を検証することが可能です。

# Jupyter Notebookコーディングの解説
上で実行したJupyter Notebookの要点を解説します。

## OpenScale APIの初期化
以下のコードでOpenSCale APIの初期化を行います。

```py3
# 追加モジュールの導入
!pip install --upgrade ibm-ai-openscale --no-cache | tail -n 1

# OpenScaleのcredential情報設定
AIOS_CREDENTIALS = {
    "instance_guid": "xxxx",
    "apikey": "xxxx", 
    "url": "https://api.aiopenscale.cloud.ibm.com"
}

# OpenScale APIの初期化
from ibm_ai_openscale import APIClient
from ibm_ai_openscale.engines import WatsonMachineLearningAsset
aios_client = APIClient(AIOS_CREDENTIALS)
aios_client.version
```

## Subscription IDからTransaction IDの取得
OpenScaleで説明性の機能を呼び出すためにはOpenScale内でトランザクションごとにユニークに採番しているTransaction IDを取得する必要があります。
以下のコードは OpenScale APIを利用してSubscription IDからTransaction IDを取得するためのものです。

```py3
# Subscriptionの一覧表示
from ibm_ai_openscale.supporting_classes import *
aios_client.data_mart.subscriptions.list()

# サブスクリプションIDの取得
subscription_uid = aios_client.data_mart.subscriptions.get_uids()[0]
print('subscription_uid = ', subscription_uid)

# サブスクリプションオブジェクトの取得 (いろいろな操作が可能になる)
subscription = aios_client.data_mart.subscriptions.get(subscription_uid)

# 対象サブスクリプションの先頭トランザクションIDの取得
transaction_id = subscription.payload_logging.get_table_content().scoring_id[0]
print('transaction_id = ', transaction_id)
```

## 説明性機能の呼出し
transaction idがわかればそれを引数に説明性の要求を出すことが可能です。以下のコードはその呼出し例を示しています。

```py3
# 説明性の要求
explanation = subscription.explainability.run(transaction_id, background_mode=False)
```

呼出しがうまくいくと、以下のような結果が帰ってくるはずです。

```


================================================================

 Looking for explanation for c73b8c87df629dc722e382b90f02f4da-1 

================================================================



in_progress........
finished

---------------------------
 Successfully finished run 
---------------------------
```

## 説明性の詳細表示

次の関数呼び出しで、特定の説明性要求に対する詳細結果を取得できます。

```py3
# 説明性の最初の行の詳細表示
subscription.explainability.get_table_content()['explanation'][0]
```

こんな結果が帰ってきます。

```json
{'entity': {'status_lime': 'finished',
  'predictions': [{'value': '30.003843377020388',
    'explanation': [{'weight': 0.3321053247301002,
      'feature_name': 'LSTAT',
      'feature_range': {'max': '6.95', 'max_inclusive': True}},
     {'weight': 0.2215896559235419,
      'feature_name': 'PTRATIO',
      'feature_range': {'max': '17.40', 'max_inclusive': True}},
     {'weight': -0.18185091967246045,
      'feature_name': 'RAD',
      'feature_range': {'max': '4.00', 'max_inclusive': True}},
     {'weight': 0.15330666524447153,
      'feature_name': 'ZN',
      'feature_range': {'min': '12.50', 'min_inclusive': False}},
     {'weight': 0.111147434429426,
      'feature_name': 'TAX',
      'feature_range': {'max': '330.00',
       'min': '279.00',
       'max_inclusive': True,
       'min_inclusive': False}}]}],
  'status_cem': 'not_supported',
  'input_features': [{'name': 'CRIM',
    'value': '0.00632',
    'feature_type': 'numerical'},
   {'name': 'ZN', 'value': '18.0', 'feature_type': 'numerical'},
   {'name': 'INDUS', 'value': '2.31', 'feature_type': 'numerical'},
   {'name': 'CHAS', 'value': '0.0', 'feature_type': 'numerical'},
   {'name': 'NOX', 'value': '0.538', 'feature_type': 'numerical'},
   {'name': 'RM', 'value': '6.575', 'feature_type': 'numerical'},
   {'name': 'AGE', 'value': '65.2', 'feature_type': 'numerical'},
   {'name': 'DIS', 'value': '4.09', 'feature_type': 'numerical'},
   {'name': 'RAD', 'value': '1.0', 'feature_type': 'numerical'},
   {'name': 'TAX', 'value': '296.0', 'feature_type': 'numerical'},
   {'name': 'PTRATIO', 'value': '15.3', 'feature_type': 'numerical'},
   {'name': 'B', 'value': '396.9', 'feature_type': 'numerical'},
   {'name': 'LSTAT', 'value': '4.98', 'feature_type': 'numerical'}],
  'status': 'finished',
  'asset': {'id': '8b4557af-16b2-4e5b-9257-4aeb6c8876a4',
   'name': 'SPSS boston regression',
   'type': 'numeric_categorical',
   'deployment': {'id': '1ebb75e2-696a-40a7-b591-30f3ddd2b770',
    'name': 'SPSS boston deployment'}}}}
```


## OpenScale管理画面からの説明性の表示
最後に上で得られた詳細情報をOpenScaleの画面から確認します。
画面左上から2つめのアイコンを選び、更に検索窓に先ほど得られたトランザクションIDを入力してEnterキーを押します。
しばらくすると、下のように説明性の画面が表示されるはずです。

![スクリーンショット 2019-07-13 19.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/724eac50-6dd1-e39d-5049-467431001849.png)