SageMaker Autopilot のアルゴリズム選択方法

# はじめに
SageMaker Autopilot は、データに基づいて最適なモデルを自動で構築してくれるAutoML 機能です。
Autopilot は非常にアップデートが多くされており、AWSとしても力を入れている機能なのかなと思います。（※本記事の末尾参照）

つい先日のアップデートで、Autopilot で実験を作成する際に、利用するアルゴリズムを選択できるようになりました。

[SageMaker Autopilot で機械学習トレーニングの実験開始時にアルゴリズムの選択が可能に](https://aws.amazon.com/jp/about-aws/whats-new/2023/02/sagemaker-autopilot-select-algorithms-machine-learning-training-experiment/)

これまでは、トレーニングモードとして、以下3パターンを選択できましたが、各パターンの中でチューニングするアルゴリズムの指定まですることはできませんでした。
|  トレーニングモード  |  利用アルゴリズム  |
| ---- | ---- |
|  アンサンブル  |  ● LightGBM<br>● CatBoost<br>● XGBoost<br>● Random Forest<br>● Extra Trees<br>● Linear Models<br>● Neural network torch<br>● Neural network fast.ai |
|  ハイパーパラメーター最適化 (HPO)  |  ● Linear learner<br>● XGBoost<br>● Deep learning algorithm  |
|  Auto  |  ● アンサンブル or ハイパーパラメーター最適化 (HPO) <br>※トレーニングモードを自動で選択してくれるモード |

チューニングしたい対象のアルゴリズムを絞ることができ、よりユースケースにマッチするアルゴリズムのチューニングに時間をかけることができるようになります。
アルゴリズムには特にこだわりはなく、単純に精度の高いモデルを早く作りたいということであれば、デフォルト設定を利用すればいいと思いますが、実際の利用シーンでは「GBDT系（XGBoost, LightGBM, CatBoost）を利用したい」といったようにある程度ターゲットとなるアルゴリズムにめどがついていることの方が多いと思います。実プロジェクトで Autopilot によるモデル構築を取り入れやすくなったのではないでしょうか。


# Autopilot のアルゴリズム選択方法
Autopilot のアルゴリズムの選択を実際にやってみます。Autopilot は「SageMaker Studio コンソールを利用する方法」と「API を利用する方法」の２つの方法で利用できるのでどちらも試したいと思います。

## １．SageMaker Studio コンソールを利用する方法
SageMaker Studio コンソールでの利用方法です。簡単に操作できるので、SageMaker Studio が使えるならこちらの方法がおすすめです。

まずは、SageMaker Studio コンソールの左側のナビゲーション画面にある「AutoML」を選択して、Autopilot ダッシュボードを開き、「Create AutoML experiment」を選択し、Autopilot ジョブの設定画面に移動します。

「Experiment and data details」ステップで、入力となる学習データと、AutopilotJob の Artifact 出力場所となる S3 の格納先を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/77aa7dee-4ed8-6996-256d-ccb757621e69.png)

次に、「Target and Features」ステップで、目的変数と説明変数のデータ型を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/e7c892c9-0366-0527-4c05-07e7ff2c1b32.png)

ここまでの手順はアップデートで前と特に変わりはありません。

そして、「Traning method and algorithms」ステップで、トレーニングモードを選択できるのですが、各トレーニングモードごとに利用するアルゴリズムの一覧が表示されるようにアップデートされています。各チェックボックスを選択することによって、利用するアルゴリズムを指定できるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/b7a8d68b-769f-b175-47d3-36d3912203c8.png)

今回は、「アンサンブルモード（Ensembling）」で、 LightGBM, CatBoost, XGBoost を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/6b45083c-c494-642d-fa59-44e4753e3614.png)

「Deployment and advanced settings」ステップで、各詳細設定（IAMロール、KMSキー、VPC設定など）を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/1e91864b-c631-a606-0cd3-07a9cec0b592.png)

各設定を確認して、「Create experiment」を実行します。Autopilotジョブが完了すると、以下のようにトレーニングされたモデルの一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/c10a464a-8040-a7ab-5a3f-d7047e0ed407.png)

モデル名（Trial name）を見ると「アンサンブルモード（Ensembling）」で選択した、CatBoost モデルと、各モデルを加重平均した WeightedEnsemble モデルが作成されているように見えます。ここまで数ステップの操作で非常に簡単にアルゴリズムの選択をしモデル構築ができ便利だなと感じます。

それでは、実際に作成されたモデルの中身を少し詳しく確認したいと思います。
Autopilot は、自動実行した試行錯誤の結果を可視化する[ノートブック](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-candidate-generation-notebook.html)を自動生成してくれるのですが、「アンサンブルモード（Ensembling）」には、対応していないようでモデルの詳細な構成をすぐに確認できませんでした。

しょうがないので、各モデルのArtifact を直接確認してみます。作成されたモデル名を選択し、「Artifacts > Algorithm Model」のURLからモデルのArtifact格納先のS3を確認します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/2ee3adf4-4e83-4b63-f2db-830c67ca2a96.png)

モデルファイル（model.tar.gz）をS3 からダウンロードして解凍すると、AutoGluon によって作成されたモデルがpickle 形式で保存されています。
以下のようにpickle を開き、WeightedEnsemble モデルの構成が記載されている `base_model_names` を確認すると、CatBoost モデルと xgboost モデルにより構成されており、たしかに選択したアルゴリズムのみが利用されていることが分かります。

```py
import pickle

with open('models/WeightedEnsemble_L2_FULL/model.pkl', 'rb') as f:
    model = pickle.load(f)
```

```
'base_model_names': ['CatBoost_BAG_L1',
  'XGBoost_BAG_L1',
  'CatBoost_BAG_L1_FULL',
  'XGBoost_BAG_L1_FULL'],
```

AutoGluon に渡したパラメータ（`num_bag_sets` や `num_stack_levels`）については、モデルの詳細情報（Model explainability）から確認することができましたが、実際にチューニングされたモデルの中身（ハイパーパラメータやスタッキング構成など）を可視化することは簡単に確認できなかったので、今後の機能改善に期待したいです。



## ２．API を利用する方法
CreateAutoMLJob API を実行する方法で、何個かやり方がありますが、ここでは boto3 の[`create_auto_ml_job`](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker/client/create_auto_ml_job.html) を利用してみたいと思います。

利用方法は非常にシンプルで、`create_auto_ml_job`の`AutoMLAlgorithms`に利用したいアルゴリズムを指定するのみです。API でも非常に簡単にアルゴリズムの選択をすることができます。
```py
import boto3

client = boto3.client('sagemaker')

response = client.create_auto_ml_job(
    AutoMLJobName='<Autopilot ジョブ名>',
    InputDataConfig=[
        {
            'DataSource': {
                'S3DataSource': {
                    'S3DataType': 'S3Prefix',
                    'S3Uri': '<学習データの格納場所>'
                }
            },
            'TargetAttributeName': 'Churn?'
        },
    ],
    OutputDataConfig={
        'S3OutputPath': '<Artifact の出力場所>'
    },
    ProblemType='BinaryClassification',
    AutoMLJobObjective={
        'MetricName': 'F1'
    },
    AutoMLJobConfig={
        'CompletionCriteria': {
            'MaxCandidates': 5
        },
        'CandidateGenerationConfig': {
            'AlgorithmsConfig': [
                {
                    'AutoMLAlgorithms': [ # アルゴリズムの指定
                        'xgboost',
                        'lightgbm',
                        'catboost'
                    ]
                },
            ]
        },
        'Mode': 'ENSEMBLING' # トレーニングモードの指定
    },
    RoleArn='<IAMロールのARN>'
)
```

実行結果は`describe_auto_ml_job`により確認することができます。
```py
client.describe_auto_ml_job(AutoMLJobName='<Autopilot ジョブ名>')
```

出力の`AutoMLJobStatus`が`Completed`になったら Autopilot ジョブが完了となります。
```
'AutoMLJobStatus': 'Completed',
```

また、`list_candidates_for_auto_ml_job`により、トレーニングされたモデルの一覧を確認することもできます。
```py
client.list_candidates_for_auto_ml_job(AutoMLJobName='<Autopilot ジョブ名>')
```

ただ残念ながら、「１．SageMaker Studio コンソールを利用する方法」と同様に、実際にチューニングされたモデルの中身（ハイパーパラメータやスタッキング構成など）は出力されたartifact（model.tar.gz） を確認する必要があります。また、AutoGluon に渡したパラメータ（`num_bag_sets` や `num_stack_levels`）も`list_candidates_for_auto_ml_job`では出力できなかったので可視化機能は少し物足りないと思います。


# まとめ
SageMaker Autopilot で機械学習トレーニングのアルゴリズムの選択を試してみました。アルゴリズムの選択方法は非常に簡単で、よりモデルチューニングにかかる時間を短縮することができ、便利な機能だと思います。ただ、モデルの可視化機能は少し物足りなかったので今後の機能改善に期待したいです。



### 【参考】re:Invent 2022までの直近1年間で発表されたAutopilotのアップデート
- [Amazon SageMaker Autopilot が、最大 100 GB までのデータセットのサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2022/01/amazon-sagemaker-autopilot-datasets-up-to-100-gb/)
- [Amazon SageMaker Autopilot が、Apache Parquet ファイル形式のサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2022/01/amazon-sagemaker-autopilot-apache-parquet/)
- [Amazon SageMaker Autopilot が分類の問題に関わる Confusion Matrix と追加の新しいインサイトの提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/02/amazon-sagemaker-autopilot-matrix-insights-classification/)
- [Amazon SageMaker Autopilot の実験速度が最大で 2 倍に](https://aws.amazon.com/jp/about-aws/whats-new/2022/07/amazon-sagemaker-autopilot-experiments-2x-faster/)
- [Amazon SageMaker 自動モデルチューニングの上限が引き上げられ、モデルの精度が向上](https://aws.amazon.com/jp/about-aws/whats-new/2022/07/amazon-sagemaker-automatic-model-tuning-supports-increased-limits-improve-accuracy-models/)
- [Amazon SageMaker 自動モデルチューニングで、より堅牢なチューニングを行う代替 SageMaker トレーニングインスタンスタイプのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-sagemaker-automatic-model-tuning-alternate-sagemaker-instances-robust-tuning/)
- [Amazon SageMaker 自動モデルチューニングが SageMaker Training インスタンスの再利用によりスタートアップのオーバーヘッドを 20 分の 1 に削減](https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-sagemaker-automatic-model-tuning-reuses-sagemaker-training-instances-reduce-start-up-overheads/)
- [Amazon SageMaker Autopilot、カスタムデータの分割オプションの提供と合わせて、AutoML 実験を作成するためのエクスペリエンスを改善](https://aws.amazon.com/jp/about-aws/whats-new/2022/09/amazon-sagemaker-autopilot-custom-data-split-improved-automl-experiment/)
- [Amazon SageMaker 自動モデルチューニングが新しい検索戦略として Hyperband を使用した、最大で 3 倍速いハイパーパラメータチューニングの提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/09/amazon-sagemaker-automatic-model-tuning-provides-faster-hyperparameter-tuning-hyperband-search-strategy/)
- [AutoGluon を利用した新しい「アンサンブル」トレーニングモードで Amazon SageMaker Autopilot の実験が最大 8 倍高速に](https://aws.amazon.com/jp/about-aws/whats-new/2022/09/amazon-sagemaker-autopilot-experiments-faster-ensemble-training-mode-powered-autogluon/)
- [Amazon SageMaker Autopilot での推論モデルデプロイ時に Amazon SageMaker Data Wrangler の特徴変換が含まれるように](https://aws.amazon.com/jp/about-aws/whats-new/2022/09/amazon-sagemaker-autopilot-data-wrangler-feature-transforms-models-inference/)
- [Amazon SageMaker Autopilot の実験がハイパーパラメータの最適化のトレーニングモードで最大で 2 倍高速化に](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-sagemaker-autopilot-experiments-2x-faster-hyperparameter-optimization-training-mode/)
- [Amazon SageMaker Autopilot で AutoML 実験の作成中に機能の選択およびデータタイプの変更が可能に](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-sagemaker-autopilot-feature-selection-ability-change-data-types-creating-automl-experiment/)