Watson Openscaleでscikit-learn モデルの説明性を確認する　【動作確認編】

# はじめに
Watson Openscaleの機能を一通り試してみたい場合、[チュートリアル　対話式セットアップ](https://cloud.ibm.com/docs/services/ai-openscale?topic=ai-openscale-gs-obj&locale=ja#gs-obj)の手順に従うのが早道です。
しかし、この手順では、自分で作ったモデルをデプロイする際必要になる手順で一部省略されている箇所があり、自分で作ったモデルを管理対象にしたい場合わからない点がでてきます。
当記事は、この足りない部分を補う目的で記載しました。
記事がかなり長くなったので、当記事は「**動作確認編**」として第二部の位置づけです。
セットアップ手順は別途[「セットアップ編」](https://qiita.com/makaishi2/items/cd54e91c635cd32437ad)として掲載しています。

# 事前準備
セットアップ時に必要となる**APIトークン**と**OpenScale**の**GUID**を事前に入手しておきます。

## APIトークン

https://cloud.ibm.com/resources の管理画面から以下の手順でトークンを取得します。

メニューから「管理」「アクセス(IAM)」

![スクリーンショット 2019-07-04 19.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fbc905bf-5ed1-00e2-9b00-f537008a092a.png)

下の画面で「IBM Cloud APIキー」->「IBM Cloud APIキーの作成」

![スクリーンショット 2019-07-04 19.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9033c689-3211-1442-53ea-7eecc7ee8db1.png)

「APIキーの作成」のダイアログが出たら、``api-key``など適当な名前を入れて「作成」をクリック

![スクリーンショット 2019-07-04 19.16.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/494ad1a7-afc0-789b-d288-eecf8e9c245f.png)

下の画面になったら、「コピー」をクリックしてAPIキーをクリップボードにコピーし、テキストエディタなどに保存しておきます。

![スクリーンショット 2019-07-04 19.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2063686e-2b80-7f71-8240-f574958b5e5c.png)

## GUIDの確認
次にOpenScaleのGUIDの確認をします。

まず、 https://cloud.ibm.com/resources でIBM Cloudのリソース一覧を表示して**Services**からOpenScaleを探します。リストのうち、一番左の「名前」の欄はリンクになっているのですが、それ以外の列にマウスポインタをあわせて、クリックします。

![スクリーンショット 2019-07-05 20.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/663a0939-020c-ca0a-0be1-e36093b19da9.png)

すると、次のような画面が出ますので、``GUID:xxxx``の右にあるクリップボードアイコンをクリックしてください。GUIDがクリップボードにコピーされますので、テキストエディタなどで保存します。



![スクリーンショット 2019-07-05 20.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/acdf4aa0-2e2a-a034-7c0d-d0419d3960f4.png)


# テスト用Notebookの読み込み

テスト用Notebookを  [opnescale-test.ipynb](https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/openscale-test.ipynb)からダウンロードします。
このnotebook全体は、下記のリンク先から確認することができます。

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

次にJupyter Notebookに今ダウンロードした``opnescale-test.ipynb``を読み込みます。
環境はWatson StudioのJupyterであっても、PC anacondaのJupyterであっても構いません。

## 認証情報の設定

読み込んだNotebookの上部には、先ほど確認したOpenScale API用認証情報を設定するためのセルがあります。ここに、下の図のように2つの認証情報を設定します。

![スクリーンショット 2019-07-05 21.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0ddf2120-9241-909b-5e45-9c4cf78669f6.png)

## Notebookの実行

後は、Notebookのセルを上から順に実行すると説明性の機能を呼び出すことが可能なはずです。
コードの重要な部分を順に解説します。

## サブスクリプションIDとトランザクションIDの取得
サブスクリプションID -> サブスクリプションオブジェクト -> 該当サブスクリプションの先頭トランザクションIDを順に取得しています。

```py3
# サブスクリプション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)
```

次のような結果が帰ってくるはずです。

```
subscription_uid =  3ec6ef2e-9b77-457c-a886-9d8fa3d1c127
transaction_id =  2ca6c049a6489f5b853c829e261db981-1
```

## 説明性の要求
取得したitansaction_idに対して説明性を要求します。処理には数秒から数十秒の時間がかかります。

```
# 説明性の要求

explanation = subscription.explainability.run(transaction_id, background_mode=False)
```

次のような結果になります。

```
================================================================

 Looking for explanation for 2ca6c049a6489f5b853c829e261db981-1 

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



in_progress
finished

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

## 管理テーブルの内容表示

次の3つの関数は、管理テーブルの内容を表示するためのものです。

```py3
# 該当サブスクリプションに対してpayload loggingの表示

subscription.payload_logging.get_table_content(limit=5)
```

![スクリーンショット 2019-07-05 21.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6fd49174-76a3-fcab-4248-a6ee5361fc8e.png)


```py3
# 該当サブスクリプションに対してパフォーマンスモニタテーブルの表示

subscription.performance_monitoring.get_table_content(limit=5)
```

![スクリーンショット 2019-07-05 21.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/105f325a-49d0-77ae-36d8-2358b0497cbe.png)


```py3
# 該当サブスクリプションに対して説明性テーブルの表示

subscription.explainability.get_table_content(limit=5)
```

![スクリーンショット 2019-07-05 21.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6a46a6b7-1b57-f863-2aa6-fbaec8a2930b.png)

## 説明性の詳細表示

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

```py3
# 説明性の最初の行の詳細表示

subscription.explainability.get_table_content()['explanation'][0]
```

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

```json
{'entity': {'status_lime': 'finished',
  'contrastive_explanations': {'pertinent_positive': [{'importance': '0.8481750931055593',
     'feature_name': 'sepal_length',
     'feature_value': '5.1'},
    {'importance': '0.0',
     'feature_name': 'sepal_width',
     'feature_value': '3.0'},
    {'importance': '1.6767040939512925',
     'feature_name': 'petal_length',
     'feature_value': '1.4'},
    {'importance': '1.4479540271933096',
     'feature_name': 'petal_width',
     'feature_value': '0.2'}]},
  'predictions': [{'value': '0',
    'explanation': [{'weight': 0.8495702931809025,
      'feature_name': 'petal_length',
      'feature_range': {'max': '1.60', 'max_inclusive': True}},
     {'weight': 0.10854468102412147,
      'feature_name': 'sepal_width',
      'feature_range': {'min': '3.30', 'min_inclusive': False}},
     {'weight': -0.038158434157534685,
      'feature_name': 'petal_width',
      'feature_range': {'max': '0.30', 'max_inclusive': True}},
     {'weight': -0.0037265916374412296,
      'feature_name': 'sepal_length',
      'feature_range': {'max': '5.10', 'max_inclusive': True}}],
    'probability': 0.8796816489561845},
   {'value': 'Others', 'probability': 0.1203183510438155}],
  'status_cem': 'finished',
  'input_features': [{'name': 'sepal_length',
    'value': '5.1',
    'feature_type': 'numerical'},
   {'name': 'sepal_width', 'value': '3.5', 'feature_type': 'numerical'},
   {'name': 'petal_length', 'value': '1.4', 'feature_type': 'numerical'},
   {'name': 'petal_width', 'value': '0.2', 'feature_type': 'numerical'}],
  'status': 'finished',
  'asset': {'id': '2cd7e89c-4c6f-421e-8944-c5cce1bb2fce',
   'name': 'scikit-learn lr model',
   'type': 'numeric_categorical',
   'deployment': {'id': '212e1882-b5a8-4f48-bf09-42dd6b0875b4',
    'name': 'scikit-learn lr deployment'}}}}
```

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

![スクリーンショット 2019-07-04 22.24.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0f74c437-310e-37a8-e7d0-8e36b30f3e60.png)