IBM Watson Studio AutoAI: Modeling for the rest of us 日本語解説 #3 補足

IBMのAutoAIのチュートリアル[IBM Watson Studio AutoAI: Modeling for the rest of us](https://www.ibm.com/cloud/garage/dte/tutorial/ibm-watson-studio-autoai-modeling-rest-us)の[日本語解説 #3](https://qiita.com/nishikyon/items/7fc07af97214e532b5f5) の**補足**です。

このページではチュートリアルで使用する以下の`AutoAI Model Access`notebookファイルの中身の説明をします。
  - ダウンロード先：　[AutoAI Model Access](https://ibm.box.com/s/63tq7rwbrf5mxx176w1xzy3f8524sweg): AutoAIModelAccess.ipynb

なので、まず[日本語解説 #3](https://qiita.com/nishikyon/items/7fc07af97214e532b5f5)を実施した上で、中身がわからない場合に参照してください。

#0. 事前準備
[日本語解説 #3](https://qiita.com/nishikyon/items/7fc07af97214e532b5f5)
が完了していることが前提です。

あるいは、[日本語解説 #3](https://qiita.com/nishikyon/items/7fc07af97214e532b5f5)をやりつつ、こちらも参照ください。

#1. AutoAIModelAccess.ipynb の解説
このノートブックでは、Watson Machine Learning（WML）APIを使用して、使用可能なモデルをリストして、使用可能なモデルを指定します。

次に、Churn modelを使用していくつかのレコードを予測します。

最後に、Deploymentを削除する方法を示します。

Watson Machine Learning（WML）APIの詳細情報は以下を参照してください。

- https://wml-api-pyclient-dev-v4.mybluemix.net/
- https://watson-ml-v4-api.mybluemix.net/
- https://wml-api-pyclient.mybluemix.net/

##1. notebook環境にWatson Machine Learning API clientの導入
Watson Studioの標準notebook環境には`Watson Machine Learning API client`が導入されていませんので、以下のように、仮想環境に対して直接`pip`コマンドを利用して`Watson Machine Learning API client`を導入します。

```sh

# Install the Watson Machine Learning API client
!pip install watson-machine-learning-client-v4
```
##2. Machine Learning Service の資格情報を設定
ここでMachine Learning Serviceを使用するための、自分のMachine Learning Serviceの資格情報をセットします。
 
```py
wml_credentials = {
  "apikey": "",
  "instance_id": "",
  "url": ""
}
```

##3. 必要なライブラリをImportし、WatsonMachineLearningAPIClientのインスタンスを作成
引数には２で設定した`wml_credentials`をセットします。

```py
from watson_machine_learning_client import WatsonMachineLearningAPIClient

client = WatsonMachineLearningAPIClient(wml_credentials)
```

##4. 今現在自分のMachine Learning Serviceに作成されているModelを表示
repositoryのlist_modelsメソッドを呼び出して、 今現在自分のMachine Learning Serviceに作成されているModelを出力します。

尚、ここはModelの表示の仕方をを示しているだけで、後続作業には関係がありません。

API Doc参考: https://wml-api-pyclient-dev-v4.mybluemix.net/#client.Repository.list_models

```py
# List models already in the repository
client.repository.list_models()
```
以下のような感じで出力されます。ちょっと列がずれてますが、項目と値が表示されています。2つ以上モデルを作っていれば複数行表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/93a5fe8b-d1bb-e99c-a736-5a8b43f60eb4.png)

##５. 今現在自分のMachine Learning Serviceに作成されているDeploymentを一覧表示
deploymaneのlistメソッドを呼び出して、 今現在自分のMachine Learning Serviceに作成されているDeploymentを出力します。

ここで表示された`NAME`を次の詳細出力で利用しています。

API Doc参考: https://wml-api-pyclient-dev-v4.mybluemix.net/#client.Deployments.list

```py
# List the deployed models
client.deployments.list()
```
以下のような感じで出力されます。ちょっと列がずれてますが、項目と値が表示されています。2つ以上モデルを作っていれば複数行表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ca462461-5ba0-9520-28ea-ba5fb845b2b2.png)

##6. Deployment 「Churn model deployment」の詳細を取得し、そこからguidを取得。
deploymentのget_detailsメソッドを呼び出して、 今現在自分のMachine Learning Serviceに作成されているDeploymentの詳細を`deployments_details`に取得します。詳細は辞書型(dict)で返ってきます。

その後、`resources`の値にリストで、各Deploymentの詳細が辞書型で入っていますので、今回使用する 「Churn model deployment」の`guid`を`deployed_uid`に取得しています。

もしDeploymentを他の名前で作っていた場合は、`Churn model deployment`の部分を変更する必要があります。

API Doc参考: https://wml-api-pyclient-dev-v4.mybluemix.net/#client.Deployments.get_details

```py
# Extract the information for "Churn model deployment" 
deployments_details = client.deployments.get_details()
deployed_uid = next(item for item in deployments_details['resources'] 
                    if item['entity']["name"] == "Churn model deployment")['metadata']['guid']
```

参考：　`deployments_details`の中身の例

```py
{'resources': [{'metadata': {'parent': {'href': ''},
    'name': 'Churn model deployment',
    'guid': '5e8b3001-23e1-447d-868a-a73022142f9e',
    'description': '',
    'id': '5e8b3001-23e1-447d-868a-a73022142f9e',
    'modified_at': '2020-02-21T04:51:19.040Z',
    'created_at': '2020-02-19T06:04:20.117Z',
    'href': '/v4/deployments/5e8b3001-23e1-447d-868a-a73022142f9e'},
   'entity': {'name': 'Churn model deployment',
    'custom': {},
    'online': {},
    'description': '',
    'tags': [{'value': 'dsx-autoai',
      'description': 'An identifier for distinguishing v4 deployments created from Watson Studio AutoAI'}],
    'status': {'state': 'ready',
     'online_url': {'url': 'https://us-south.ml.cloud.ibm.com/v4/deployments/5e8b3001-23e1-447d-868a-a73022142f9e/predictions'}},
    'asset': {'href': '/v4/models/cd8bfb7f-5d18-48f1-a32c-59eacdc1c7e8?rev=21eea238-da49-4b5f-a56a-a3466df89d10'}}}]}
```

##7. idとデータを引数にして、AutoAIで作成したモデルを使用して予測

client.deployments.ScoringMetaNames.INPUT_DATAは'input_data'と定義されているものですが(2020/02/21現在)、これをkeyとして、以下のソースに書かれているように予測したいデータの項目名と値を設定し、scoring_payloadに代入します。下記のソースには２レコード分のデータがあります。

その後、deploymentのscoreメソッドをuidとscoring_payloadを引数にして呼び出して、 予測結果を取得しています。

API Doc参考: https://wml-api-pyclient-dev-v4.mybluemix.net/#client.Deployments.score

```py
# Execute the model
scoring_payload = { client.deployments.ScoringMetaNames.INPUT_DATA: 
                   [{
                     'fields': ['ID','Gender','Status','Children','Est Income','Car Owner',
                                'Age','LongDistance','International','Local','Dropped',
                                'Paymethod','LocalBilltype','LongDistanceBilltype',
                                'Usage','RatePlan'], 
                     'values': [[1,'F','S',1.0,38000.0,'N',24.393333,23.56,0.0,206.08,0.0,'CC','Budget','Intnl_discount',229.64,3.0],                      
                                [6,'M','M',2.0,29616.0,'N',49.426667,29.78,0.0,45.5,0.0,  'CH','FreeLocal','Standard',75.29,2.0]
                               ]
                    }]
                  }
predictions = client.deployments.score(deployed_uid, scoring_payload)

```

実行には多少時間がかかります。以下の赤で囲んだ部分の`*`が数字に変わる(=完了)まで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b514b63a-4ad9-de56-4a57-90c480079779.png)

##8. 予測の表示
実行結果predictionsの中身を表示します。

```py
predictions
```
以下のように出力されます。valuesの中身が配列になっていて、それぞれ一番目のレコードの結果、二番目のレコードの結果となります。
「一番可能性の高い予測値」、「各クラス(今回はFとT)の確率のリスト」　が予測結果となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a44f2cd2-3687-df09-cf65-0bb927a1844c.png)

##9. 予測を見やすく表示
辞書型のままだと見にくいので、見やすいように整形して表示ししています。自分で結果を加工するときの参考となるコードです。

```py
for prediction in predictions['predictions'] :
    for result in prediction['values'] :
        print('Prediction: ' + str(result[0]) + ", probability: [" + 
              str(result[1][0]) + ', ' +  str(result[1][1]) + "]" )

```

表示例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4598a041-c814-3d97-e2ae-39c5cce9e94c.png)

##10. Deploymentの削除 
以下はDeploymentを削除するコードです。Deployment削除したくない場合は実行しないでください。

removeメソッドを使用して、リポジトリからモデルを削除できます。 以下の例では、すでにuidを持っているため、それを使用してDeploymentを削除します。 この上で実施したものと同じ方法でuidを取得すれば、すべてのDeploymentを削除できます。

似たような操作で、保存されたmodelも削除できます。（ここでは説明していません）

###10.1: 比較のために現在のDeploymentの一覧を表示

```py
# Display the list first
client.deployments.list()
```
表示例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/34b5b3ca-804a-a62e-a2e0-4fd6005f6f08.png)

###10.2: uidを指定してdeploymentを削除

```py
# Remove the deployment
client.deployments.delete(deployed_uid)
```
出力例:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b14b5b29-6ddf-9341-1936-44e591670da3.png)



###10.3: 比較のために現在のDeploymentの一覧を表示

```py
client.deployments.list()
```
最初の表示と比べて、uidで指定したDeployment（=`Churn model deployment`）が消えているのを確認します。

出力例:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/be9bbe1d-f7f5-d9a7-f08d-e6761557eabe.png)

以上です。