Amazon SageMaker Autopilot で機械学習モデルを自動的に作成してみた

2021.04.27

こんにちは、yagiです。

本日は、Amazon SageMaker Autopilot で機械学習モデルを自動的に作成してみたので記載します。 本内容はチュートリアルから実行したものです。

機械学習モデルを自動的に作成する Amazon SageMaker Autopilot を使用

このチュートリアルでは、ユーザーは銀行で働く開発者という設定で進んでいきます。ユーザーは、顧客が預金証書 (CD) の申し込みを行うかどうかを予測するための機械学習モデルを開発するように求められました。モデルは、顧客の人口統計、マーケティングイベントへの反応、および外部の環境要因に関する情報を含むマーケティングデータセットでトレーニングされます。

公開されたラベリング済みのデータセットを使用して、Amazon SageMaker Autopilot を使用して training experiment を作成、最適なパフォーマンスのモデルを特定しデプロイ、デプロイしたモデルを使用して予測を行う、という流れとなります。

それでは早速試してみます。

Amazon SageMaker Studio のセットアップ

Amazon SageMaker Studio を開いてセットアップを行います。 クイックスタートでユーザー名と実行ロールを作成し、送信を押下します。

作成完了したら「Studioを開く」をクリックします。

データセットをダウンロードする

「JupyterLab」の「File」メニューで、「New」、「Notebook」の順に選択します。

「Select Kernel」で「Python 3(Data Science)」を選択します。

以下のコードを実行します。

%%sh
apt-get install -y unzip
wget https://sagemaker-sample-data-us-west-2.s3-us-west-2.amazonaws.com/autopilot/direct_marketing/bank-additional.zip
unzip -o bank-additional.zip

出力を確認します。

```
Archive:  bank-additional.zip
   creating: bank-additional/
  inflating: bank-additional/bank-additional-names.txt  
  inflating: bank-additional/bank-additional.csv  
  inflating: bank-additional/bank-additional-full.csv  
--2021-04-27 07:50:25--  https://sagemaker-sample-data-us-west-2.s3-us-west-2.amazonaws.com/autopilot/direct_marketing/bank-additional.zip
```

2021-04-27 07:50:26 (769 KB/s) - ‘bank-additional.zip’ saved [432828/432828]

データセットの最初の10行を確認します。

import pandas as pd
data = pd.read_csv('./bank-additional/bank-additional-full.csv')
data[:10]

出力を確認します。

データセットの列の右端の「y」 という列は、各サンプルのラベル (この顧客がオファーを受け入れたかどうか) を示しています。 今回の予測のターゲットとなる教師データです。

以下のコードを実行してCSVデータセットをS3バケットにアップロードします。

import sagemaker

prefix = 'sagemaker/tutorial-autopilot/input'
sess   = sagemaker.Session()

uri = sess.upload_data(path="./bank-additional/bank-additional-full.csv", key_prefix=prefix)
print(uri)

出力を確認します。(リージョンとアカウントIDをマスクしています)こちらは後ほど使うのでメモしておきます。

s3://sagemaker-REGION-ACCOUNTID/sagemaker/tutorial-autopilot/input/bank-additional-full.csv

SageMaker Autopilot experimentを作成する

左端のパレットのようなマークから「experiment」を検索して選択します。

「ジョブ設定」画面で入力バケット、出力バケット、今回の予測ターゲットである「y」を指定します。「Create Experiment」を押下します。

以下のステージでexperimentが実行されます。

  • Pre-processing

  • Candidate Definitions Generated

  • Feature Engineering

  • Model Tuning

  • Explainability Report Generated

欠損値の処理などを含む前処理と、今回の問題のタイプに適合する機械学習アルゴリズムを使用したモデルトレーニングのステップの後、特徴量エンジニアリングステージでトレーニングデータセットと検証データセットが作成され、S3 バケットに保存されます。特徴量エンジニアリングステージではデータ探索ノートブックと候補生成ノートブックでより深い洞察を得ることができます。 こちらの分析結果を、チューニングに役立てることができる仕様となっています。

モデルチューニングステージでは、SageMaker Autopilotによって、各候補パイプラインとそれぞれの前処理済みのデータセット用にハイパーパラメータ最適化ジョブが起動されます。関連付けられたトレーニングジョブによって幅広いハイパーパラメータ値が探索され、高パフォーマンスモデルにすばやく集約されます。 このステージが完了すると、SageMaker Autopilot ジョブは完了します。

最適なモデルをデプロイする

チューニングされた最適なモデルを選択し、そのモデルを Amazon SageMaker によって管理されるエンドポイントにデプロイできます。

「Trials」タブからBestマークの付いた最適なチューニングジョブを選択し、「Deploy model」を押下します。

「Deployment options」で「Endpoint name」に名前を入力し、「Deploy model」を押下します。モデルが、Amazon SageMaker によって管理される HTTPS エンドポイントにデプロイされます。

ステータスを画面で確認できます。

モデルを使用して予測を行う

boto3 SDK の invoke_endpoint API を使用して、データセットの最初の 2,000 個のサンプルを予測します。機械学習の重要なメトリクスであるAccuracy、Precision、recall、F1 スコアをこのプロセスで計算します。

以下のコードを実行します。

import boto3, sys

ep_name = 'tutorial-autopilot-best-model'
sm_rt = boto3.Session().client('runtime.sagemaker')

tn=tp=fn=fp=count=0

with open('bank-additional/bank-additional-full.csv') as f:
    lines = f.readlines()
    for l in lines[1:2000]:   # Skip header
        l = l.split(',')      # Split CSV line into features
        label = l[-1]         # Store 'yes'/'no' label
        l = l[:-1]            # Remove label
        l = ','.join(l)       # Rebuild CSV line without label
                
        response = sm_rt.invoke_endpoint(EndpointName=ep_name, 
                                         ContentType='text/csv',       
                                         Accept='text/csv', Body=l)

        response = response['Body'].read().decode("utf-8")
        #print ("label %s response %s" %(label,response))

        if 'yes' in label:
            # Sample is positive
            if 'yes' in response:
                # True positive
                tp=tp+1
            else:
                # False negative
                fn=fn+1
        else:
            # Sample is negative
            if 'no' in response:
                # True negative
                tn=tn+1
            else:
                # False positive
                fp=fp+1
        count = count+1
        if (count % 100 == 0):   
            sys.stdout.write(str(count)+' ')
            
print ("Done")

accuracy  = (tp+tn)/(tp+tn+fp+fn)
precision = tp/(tp+fp)
recall    = tn/(tn+fn)
f1        = (2*precision*recall)/(precision+recall)

print ("%.4f %.4f %.4f %.4f" % (accuracy, precision, recall, f1))

出力を確認します。

100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 Done
0.9795 0.5068 0.9974 0.6721

Accuracy、Precision、recall、F1 スコアをそれぞれ評価します。

なお上記指標についての説明は以下が分かり易かったです。 【入門者向け】機械学習の分類問題評価指標解説(正解率・適合率・再現率など)

結論

Amazon SageMaker Autopilot で機械学習モデルを自動的に作成してみるチュートリアルを実施してみました。 このような機械学習が自動化されたサービスは他にもあるとは思いますが、AWSの場合、S3などの他のAWSサービスともシームレスに連携できるので使い勝手もよいのではないかと思います。 リソースのプロビジョニングや管理も不要となるため手間が省けるだけでなく、特徴量エンジニアリングステージではデータ探索ノートブックと候補生成ノートブックでより深い洞察を得ることができる点も魅力ではないかと感じました。

参考リンク

Amazon SageMakerAutopilotを使用してモデル開発を自動化する