機械学習モデルの構築およびトレーニング、デプロイ

with Amazon SageMaker

このチュートリアルでは、Amazon SageMaker を使用して機械学習 (ML) モデルを構築、トレーニング、デプロイする方法を学習します。この演習では、一般的な XGBoost ML アルゴリズムを使用します。Amazon SageMaker は、開発者やデータサイエンティストが ML モデルを大規模に構築、トレーニング、デプロイできるようにする、完全マネージド型の機械学習サービスです。

概念化された ML モデルを本番稼働用に移行することは、通常、複雑で時間がかかります。モデルをトレーニングするには、膨大な量のデータを管理し、トレーニングに最適なアルゴリズムを選択し、トレーニング中に計算能力の管理を行った上で、モデルを本番環境にデプロイする必要があります。Amazon SageMaker は、ML モデルの構築とデプロイをはるかに簡単にすることで、この複雑さを軽減します。幅広い選択肢から適切なアルゴリズムとフレームワークを選択すると、Amazon SageMaker がペタバイト規模でモデルをトレーニングするための基礎となるインフラストラクチャをすべて管理し、本番環境にデプロイします。

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

データには便宜上のラベル付けがされており、データセットの列には、銀行からオファーされた商品に顧客が申し込みを行ったかが示されています。このデータセットのバージョンは、カリフォルニア大学アーバイン校により監修された ML リポジトリから公開されています。データはラベル付けされているため、このチュートリアルでは教師あり機械学習モデルを実装します。(データセットがラベル付けされていない場合、教師なし学習となります。)

このチュートリアルでは、次のことを行います。

  1. notebook instance の作成
  2. データの準備
  3. データから学習するためのモデルのトレーニング
  4. モデルのデプロイ
  5. ML モデルのパフォーマンスの評価
 
本チュートリアルで作成し、使用されたリソースは AWS 無料利用枠の対象となります。手順 7 を完了して、リソースを終了することを忘れないでください。アカウントがこれらのリソースで 2 か月以上アクティブである場合、アカウントの請求額は 0.50 USD 未満となります。
 

このチュートリアルには AWS アカウントが必要です

本チュートリアルでお客様が作成されたリソースは無料利用枠の対象です。 

無料利用枠の詳細 >>


ステップ 1: Amazon SageMaker コンソールにログインする

Amazon SageMaker コンソールに移動します。


ここをクリックすると、AWS マネジメントコンソールが新しいウィンドウで開くため、このステップバイステップガイドを開いたままで操作できます。検索バーに SageMaker と入力し、[Amazon SageMaker] を選択してサービスコンソールを開きます。

build-train-deploy-machine-learning-model-sagemaker-1

(クリックして拡大)


ステップ 2: Amazon SageMaker notebook instance を作成する

本ステップでは、お客様は Amazon SageMaker notebook instance を作成することになります。 


2a.Amazon SageMaker ダッシュボードから [Notebook instances] を選択します。 

build-train-deploy-machine-learning-model-sagemaker-2a

(クリックして拡大)


2b.[Create notebook instance] ページの [Notebook instance name] フィールドに名前を入力します。このチュートリアルでは MySageMakerInstance をインスタンス名として使用しますが、ご希望の場合は別の名前にすることも可能です。

このチュートリアルは、Notebook インスタンスタイプ はデフォルトの ml.t2.medium のままで進めることができます。

notebook instance のデータへのアクセスと Amazon S3 へのデータの安全なアップロードを可能にするには、IAM ロールを指定する必要があります。[IAM ロール] フィールドで [Create a new role] を選択し、Amazon SageMaker に必要なアクセス許可を持つロールを作成し、インスタンスに割り当てます。アカウントで既存の IAM ロールを選択することによってこれを行うこともできます。

build-train-deploy-machine-learning-model-sagemaker-2b

(クリックして拡大)


2c.[Create an IAM role] ボックスで [Any S3 bucket] を選択します。 これにより、Amazon SageMaker インスタンスがアカウントのすべての S3 バケットにアクセスできるようになります。このチュートリアルの後半では、新しい S3 バケットを作成します。代わりに使用したいバケットがある場合は、[Specific S3 buckets] を選択し、バケットの名前を指定します。

[Create role] を選択します。

build-train-deploy-machine-learning-model-sagemaker-2c

(クリックして拡大)


2d.Amazon SageMaker がお客様向けに AmazonSageMaker-ExecutionRole-*** という名前のロールを作成したことに注目してください。

このチュートリアルでは、ほかのフィールドにはデフォルト値を使用します。[Create notebook instance] を選択します。

build-train-deploy-machine-learning-model-sagemaker-2d

(クリックして拡大)


2e.[Notebook instances] ページに、新しい MySageMakerInstance notebook instance が [Pending] ステータスで表示されます。

notebook instance は、2 分以内に [Pending] から [InService] ステータスに移行します。

build-train-deploy-machine-learning-model-sagemaker-2e

(クリックして拡大)


ステップ 3:データの準備

このステップでは、Amazon SageMaker notebook を使用して、機械学習モデルのトレーニングに必要なデータを前処理します。


3a.[Notebook instances] ページで、MySageMakerInstance が [Pending] から [InService] ステータスに移行するまで待ちます。

ステータスが [InService] になったら、[MySageMakerInstance] を選択し、[Actions] ドロップダウンメニューを使用するか、[InService] ステータスの横にある [Open Jupyter] を選択して開きます。

build-train-deploy-machine-learning-model-sagemaker-3a

(クリックして拡大)

build-train-deploy-machine-learning-model-sagemaker-3a1

(クリックして拡大)


3b.Jupyter を開いたら[Files] タブから [New] を選択し、[conda_python3] を選択します。 

build-train-deploy-machine-learning-model-sagemaker-3b

(クリックして拡大)


3c.データを準備し、ML モデルをトレーニングしてデプロイするには、Jupyter notebook 環境でいくつかのライブラリをインポートし、いくつかの環境変数を定義する必要があります。次のコードをインスタンスのコードセルにコピーし [Run] を選択します。

右の最初のスクリーンショットにあるように、コードの実行中、角括弧の間に * が表示されます。数秒後、コードの実行が完了すると、* が番号 1 に置き換えられ、右側の 2 番目のスクリーンショットのように成功メッセージが表示されます。 

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt                   
from IPython.display import Image                 
from IPython.display import display               
from time import gmtime, strftime                 
from sagemaker.predictor import csv_serializer   

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
build-train-deploy-machine-learning-model-sagemaker-3c-1

(クリックして拡大)

build-train-deploy-machine-learning-model-sagemaker-3c-2

(クリックして拡大)


3d.このステップでは、このチュートリアル用のデータを保存する S3 バケットを作成します。

次のコードを notebook の次のコードセルにコピーし、S3 バケットの名前を変更して一意にします。S3 バケット名はグローバルに一意であり、ほかのいくつかの制約と制限が必要です。

[Run] を選択します。成功メッセージが表示されない場合は、バケット名を変更して再試行してください。

 

bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
    if  my_region == 'us-east-1':
      s3.create_bucket(Bucket=bucket_name)
    else: 
      s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
    print('S3 bucket created successfully')
except Exception as e:
    print('S3 error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3d

(クリックして拡大)


3e.次に、データを Amazon SageMaker インスタンスにダウンロードし、データフレームにロードする必要があります。下記コードをコピーし実行します。

try:
  urllib.request.urlretrieve ("https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", "bank_clean.csv")
  print('Success: downloaded bank_clean.csv.')
except Exception as e:
  print('Data load error: ',e)

try:
  model_data = pd.read_csv('./bank_clean.csv',index_col=0)
  print('Success: Data loaded into dataframe.')
except Exception as e:
    print('Data load error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3e

(クリックして拡大)


3f.データをシャッフルし、それをトレーニングデータとテストデータに分けます。

モデルトレーニングループでは、トレーニングデータ (顧客の 70%) が使用されます。勾配ベースの最適化を使用して、モデルパラメーターを繰り返し改良します。勾配ベースの最適化は、モデル損失関数の勾配を使用して、モデルエラーを最小化するモデルパラメータ値を見つける方法です。

テストデータ (残りの 30% の顧客) を使用してモデルのパフォーマンスを評価し、トレーニングされたモデルをうまく目に見えないデータへ一般化できるかどうかを測定します。

次のコードを新しいコードセルにコピーし、[Run] を選択してデータをシャッフルおよび分割します。

train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)
build-train-deploy-machine-learning-model-sagemaker-3f

(クリックして拡大)


ステップ 4:データからのモデルのトレーニング

本ステップでお客様は、トレーニングデータセットを用いてご自身の機械学習モデルを訓練することになります。 


4a.Amazon SageMaker のビルド済み XGBoost モデルを使用するには、ヘッダーとトレーニングデータの最初の列を再フォーマットし、S3 バケットからデータをロードする必要があります。

次のコードを新しいコードセルにコピーして [Run] を選択し、データを再フォーマットしてロードします。

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

4b.次に、Amazon SageMaker セッションをセットアップし、XGBoost モデル (estimator) のインスタンスを作成し、モデルのハイパーパラメーターを定義する必要があります。次のコードを新しいコードセルにコピーし、[Run] を選択します。

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)

4c.データをロードして XGBoost estimator を設定したら、以下のコードを次のコードセルにコピーして [Run] を選択し、ml.m4.xlarge インスタンスで勾配最適化を使用してモデルをトレーニングします。

数分後、生成されたトレーニングログの表示が開始されます。

xgb.fit({'train': s3_input_train})
build-train-deploy-machine-learning-model-sagemaker-4c

(クリックして拡大)


ステップ 5:モデルのデプロイ

本ステップでお客様は、あるエンドポイントに対して訓練されたモデルをデプロイし、リフォーマットをして CSV データをロードし、その後、予測を作成するためにモデルを実行することになります。


5a.モデルをサーバーにデプロイし、アクセス可能なエンドポイントを作成するには、以下のコードを次のコードセルにコピーし、[Run] を選択します。

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
build-train-deploy-machine-learning-model-sagemaker-5a

(クリックして拡大)


5b.テストデータの顧客が銀行の商品に申し込みを行ったかどうかを予測するには、以下のコードを次のコードセルにコピーし、[Run] を選択します。

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)
build-train-deploy-machine-learning-model-sagemaker-5b

(クリックして拡大)


ステップ 6:モデルの性能評価

本ステップでお客様は、機械学習モデルの性能と正確性を評価することになります。


6a.以下のコードをコピーして貼り付け、[Run] を選択して、confusion matrix と呼ばれる表の実際の値と予測値を比較します。

予測によると、テストデータにおける顧客の 90% に対して、申込者に対しては 65% (278/429)、申し込みしなかった顧客に対しては 90% (10,785/11,928) の精度で、預金証書の申し込みを正確に予測できたと結論付けることができます。

cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))
build-train-deploy-machine-learning-model-sagemaker-6a

(クリックして拡大)


ステップ 7:リソースを終了する

このステップでは、Amazon SageMaker 関連のリソースを終了します。

重要: あまり使用されていないリソースを終了することは、コストの削減につながるベストプラクティスです。リソースを終了しないと、料金が発生することになります。


7a.Amazon SageMaker エンドポイントと S3 バケット内のオブジェクトを削除するには、以下のコードをコピーし、貼り付けて実行します。  

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()
build-train-deploy-machine-learning-model-sagemaker-7a

(クリックして拡大)


お疲れ様でした。

Amazon SageMaker を使用して機械学習モデルを準備、トレーニング、デプロイ、評価する方法の学習が完了しました。Amazon SageMaker は、お客様のトレーニングデータに迅速に接続し、自身のアプリケーションのために最適なアルゴリズムと枠組みを選択するためにお客様が必要とするすべてのものを提供することにより、ML モデルの構築を容易なものとし、同時にお客様がペタバイト規模で各モデルを訓練できるよう、全ての基礎的なインフラストラクチャを管理しています。


 

詳細

Amazon SageMaker は、様々な使用事例に使うことができる、あらかじめ構築された機械学習アルゴリズムを備えています。Amazon SageMaker に付属の組み込みアルゴリズムの使用に関する詳細をご覧ください。 

Dive Deep

お客様は、Amazon SageMaker における Automatic Model Tuning と共に機械学習を使用することができます。これにより、モデル内のハイパーパラメータを自動的に調整して、可能な限り最高の結果を得ることが可能になります。この機能の詳細については、自動モデルチューニングのドキュメントとこちらのブログ記事をご覧ください。 

実際の動作を確認する

Amazon SageMaker には、機械学習の多くの一般的なユースケースに対応するサンプルノートブックが多数用意されています。GitHub で確認いただけます。