Amazon SageMaker Autopilotで実行時に渡す設定

# 前提
AWSのSageMakerが新しくなり、Autopilotというサービスができました。
いわゆるAutoMLで、GCPの「AutoML Tables」やAzureの「Automated machine Learning」とほぼ同じ機能なのですが、ちょっとめんどくさいところとして、多少コードを書く必要があります。
※GUIからも実行できますが、細かい設定ができません

そこで、ここでは設定できるパラメータをまとめておきたいと思います。

# 準備
なお、AutopilotはBoto3で実行しますので、事前に動作できるようにしておく必要があります。

```
pip install boto3
```

またpythonから呼び出すときは、以下のようにします。

```python
import sagemaker
import boto3
from sagemaker import get_execution_role

region = boto3.Session().region_name

session = sagemaker.Session()
bucket = session.default_bucket()
prefix = 'sagemaker/autopilot-dm'

role = get_execution_role()

sm = boto3.Session().client(service_name='sagemaker',region_name=region)
```

で、こんな感じで設定（後でこの辺りを説明）を準備し、

```python
input_data_config = [{
      'DataSource': {
        'S3DataSource': {
          'S3DataType': 'S3Prefix',
          'S3Uri': 's3://{}/{}/train'.format(bucket,prefix)
        }
      },
      'TargetAttributeName': 'y'
    }
  ]

output_data_config = {
    'S3OutputPath': 's3://{}/{}/output'.format(bucket,prefix)
  }
```

こんな感じに実行します。

```python
from time import gmtime, strftime, sleep
timestamp_suffix = strftime('%d-%H-%M-%S', gmtime())

auto_ml_job_name = 'automl-banking-' + timestamp_suffix
print('AutoMLJobName: ' + auto_ml_job_name)

sm.create_auto_ml_job(AutoMLJobName=auto_ml_job_name,
                      InputDataConfig=input_data_config,
                      OutputDataConfig=output_data_config,
                      RoleArn=role)
```

ということで、Autopilotのジョブを作成する「sm.create_auto_ml_job()」の引数を説明していきます。

※[こちら](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/autopilot/sagemaker_autopilot_direct_marketing.ipynb)のコードを参考にさせていただきました

# 設定値一覧
では、先ほどの「client.create_auto_ml_job()」の引数を説明していきます。
原文は[こちら](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_auto_ml_job)になります。

```python
response = client.create_auto_ml_job(
    AutoMLJobName='string',
    InputDataConfig=[
        {
            'DataSource': {
                'S3DataSource': {
                    'S3DataType': 'ManifestFile'|'S3Prefix',
                    'S3Uri': 'string'
                }
            },
            'CompressionType': 'None'|'Gzip',
            'TargetAttributeName': 'string'
        },
    ],
    OutputDataConfig={
        'KmsKeyId': 'string',
        'S3OutputPath': 'string'
    },
    ProblemType='BinaryClassification'|'MulticlassClassification'|'Regression',
    AutoMLJobObjective={
        'MetricName': 'Accuracy'|'MSE'|'F1'|'F1macro'
    },
    AutoMLJobConfig={
        'CompletionCriteria': {
            'MaxCandidates': 123,
            'MaxRuntimePerTrainingJobInSeconds': 123,
            'MaxAutoMLJobRuntimeInSeconds': 123
        },
        'SecurityConfig': {
            'VolumeKmsKeyId': 'string',
            'EnableInterContainerTrafficEncryption': True|False,
            'VpcConfig': {
                'SecurityGroupIds': [
                    'string',
                ],
                'Subnets': [
                    'string',
                ]
            }
        }
    },
    RoleArn='string',
    GenerateCandidateDefinitionsOnly=True|False,
    Tags=[
        {
            'Key': 'string',
            'Value': 'string'
        },
    ]
)
```

## AutoMLJobName（必須）
ジョブの名前になります。

## InputDataConfig（必須）
入力データの情報になります。
ファイルフォーマットはCSVのみとなっています。
リストの形式で、複数の入力データを指定できます。

- DataSource（必須）
    - S3DataSource（必須）
        - S3DataType（必須）：データの種類を「ManifestFile」か「S3Prefix」で設定します
        - S3Uri（必須）：入力データのURI（S3のパス）を設定します
- CompressionType：圧縮形式を「None（デフォルト）」か「Gzip」で設定します
- TargetAttributeName（必須）：例えば「y」のように、目的変数の名前です

## OutputDataConfig（必須）
出力データの情報になります。
ファイルフォーマットはCSVになります。

- KmsKeyId：AWS KMSにおける暗号化キーのIDです
- S3OutputPath（必須）：出力データのURI（S3のパス）を設定します（128文字以下）

## ProblemType
前処理とアルゴリズムの種類として、「BinaryClassification」「MulticlassClassification」「Regression」のどれかを指定します。

## AutoMLJobObjective
ジョブの目的を定義します。
MetricNameを指定すると、AutoMLが最小化または最大化を推測します。
この項目が指定されない場合、問題タイプに最もよく使用されるObjectiveMetricが選択されます。

- MetricName（必須）：メトリックの名前を「Accuracy」「MSE」「F1」「F1macro」から指定します

## AutoMLJobConfig
ジョブの設定になります。

- CompletionCriteria
    - MaxCandidates：トレーニングジョブの実行が許可される最大回数になります
    - MaxRuntimePerTrainingJobInSeconds：ジョブの実行が許可される最大時間（秒単位）になります
    - MaxAutoMLJobRuntimeInSeconds：AutoMLジョブが試行の完了を待機できる最大時間（秒単位）で、MaxRuntimePerTrainingJobInSeconds以上である必要があります
- SecurityConfig
    - VolumeKmsKeyId：保存されたデータの暗号化に使用されるキーになります
    - EnableInterContainerTrafficEncryption：コンテナレイヤー間でトラフィック暗号化を使用するかどうかを「True」「False」で指定します
    - VpcConfig
        - SecurityGroupIds（必須）：sg-xxxxxxxxの形式のVPCセキュリティグループIDになり、 下記のSubnetで指定されているVPCのセキュリティグループを指定します<br/>また、リスト形式で複数指定できます
        - Subnets（必須）：トレーニングジョブまたはモデルを接続するVPC内のサブネットのIDになります<br/>また、リスト形式で複数指定できます

## RoleArn（必須）
データへのアクセスに使用されるロールのARNになります。

## GenerateCandidateDefinitionsOnly
データプリプロセッサ、アルゴリズム、およびアルゴリズムパラメータ設定の組み合わせで、モデルをトレーニングせずに候補を生成するかを「True」「False」で指定します。

## Tags
各タグは、キーとオプションの値で構成されます。
タグキーはリソースごとに一意である必要があります。
また、リスト形式で複数指定できます。

- Key（必須）：タグのキーになります
- Value（必須）：タグの値になります

# 最後に
おそらく性質上、設定値等は頻繁に変わると思われますが、何が設定できるのかを知っておくと便利に使えると思います。