AzureのAIサービスを利用してみる5【Azure Machine Learning Designerで推論パイプライン作成】

## はじめに
自分でPythonのコードを書いてAIのモデル構築といった事は難しいけど、手軽にAI構築環境を利用したいといった場合にクラウド上のサービスを利用すると、機械学習モデルを作成、トレーニング、デプロイをGUI操作で利用する事ができます。

本記事では[前回の記事](https://qiita.com/s_yosh1d/items/37ae9cbd945976834940)に続いて、**Azure Machine Learning Designerを使用し、作成した学習パイプラインから推論パイプラインを構築し、予測を実施する方法**について試してみたいと思います。

**推論パイプラインは学習パイプラインと異なり1から作成する必要性はありませんが、成功した学習パイプラインのジョブを元に改良する必要があります。**


## 何をしたい？できる？
- **Azure上で、Azure Machine Learning Designerを使って推論パイプライン作成**
- **KaggleのHouse Pricesデータを使って試してみる**

## House Pricesデータについて
Kaggleの[House Prices](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)データセットには、アイオワ州住宅価格の様々な特徴量が含まれており、例えば、住宅の広さ、築年数、地理的な位置情報、材料品質などが含まれていて、この特徴量を使用して、**住宅価格を予測するための機械学習モデルを構築する形**となります。
(データのダウンロードにはKaggleへのアカウント作成が必要になりますが、ここでは割愛します。)

 <img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b6b41732-17ae-926c-2f49-2f671410c6b0.png>

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

- train.csv 
=>機械学習の学習用データ(正解を含めて記載されているデータ)
- test.csv　
=>作成したモデルに渡して予測を行う為のデータ(正解はKaggle側が持っている)
- data_description.txt
=>説明変数の詳細(特に質的変数の略字の意味等)
- gender_submission.csv　
=>Kaggleへの提出するファイルの例


**学習用データであるtrain.csvは**住宅の広さや築年数のデータがcsv形式で記載されており、
**最終的に予測したいSalePriceという列に販売価格が記載**されています。

学習データの説明は一部抜粋となりますが以下の通りで、SalePriceを予測する為に利用します。

|列名     |説明　　　　　　　|
|:----------------|:----------------|
|MSSubClass     |住宅の種類|
|MSZoning       |売却先の一般的なゾーニング区分|
|LotArea        |敷地面積|
|YearBuilt      |建設時期|
|OverallCond    |家全体の状態|
|SalePrice      |住宅の価格<font color="Red">**<=この値を様々な説明変数を元に予測したい**|




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

- リソースグループ名：ai_rg102
- Azure machine learning ワークスペース名：test-wkspace102
- リソースを作成するリージョン：Japan East(東日本)
- ドラフト名：Predict House Prices
- データセット名：Test House Prices
- 実験名：predict-house-prices


### 1. 推論用パイプラインの構築
推論ではtest.csv内の1460件分の販売価格の予測をまとめて行います。
学習パイプラインで実行完了したジョブの画面上方で[推論パイプラインの作成]から[バッチ推論パイプライン]を選択します。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/64dc21b2-e67e-cd67-cadb-06b78ba87cdd.png>

### 1-1. 推論用パイプライン名の変更

鉛筆マークをクリックしてドラフト名(パイプライン名)を変更します。
ここでは、[Predict House Prices]に変更しています。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cc9f48c0-6524-05a4-3b34-6edf430b7ae3.png>


#### 1-2. House Prices用のTest用データ登録
House Prices用の予測したいSalePriceの記載がないTestデータをアップロードする為、[データ]タブの[+]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fe9ec26a-c1d0-696f-9cff-b4e0425c1b72.png>

データセット名を入力し、種類を表形式にして[次へ]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b4830ca1-821b-1d5d-0437-678d4312b0b1.png>

Kaggleからダウンロードしたデータを使うので、[ローカルファイルから]をクリックして[次へ]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c792a7ec-da01-20ac-dcfc-3791b49e1d8c.png>

データを保存先となるデータストア(クラウド上のデータ置き場)を指定します。
ここではワークスペース作成時に、併せて作成されたAzure Blob Storageを選択しています。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/4f41744a-241d-5619-9a87-93272b36bf0a.png>

[アップロード]から[ファイルのアップロード]を選択し、House Prices用のtest.csvを選択します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a700ad90-990f-76b5-d904-b7a922bf9463.png>

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bc706a96-13b4-5155-a27b-721877e12755.png>

設定で項目が正しく選択されている事を確認します。
- ファイル形式　：区切り
- 区切り記号　　：コンマ
- エンコード　　：UTF-8
- 列見出し　　　：すべてのファイルで同じヘッダーを利用
- 行のスキップ　：なし

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/396d2041-fded-d7e4-8c14-545bb1d3884b.png>


スキーマでは利用する変数の選択を実施します。
ここでは、後のパイプライン上で変数を選択するので除外は実施しません。
また、質的変数を[文字列]に変更し、広さのような量的変数を[小数点(ドット'.')]にします。
「次へ」を指定後に、レビューで登録内容に問題が無い事を確認し[作成]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/61cde4fb-d41b-6fdb-c26e-934fefa2bf2f.png>
画面左側に、データが登録されている事を確認します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5e71e2fc-9f5c-276d-1ace-975cd16d5021.png>

画面中央の学習用パイプラインで利用していたHouse_Pricesデータセットを右クリックして削除を行い、登録されたTest_House_Pricesデータセットをドラッグ&ドロップで画面の中央に移動させます。
移動後、[Test_House_Prices]の〇から[Select Columns in Dataset]の上部の〇へドラッグを行い矢印を連結させます。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/761968c6-c278-5a53-f094-eaa16b261e72.png>

#### 1-2. 特徴量選択から予測値の選択削除

SalePriceの記載がないTestデータを用いて価格の予測を行う為、**[Select Columns in Dataset]で選択されているSalePriceを削除します。**
[Select Columns in Dataset]をダブルクリックし、[列の編集]からSalePriceを削除します。
[推論パイプラインの作成]で作成されたパイプラインは、学習パイプライン時に選択した状態がコピーされていますが、登録したTest_House_Pricesデータセットには存在していない項目なので、色が変わっているのが確認できます。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/117cc393-78a8-c2e5-26a7-f0a22ba7abc9.png>


#### 1-3. 不要なコンポーネントの削除
[Evaluate Model]コンポーネントを右クリックして、削除を実施します。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/0a8475b8-4c95-b1e0-fb67-eee1d8b9d35f.png>



#### 1-4. CSVへの変換コンポーネントの接続
予測した価格をcsv出力させる為、[Convert to CSV]を利用します。
検索部分から"Convert"と入力し、表示されたコンポーネントから[Convert to CSV]をドラッグ&ドロップで画面の中央に移動させます。
[Score Model]の〇から[Convert to CSV]上部の〇へドラッグを行い矢印を連結させます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a16d368c-207b-31a8-b6e1-8281d5d6fd9e.png>


### 2. 推論の実行
画面右上の[▷送信]をクリックします。

<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/2c86833c-ffc6-23a2-7040-8bd78579c9bd.png>

表示された画面で[新規作成]を選択し、実験名を入力して[送信]をクリックします。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cc7b3a5c-32a0-8b7a-912d-b2b0fd3bb15e.png>


画面左側に[ジョブの詳細]というリンクが表示されるので、クリックします。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/934f9046-be62-5121-650a-ed0affd9a86e.png>

パイプラインが正常に完了した事を確認します。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bd172a4f-ec92-162e-c765-8b415d15c6ba.png>


[Convert to CSV]をダブルクリックし、[出力とログ]タブから[データにアクセスする]アイコンをクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7ffd1b3f-61b4-ede0-19ce-742f58fb79e6.png>

表示された別画面からcsvファイルをダウンロードします。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d12c9027-f81b-031f-339e-4f881797e142.png>


ダウンロードしたdata.csvを開いてScored Labels列を、Kaggleからダウンロードしたsample_submission.csvのSalePrice列に上書きします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fd7c7722-3488-ffb3-3fd3-bf98c885532e.png>


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

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bd710aa7-c783-99f2-d925-f5ff33d9e9f6.png>

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/31a95005-1943-ca6f-6f79-058d5f6273ef.png>

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a4bc24c4-dec3-34ce-6ec3-d48b35b64758.png>



## 参考及びリンク

[Azure Machine Learning デザイナーのアルゴリズムとコンポーネントのリファレンス](https://learn.microsoft.com/ja-jp/azure/machine-learning/component-reference/component-reference)
[チュートリアル: デザイナー - 機械学習モデルをデプロイする](https://learn.microsoft.com/ja-jp/azure/machine-learning/tutorial-designer-automobile-price-deploy?view=azureml-api-2)
[Azure Machine Learning デザイナーを使用してバッチ予測を実行する](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-run-batch-predictions-designer)
[AzureのAIサービスを利用してみる4【Azure Machine Learning Designerで学習パイプライン作成】](https://qiita.com/s_yosh1d/items/37ae9cbd945976834940)