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

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

本記事では[前回の記事](https://qiita.com/s_yosh1d/items/416dd139d5c74f934bc5)に続いて、**Azure Machine Learning Designerを使用して特徴量選択から検証・評価までの機械学習パイプラインの構築をドラッグ＆ドロップで実施する方法**について試してみたいと思います。
<font color="Red">**パイプライン作成を目的とした内容ですので、特徴量エンジニアリングについては割愛しています。**</font>

AutoMLとは異なり、処理の順番やどの機械学習モデルを利用するかについて事前に考える必要がありますので、AIやデータサイエンティストの知識があるのが望ましいですが、Azure Machine Learning Designerではパイプラインのサンプルがある為、どのように処理を接続するかについては確認することができます。



|![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/11bbba43-cb8a-143e-037b-25cc1ad2f714.png)
|:-:|

## 何をしたい？できる？
- **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">**<=この値を様々な説明変数を元に予測したい**|


## Azure Machine Learning Designerについて

本記事では、Azure Machine Learningのデザイナー機能を使い、モジュールを繋ぎ合わせて学習環境を構築する形となりますが、**サンプルを事前に確認する事で、利用するモジュールや繋げ方を参考にする事ができます。**
**サンプルを改良して使う方が楽だとは思いますが、記事では逐次モジュール選択含めての構築例として記載してます。**

上記のHouse Pricesデータ予測という回帰問題のモデルを作成したいという内容ですので、参考にするものとしてはRegression(回帰)に関するモデルとなります。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cfa6326a-184e-b894-ce66-b3442feaf7e3.png>

実際に[Regression - Automobile Price Prediction (Basic)]というサンプルを確認すると、
上の方から
- Azure側の用意しているデータ (Automobile price data)
- データで使う説明変数(列)の選択 (Select Columns in Dataset)
- 欠損値の多い説明変数の削除 (Clean Missing Data)
- データの分割 (Split Data)
- 学習アルゴリズムと接続して学習
- モデルの評価

というような形となっている事が確認できます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/19fee4c3-807b-bfe9-1f77-712c2c2518e4.png>




以下の点を修正する事で作成できそうな事が推測できます。

- **Azureの用意しているデータをHouse Prices用のデータに置き換える**
- **データで使う説明変数(列)の選択をHouse Prices用のデータに合わせる**
- **必要そうなコンポーネントを別途追加してみる**
- **学習アルゴリズムを変えたい場合は変更**


## 設定手順

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

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

### 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)の記事と同じ内容となりますので割愛します。
(今回の記事用に名前はai_rg102に変えている)

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

Azure Machine Learningのワークスペース作成については、
[AzureのAIサービスを利用してみる3](https://qiita.com/s_yosh1d/items/416dd139d5c74f934bc5#2azure-machine-learning%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E4%BD%9C%E6%88%90)の記事と同じ内容となりますので割愛します。
(今回の記事用に名前はtest-wkspace102に変えている)

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

作成完了後に、リソースグループ上にあるワークスペース名のtest-wkspace102をクリックし、表示された画面にある、[スタジオの起動]をクリックします。


<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e4f342db-6700-0a62-9964-a887d080189b.png>

### 4. Azure Machine Learning上で使うコンピューティング作成
作成したワークスペース上で実行する処理の種類で必要となるコンピューティングが異なります。
コンピューティングの種類や実施される処理については以下の通りです。

|種類     |説明　　　　　　　|
|:----------------|:----------------|
|コンピューティングインスタンス|Notebook実行用の仮想マシン|
|コンピューティングクラスター|学習や推論の実行環境|
|Kubernetes クラスター|独自のKubernetesクラスターを組み込んで利用|
|アタッチされたコンピューティング |仮想マシン、Databricksクラスター等の独自コンピューティングをアタッチ|


Azure Machine Learning Studioの画面左側にある[コンピューティング]をクリックし、表示された画面で[コンピューティングクラスター]タブから[+新規]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e1b297eb-ea83-f344-65d0-077555398047.png>


作成する仮想マシンの場所や種類を選択します。
重い処理を実施はしないのでStundard_DS11_v2を指定して進めます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/63d52f24-bccd-8223-c024-bf88457e7da4.png>


コンピューティング名やクラスタを構成するノードの最大数を指定します。
(ここでは最大2台構成にしています)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/34b03143-973c-d563-6a94-9d630bb68f3b.png>






### 5. MLパイプライン作成
本記事では、データをHouse Prices用のデータに置き換えると共に、学習アルゴリズムについてはBoosted Decision Tree Regressionを利用してMLパイプライン作成を実施します。
詳細は[リンク](https://learn.microsoft.com/en-us/azure/machine-learning/component-reference/boosted-decision-tree-regression)に記載されてますが、**LightGBMアルゴリズムに基づいており、スケーリングする必要がなく，欠損値をそのまま扱うことができるといった特徴**があります。


#### 5-1. ドラフト作成開始と設定
Azure Machine Learning Studioの画面左側にある[デザイナー]をクリックし、表示された画面で[+]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/4843370e-55a2-4826-c470-eb3c7dc6b66e.png>

表示された鉛筆マークをクリックしてドラフト名(パイプライン名)を変更します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fd17c38b-c10c-9a51-f2c6-43d69215bccf.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a53c418a-4caa-8a09-63df-810786dfb548.png>

画面右上の[設定]をクリックし、作成したコンピューティングの種類とクラスタ名を選択します。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a5b26b3d-544c-9527-dec5-e051dbd8f5a1.png>



#### 5-2. House Prices用のデータ登録
House Prices用のデータを利用する為、[データ]タブの[+]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7dfa52ef-9800-3dc6-062f-8ba2496acb06.png>

データセット名を入力し、種類を表形式にして[次へ]をクリックします。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b5e5e99f-5c54-4837-7359-e5a6690d7f9e.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用のtrain.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/993928b7-643a-b1b8-6085-3dd505881a92.png>

設定で項目が正しく選択されている事を確認します。
- ファイル形式　：区切り
- 区切り記号　　：コンマ
- エンコード　　：UTF-8
- 列見出し　　　：すべてのファイルで同じヘッダーを利用
- 行のスキップ　：なし
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d1473729-efb9-a7cb-0ed7-63d3f3d8314f.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/5faacc88-5da7-23f7-e2a1-c502cc95f1b6.png>


#### 5-3. モジュールを利用した学習パイプライン構築

登録されたデータを選択し、ドラッグ&ドロップで画面の中央に移動させます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/62e4be10-fa69-c4da-9d73-ad3bfacebd7e.png>

配置した[House_Prices]で右クリックし、[データを表示する]を選択する事で、データの参照や各説明変数の度数をグラフ化したものや最大値、最小値、平均値等を確認する事ができます。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/df762320-a9a2-b3c7-b1a4-0d7b39645cb1.png>

使う説明変数を選択する為、[コンポーネント]タブをクリックし、検索部分から"Select"と入力し、表示されたコンポーネントから[Select Columns in Dataset]をドラッグ&ドロップで画面の中央に移動させます。
移動後、[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/9aa2bc95-98c1-73d3-5356-4bfcee3411ca.png>

[Select Columns in Dataset]をダブルクリックして、右側に表示された項目から[列の編集]をクリックします。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/418723e9-6155-e9bd-4b74-e735afdafb7d.png>
[名前別]を選択し、使用する変数を選択します。

本来は、相関を調べたりする特徴量エンジニアリングで決めていく内容ですが、参考までにChatGPTで使うべき変数の内容を聞いてみます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a281dcbc-63cf-4a78-ac2f-79bb3fcea5e4.png>


とりあえず、以下の変数を使ってみることにしました。
LotArea, Neighborhood, OverallQual, YearBuilt, ExterQual, BsmtQual, 1stFlrSF, GrLivArea, BedroomAbvGr, KitchenQual, GarageCars, GarageQual, SalePrice
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/89ab8624-5e8e-504a-db3a-53135f010347.png>

**数値データを対数変換する為に[Normalize Data]を利用します。**
検索部分から"Normalize"と入力し、表示されたコンポーネントから[Normalize Data]をドラッグ&ドロップで画面の中央に移動させます。
[Select Columns in Dataset]の〇から上部の〇へドラッグを行い矢印を連結させます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/17dd4134-bec5-63d9-f748-59ab4a6746f3.png>

配置した[Normalize Data]をダブルクリックして、右側に表示された項目から以下の内容に変更します。
- Transformation method :**LogNormal**
- Use 0 for constant columns when checked :**True**
- 列の編集で、**1stFlrSF,GrLivArea,LotAreaを指定**
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c8ba3fa5-da96-82ce-fcdf-25cf09fb510c.png>


**学習と検証用にデータ分割する為に[Split Data]を利用します。**
検索部分から"Split"と入力し、表示されたコンポーネントから[Split Data]をドラッグ&ドロップで画面の中央に移動させます。
[Normalize Data]の〇から上部の〇へドラッグを行い矢印を連結させます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/733d55ef-87b6-6054-b65e-404bccea501f.png>

画面中央の[Split Data]をクリックして、データ分割の為の設定を入力します。
以下の値を使用します。
- Splitting mode  ：Split Rows
- Fraction of rows.：0.7
- Randomized split :True
- Random seed  :123
- Stratified split :False
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/85448704-798d-55b3-939b-b04784bb7f70.png>

次に[Train Model]モジュールをドラッグ&ドロップで画面の中央に移動させ、**[Split Data]の左側と[Train Model]の右側を連結**します。
連結後、[Train Model]モジュールをクリックし、[列の編集]から予測したい列である[SalePrice]を指定します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6038eee0-f81e-901d-8f17-c2fe7a463829.png>
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bee7ff9e-1029-bcd9-9a95-66b5bae6c710.png>


[Train Model]モジュールの上側の左へ[Boosted Decision Tree Regression]モジュールを連結します
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/7ae1db7e-8ca7-cf99-c748-e7701ba947be.png>

データ学習後に[Split Data]で分割された検証用データでモデルの精度を確認する為、
[Score Model]コンポーネントをドラッグ&ドロップで画面の中央に移動させ、**左側と[Train Model]を連結さて、右側に[Split Data]を連結**します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9c6b0254-aab1-86c5-6c4a-5c06a3c141bb.png>

#### 5-4. モデルの評価部分の構築

[Evaluate Model]コンポーネントをドラッグ&ドロップで画面の中央に移動させ、左側と[Score Model]を連結させます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/e0187d25-3f9a-6759-581f-eb652e64de24.png>



### 6. MLパイプラインの実行
画面右上の[▷送信]をクリックします。

<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/df916fe9-be03-2b09-efc6-5d7838a33089.png>


画面左側に[ジョブの詳細]というリンクが表示されるので、クリックします。
<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6873a880-f01f-921e-acac-7e47a88808b0.png>


完了したコンポーネントは緑色のチェックが表示されます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/3d9ac475-327a-84b6-0130-aa473baab176.png>

[Evaluate Model]コンポーネントダブルクリックし、画面右側で[出力とログ]タブのグラフボタンを選択することで、評価指標を確認する事ができます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/88958db0-1374-34ec-bfc8-42c203873e74.png>
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/01daed03-3b25-95c0-fbd4-647d01344408.png>

[メトリック]タブからも決定係数(Coefficient_of_Determination)の値等が確認できます。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cb3f9e6a-99f7-0c32-dc9f-5b123a99d416.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-train-score)