AzureのAIサービスを利用してみる3【AutoML】

## はじめに
近年では、自分でPythonのコードを書いてAIのモデル構築といった事は難しいけど、手軽にAIを利用したいといった場合に、ノンコードで簡単に機械学習のモデリングを自動化する技術であるAutoML(Automated Machine Learning)を利用する事ができるようになっています。

基本的には自動化といっても、データ収集からサービス提供まで全部自動化ということでは無く、**利用するデータ(特徴量)の選択や、手法であるアルゴリズム(線形回帰や勾配ブースティング等)、ハイパーパラメータの選択部分について自動化**がなされます。

欠損値が多いデータがある場合には、AutoMLで利用する前に行の削除や平均値や最頻値へデータを置き換える等といった処理が個別に必要になります。

特にクラウド上で利用できるサービス上では、モデル構築後にクリックするだけでAPI化して外部展開するような仕組みも用意されていますので、Python等でコーディングすることなくAIの実装を行うことができます。(勿論、データサイエンティストの知識があるのが望ましいです)


本記事では、コンテナでAPI化まで簡単に実行できるAzureのAutoMLを試してみたいと思います。

|![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/679c1c36-4b0f-2260-dfda-b17f1afb061b.png)
|:-:|


## 何をしたい？できる？
- **Azure上で、AutoMLを使ってみる**
- **Kaggleのタイタニックデータを使って試してみる**


## Kaggleとは
企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う予測モデリング及び分析手法関連プラットフォームで、端的にいうと以下のような形です。

- 企業等がデータと賞金を用意
- Kaggleに参加しているデータサイエンティストがデータを分析しAIモデル作成
- 作成したモデルでコンペの上位を取ると賞金とメダル貰える
- メダルが溜まっていく事で、kagglerの順位が上がる(ネットゲームの順位みたいな感じ)

|<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/4a7b7041-9fbb-f776-467f-2e55fffbe3c2.png>
|:-:|

**Kaggleでは初心者向けに公開されている [タイタニックの生存者予測](https://www.kaggle.com/competitions/titanic/data)というデータセットがあるので、今回はこちらを利用します。**
(データのダウンロードにはKaggleへのアカウント作成が必要になりますが、ここでは割愛します。)

 <img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/0872fcbd-1590-e31a-2e9e-1e259c42b385.png>


ダウンロードするデータは以下の3つになります。

- train.csv 
=>機械学習の学習用データ(正解を含めて記載されているデータ)
- test.csv　
=>作成したモデルに渡して予測を行う為のデータ(正解はKaggle側が持っている)
- gender_submission.csv　
=>Kaggleへの提出するファイルの例


**学習用データであるtrain.csvは**氏名や年齢等の乗客データがcsv形式で記載されており、
**最終的に予測したいServivedという列に0(死亡)か1(生存)で表示**されています。

学習データのデータの説明は以下の通りで、Survivedを予測する為に他の項目を利用します。

|列名     |説明　　　　　　　|
|:----------------|:----------------|
|PassengerId      |乗客識別ID|
|Survived         | 生存フラグ（0=死亡、1=生存）  <font color="Red">**＜＝＝これを予測したい**|
|Pclass           |旅客クラス（1＝1等、2＝2等、3＝3等）|
|Name             |乗客の名前|
|Sex               |性別（male＝男性、female＝女性）|
|Age               |年齢。一部の乳児は小数値）|
|SibSp               |同乗している兄弟（Siblings）や配偶者（Spouses）の数|
|Parch               |同乗している親（Parents）や子供（Children）の数|
|Ticket               |チケット番号|
|Fare               |旅客運賃|
|Cabin               |客室番号|
|Embarked              |出港地（C＝Cherbourg：シェルブール、Q＝Queenstown：クイーンズタウン、S＝Southampton：サウサンプトン）|

## 設定手順

画面例で指定されている以下のパラメータは、環境によって異なる内容なので適宜変更して下さい。

- リソースグループ名：ai_rg101
- Azure machine learning ワークスペース名：test-wkspace101
- リソースを作成するリージョン：Japan East


### 1.リソースグループ作成
サインインやAzureでリソースグループの作成については、
[AzureのAIサービスを利用してみる1](https://qiita.com/s_yosh1d/items/360834a8d4c6439abd2c#1-azure%E3%81%A7%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BD%9C%E6%88%90))の記事と同じ内容となりますので割愛します。


### 2.Azure Machine Learningのワークスペース作成

ワークスペースとはAzure Machine Learning最上位のリソースで、ワークスペースでは以下の内容が実施可能となってます。
- モデルの学習と作成
- 検証
- 予測
- デプロイ

|<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f5254c13-0aea-33ea-b332-fccf09ca7209.png>
|:-:|



リソースグループの概要画面で、[作成]を選択します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d07db618-3426-c18e-0f4b-27b5ab97e9ab.png>


Marketplace画面に遷移するので検索部分に、[azure machine learning]と入力して検索を行い、表示されたAzure Machine Learningを選択し、作成をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e72366b3-8cfe-524c-d372-08da3300e186.png>

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/28de9dd6-eefc-3c0b-0f08-92f01c966b05.png>


ワークスペース名をtest-wkspace101として、Japan Eastリージョンを指定して
[確認及び作成]をクリック後、[作成]をクリックします。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bb116bc8-41ac-75d1-df85-bffb59535ef8.png>

:::note info
ストレージアカウントやキーコンテナ、Application Insightsは新規作成のままにしています。
(ワークスペース名を入力後に表示される状態のまま)
:::

### 3.Azure Machine Learning Studioへのアクセス

作成完了後に、リソースグループ上にあるワークスペース名のtest-wkspace101をクリックし、表示された画面にある、[スタジオの起動]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/660f78ad-3e15-8f65-2195-f21dcd514f5e.png>

### 4.データセットの登録
Azure Machine Learning Studioの画面左側にある[自動ML]をクリックし、表示された画面で[新規の自動機械学習ジョブ]を選択します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/29b22e8a-f2dc-063e-e5d8-2e8a46ca5136.png>


表示された画面で[作成]をクリックし、データアセットの説明等の入力を行います。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5759343d-f43d-3519-7b28-da3a689c6b66.png>

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/365bef4f-dea7-2414-dbce-056b695c1a4a.png>

データ資産のソースを選択で、[ローカルファイルから]をクリックして次に進みます。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/0af4d90a-059a-6993-42c8-92f7095385ad.png>


データストアの選択では、データストアの種類は[Azure Blob Storage]にして、ワークスペース作成時に新規作成されたBlobストレージを選択します。
(デフォルトでワークスペース作成時に合わせて作成されたものが選択済の画面になっているはずです)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/207fbe9b-84da-128d-5de1-5a433c214c05.png>

ファイルまたはフォルダの選択で、[アップロード]から[ファイルのアップロード]を選択し、**train.csvを選択し次へ進みます。**
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a33b7c6e-87b9-14b4-12a3-5f80dd449934.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ea28ab23-877f-5518-a50a-3b2f0c9f7a47.png>


設定で項目が正しく選択されている事を確認します。
- ファイル形式　：区切り
- 区切り記号　　：コンマ
- エンコード　　：UTF-8
- 列見出し　　　：すべてのファイルで同じヘッダーを利用
- 行のスキップ　：なし
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/1ca6f3d7-8496-c360-f23c-2da3432cd0db.png>


スキーマでは利用する変数の選択を実施します。
**ここでは、以下の変数のチェックを外して次に進みます。(利用しない)**

- PassengerId  :ただのIDなので削除
- Name         :氏名は生死に関係なさそうなので除外
- Cabin        :欠損値(空白[Null])が多すぎるので使え無さそう

Ticket番号も生死は関係無さそうですが、AutoMLの実行結果で重要な変数扱いになるか確認したいので、あえて残しておきます。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9d0d1a55-d763-db9e-adf1-8c9219004287.png>


レビューで登録内容に問題が無い事を確認し[作成]をクリックします。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/09daf64b-4118-30d8-faa5-eea32c10a2c4.png>


### 4.自動MLの作成と実行
登録したデータアセットを選択して、[次へ]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a2a55b04-48e2-5131-91ae-daf55c89562d.png>


任意の実験名を入力し、**ターゲット列にSurvivedを指定します。**
学習に使う仮想マシンを作成する為、[+新規]をクリックします。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8bfc82a1-acb4-a730-adca-3e4638589f3c.png>

この例ではデータ数の少ないCSVファイルの学習の為、GPUを使わず、仮想マシンのサイズはStandard_DS12_v2を使います。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9583b263-6d53-e763-b360-baaf4cc5045a.png>

次の画面で、任意のコンピューティング名を入力し、クラスタを構成する仮想マシンの最大数を2台にして[作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7a9531b3-a0f1-692c-2309-500a55d0e8e9.png>

戻った画面で、作成したクラスタ名を指定して[次へ]をクリックします。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8041cb07-c879-70bd-08c6-8081a5744c3c.png>

タスクは分類を指定し、画面下方の[追加の構成設定を表示する]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/3bc25f5d-a55f-26bb-d8ba-f0d4d646b2de.png>


以下の設定値を指定して画面下方の[保存]をクリックします。
**生死の正解を予測していので、精度(Accuracy:正答率)を指定してます。**
**ある程度で停止したいので、最大1時間でモデル選択や学習を停止するように指定しています。**

- プライマリメトリック　:精度
- トレーニングジョブ時間:1
- 最大反復回数　　　　　:1


<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5d252597-7332-73cb-8828-d4e2330390fe.png>

検証とテストの種類を指定し、画面下方の[終了]をクリックします。
この例では時間短縮の為、交差検証を指定していても2分割としています。
(片方で学習しもう一方で精度試験を行うことを入れ替えて実施するイメージです。)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/aaa9c849-ae35-ddff-387d-da92510fa538.png>

学習の実行終了まで待ちます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ddbd2863-cd90-33b9-5f78-086d5bb51bc2.png>

### 5.実行結果の確認
実行完了後、モデルタブを選択します。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/094c4091-89ab-29cc-8514-b8543857bb53.png>


精度の良い順でモデルが表示されるので、最上位のものをクリックします。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c8d39440-4d7d-5cec-74e4-68e42a06b96b.png>

メトリックタブで評価指標を確認できます。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/da63de3d-e095-18a1-0678-087c6c9213c6.png>

また、説明(プレビュー)をクリックすると予測に効果のある説明変数を確認することができます。
性別が一番重要な特徴で、残しておいたTicket番号は重要では無かった点が確認できます。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8ce9d2e4-e459-165e-9de9-7378c5f9a3ec.png>

### 6.test.csvの予測
最上位の精度のモデルを使い、タイタニックデータの正解の分からないtest.csvデータについて予測し、Kaggleに投稿して精度を確認します。

**まず、test.csvデータをデータアセットにTest_titanicという名前で登録します。**
画面例は学習用データの登録と殆ど同じなので割愛します。
(表形式で登録し、学習用データと同じように不要な説明変数の削除も行う)
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/850b9a6a-bc1b-501a-c7ef-ecce706e552b.png>

データアセット登録後、最上位の精度のモデルの画面に移動し、[テスト結果(プレビュー)]タブをクリックすると、画面右側にテストで利用するコンピュータークラスタとデータセットの選択を実施する画面が表示されるので、選択を行い、画面下方の[テスト]をクリックします。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8b31810a-45ff-eedc-b58d-161d39e13593.png>

予測の完了後、表示名をクリックします。
**test.csvには正解データは入ってないので、精度は利用不可となり表示されないです。**
**(正解を知っているKaggleに投稿して初めて精度が判明する)**
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e18b20d8-0417-9537-7c8b-044eb5cd7e53.png>

表示された画面の[出力とログ]のタブをクリックし、predictions.csvをダウンロードします。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c86fb701-cc72-9727-37c4-39db2afa3335.png>

ダウンロードしたpredictions.csvを開いてSurvived列を、Kaggleからダウンロードしたgender_submission.csvのSurvived列に上書きします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ed27ffba-e9c0-82b0-efba-11eb95a9907d.png>


Kaggleのタイタニックデータの[Submit Predictions]をクリックして、データをUploadすると精度を確認することができます。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bab42847-2780-b8ad-a5e6-d5e4d927e1d8.png>

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/741662c2-a0d0-461d-72ab-6186f17369c3.png>

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/24c84c87-b384-1c6a-5761-fba07a84f289.png>


### 7.デプロイの実施

精度の一番良いモデルをデプロイ(REST APIを使い予測できるようにする)します。
対象のモデル(アルゴリズム)を選択し、画面上部の[▷デプロイ]をクリック、[リアルタイムエンドポイント]を選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7cebb007-4c7e-4eee-91c0-7e2454b1bb31.png>

画面右側に表示される画面で、任意のデプロイ名とデプロイ先のコンピューティングの種類を選択します。
この例では、Azureコンテナインスタンス(ACI)上にデプロイを実施します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7edcb088-910d-38c7-95d3-dc1602fa0023.png>

デプロイ完了後、エンドポイントが確認できるようになります。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ca9a5b4e-6625-feaa-dfe0-5991bef07491.png>

:::note warn
完了後は、料金がかからないように、リソースグループ毎削除を行ってます。
:::

### 参考までにかかったコスト 

実際にここまでAzureを利用してかかったコストですが
画面キャプチャしながら進めたので、開始して5時間前後利用しましたが、以下の請求となりました。
(学習開始からの時間は1.5時間程度)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/845a56f7-5600-cc92-7354-2984d8967ec4.png>





## 参考及びリンク
[AzureのAIサービスを利用してみる1【Cognitive ServicesのComputer Vision】](https://qiita.com/s_yosh1d/items/360834a8d4c6439abd2c)
[AzureのAIサービスを利用してみる2【Cognitive ServicesのCustom Vision】](https://qiita.com/s_yosh1d/items/2d1e250b74e6176d4220)
[Azure Machine Learning のドキュメント](https://learn.microsoft.com/ja-jp/azure/machine-learning/)
[自動機械学習 (AutoML) とは](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-automated-ml)
[チュートリアル: Azure Machine Learning スタジオでコードなし AutoML を使用して分類モデルをトレーニングする](https://learn.microsoft.com/ja-jp/azure/machine-learning/tutorial-first-experiment-automated-ml)