Azure Machine Learning Studio の AutoML GUIでの展開時に、probability の数値も出力させる

# 編集履歴

- 2020/10/14 **[4. 推論用のコードの更新]**: プログラムコードの更新
- 2020/10/12 **[4. 推論用のコードの更新]**: プログラムコードの更新
- 2020/10/6 **[4. 推論用のコードの更新]**: プログラムコードの更新 

# 背景

Azure Machine Learning の AutoML は、Studioの画面上からジョブ実行と結果確認。そして、ACIもしくはAKSへの展開まで、GUIで行えます。ML for All Skillのゴールに向かってGUIでの作業も出来る事は素晴らしいと思います。

AutoMLには推論用のコードを自動生成する機能もありますので、更に便利です。

(プレビュー) コードなしのモデル デプロイ:
https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-no-code-deployment

ところが、この展開したモデルの推論結果に、いわゆる **Probability**、もしくは**score** とでも言いましょうか。つまり数値での**確度の情報**が入っていません。

分類 (Classification) での出力結果のサンプル

```json
'{"result": "no", "score": [{"no":0.9452897547,"yes":0.0547102403}]}'
```

このモデルは以下のチュートリアルで作成しました。

チュートリアル:Azure Machine Learning の自動 ML で分類モデルを作成する:
https://docs.microsoft.com/ja-jp/azure/machine-learning/tutorial-first-experiment-automated-ml

ここでは、カスタムデプロイ アセットを使って、Probability も出力するようにします。

# 準備するもの

- Azure のSubscription

# 手順

## 1. モデルの作成

自由に作成ください。
ここでは、先のチュートリアル (銀行のマーケティング担当者が、普通預金などから、定期預金にする顧客を類推するモデルを作成する) にある AutoML を利用してモデルを作成します。

## 2. モデルの選択

AutoMLでは、複数の学習ジョブを実行します。一番良いと思ったモデルを選択します。
アンサンブル学習を行っている場合が殆どだと思います。その場合は、`VotingEnsemble` が殆どのケースで最も良い数値情報を持っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/564a0ddb-d81c-9290-2729-e9a3e3ea289c.png)

## 3. AutoML が生成したコードのダウンロード

[出力とログ]から、ジョブが生成したファイルの確認が出来ます。[outputs]フォルダの中から、以下のファイルをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/eecef5d8-738e-fcff-82ee-461ea67aca6e.png)


| ファイル名 | 説明 |
| --- | --- |
| conda_env_v_1_0_0.yml | anaconda の環境ファイル |
| scoring_file_v_1_0_0.py | 推論用のファイル |

## 4. 推論用のコードの更新

run 関数を以下の様に変更します。
ご自由にリファクタリングしてください😊

```python
def run(data):
    try:
        result_predict = model.predict(data)
        result_class_name = model.y_transformer.classes_
        result_predict_proba = model.predict_proba(data)

        result_with_score = pd.DataFrame(result_predict_proba, columns=result_class_name).to_json(orient='records')
        result = (("{\"result\": \"%s\", \"score\": %s}" % (result_predict[0],result_with_score)).encode('ascii', 'ignore')).decode("utf-8")

        return result

    except Exception as e:
        result = str(e)
        return json.dumps({"error": result})
```

少し解説します。

probabiltyの取得には、predict_proba() で行えます。
配列で結果が返ってきますが、その並び順が、`model.y_transformer.classes_` の並び順になっています。

適切ではないかと思いますが、scikit learn のリファレンスの中での RandomDorestClaasifier のものを例示します。

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.predict_proba

## 5. モデルのACIへの展開

Azure Machine Learning Studio のモデルの画面に戻ります。[デプロイ]から以下の画面を参照して

  [エントリ スクリプト ファイル]
  [Conda 依存関係ファイル]

を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/d42feade-fc4e-79e3-2ca5-56e9f6f64508.png)

注: この設定では動作確認を優先しているため。推論のエンドポイントは何も**保護されていません**。必要に応じて保護の設定を行ってください。

認証の設定 - 画面で [認証を有効]

TLS を使用して Azure Machine Learning による Web サービスをセキュリティで保護する:
https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-secure-web-service

仮想ネットワークを使用して Azure Machine Learning 推論環境をセキュリティで保護する:
https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-secure-inferencing-vnet

これで [デプロイ] を押して、ACIへの展開が完了するまで5分程度待ちます。

## 6. 結果確認

モデルがACIに展開されると、推論用のURLが作成されます。それをクリップボードにコピーするなどします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/d77b7560-0e49-883c-e2c4-db1f395d732a.png)

RESTの呼び出しは任意の手段で😊
ここでは、Visual Studio CodeのREST Clientを使います。

Rest Client
https://marketplace.visualstudio.com/items?itemName=humao.rest-client

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/0f35e452-279a-c4ae-f9e9-0216447848e0.png)

## 7. 必要に応じてクリーンアップ

ACIは展開時から停止あるいは削除するまで**課金**対象です!

適時、停止するなり、削除するなりしてください😊

# まとめ

現時点では画面だけで操作しても、出来ない事が多少はあります。が、少し手を加えるだけで、カスタマイズも可能です。
今後のAzure Machine Learning の機能強化にも期待しましょう😊

サンプルコード:
https://github.com/dahatake/Azure-Machine-Learning-sample/tree/master/6.AutoML-Probability