Amazon SageMaker を使用して

機械学習モデルを構築、トレーニング、デプロイ

このチュートリアルでは、Amazon SageMaker と XGBoost ML アルゴリズムを使用して機械学習 (ML) モデルを構築、トレーニング、デプロイする方法を学習します。Amazon SageMaker は、すべてのデベロッパーやデータサイエンティストが機械学習 (ML) モデルを迅速に構築、トレーニング、デプロイできるようにするフルマネージド型サービスです。

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

このチュートリアルでは、お客様は銀行で働く機械学習のデベロッパーという設定で進んでいきます。お客様は、顧客が預金証書 (CD) の申し込みを行うかどうかを予測するための機械学習モデルを開発するように求められました。

このチュートリアルでは、以下の方法を学びます。

  1. SageMaker ノートブックインスタンスを作成する
  2. データの準備
  3. データから学習するためのモデルのトレーニング
  4. モデルのデプロイ
  5. ML モデルのパフォーマンスの評価

モデルは、顧客の人口統計、マーケティングイベントへの反応、および外部の環境要因に関する情報を含む Bank Marketing Data Set でトレーニングされます。データには便宜上のラベル付けがされており、データセットの列には、銀行からオファーされた商品に顧客が申し込みを行ったかが示されています。このデータセットのバージョンは、カリフォルニア大学アーバイン校により監修された機械学習リポジトリから公開されています。

本チュートリアルで作成し、使用されたリソースは AWS 無料利用枠の対象となります。このワークショップの料金は 1 USD 未満です。

このチュートリアルの内容
時間 10 分                                     
料金 1 USD 未満
ユースケース 機械学習
製品 Amazon SageMaker
対象者 デベロッパー
レベル 初心者
最終更新日 2021 年 6 月 7 日

開始する前に

このチュートリアルを完了するには、AWS アカウントが必要です。アカウントをまだお持ちでない場合は、[Sign up for AWS] (AWS にサインアップ) を選択して、新しいアカウントを作成してください。

ステップ 1.データ準備用の Amazon SageMaker ノートブックインスタンスを作成する

このステップでは、データのダウンロードと処理に使用するノートブックインスタンスを作成します。作成プロセスの一環として、Amazon SageMaker が Amazon S3 のデータにアクセスできるようにする Identity and Access Management (IAM) ロールも作成します。


a.Amazon SageMaker コンソールにサインインし、右上でご希望の AWS リージョンを選択します。このチュートリアルでは、米国西部 (オレゴン) リージョンを使用します。


b.左側のナビゲーションペインで、[Notebook instances] (ノートブックインスタンス) を選択し、[Create notebook instance] (ノートブックインスタンスの作成) を選択します。


c.[Create notebook instance] (ノートブックインスタンスの作成) ページの [Notebook instance setting] (ノートブックインスタンス設定) ボックスで、次のフィールドに入力します。

  • [Notebook instance name] (ノートブックインスタンス名) で、SageMaker-Tutorial と入力します。
  • [Notebook instance type] (ノートブックインスタンスタイプ) で、ml.t2.medium を選択します。
  • Elastic Inference では、デフォルトの選択である [none] (なし) のままにします。

d.[Permissions and encryption] (アクセス許可と暗号化) セクションの [IAM role] (IAM ロール) で、[Create a new role] (新しいロールの作成) を選択し、[Create an IAM role] (IAM ロールを作成する) ダイアログボックスで [Any S3 bucket] (任意の S3 バケット) を選択して [Create role] (ロールの作成) を選択します。

注: 代わりに使用するバケットがすでにある場合は、[Specific S3 buckets] (特定の S3 バケット) を選択してバケット名を指定します。


Amazon SageMaker は、AmazonSageMaker-ExecutionRole-*** ロールを作成します。 


e.残りのオプションはデフォルト設定のままにし、[Create notebook instance] (ノートブックインスタンスを作成) を選択します。

[Notebook instances] (ノートブックインスタンス) セクションで、新しい SageMaker-Tutorial ノートブックインスタンスが [Pending] (保留中) の Status (ステータス) で表示されます。[Status] (ステータス) が InService に変わると、ノートブックの準備が整います。

ステップ 2.データの準備

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


a. SageMaker-Tutorial ノートブックインスタンスのステータスが InService に変わったら、[Open Jupyter] (Jupyter を開く) を選択します。


b.Jupyter で [New] (新規) を選択し、次に [conda_python3] を選択します。


c.Jupyter ノートブックの新しいコードセルで、以下のコードをコピーして貼り付け、[Run] (実行) を選択します。

このコードは、必要なライブラリをインポートし、データの準備、ML モデルのトレーニング、および ML モデルのデプロイに必要な環境変数を定義します。

# 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'
my_region = boto3.session.Session().region_name # set the region of the instance

# this line automatically looks for the XGBoost image URI and builds an XGBoost container.
xgboost_container = sagemaker.image_uris.retrieve("xgboost", my_region, "latest")

print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + xgboost_container + " container for your SageMaker endpoint.")

d.S3 バケットを作成してお客様のデータを格納します。以下のコードをコピーして次のコードセルに貼り付け、[Run] (実行) を選択します。

注: bucket_name your-s3-bucket-name を一意の S3 バケット名に置き換えてください。コードを実行させた後、お客様が処理成功のメッセージを受け取っていない場合、バケット名を変更し再度試みます。

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)

e.ご利用の SageMaker インスタンスにデータをダウンロードし、そのデータをデータフレームにロードします。以下のコードをコピーして次のコードセルに貼り付け、[Run] (実行) を選択します。

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)

f.データをシャッフルして、トレーニングデータとテストデータに分割します。以下のコードをコピーして次のコードセルに貼り付け、[Run] (実行) を選択します。

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

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

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)

ステップ 3.ML モデルをトレーニングする

このステップでは、トレーニングデータセットを使用して機械学習モデルをトレーニングします。


a.Jupyter ノートブックの新しいコードセルで、以下のコードをコピーして貼り付け、[Run] (実行) を選択します。

このコードは、トレーニングデータのヘッダーと最初の列を再フォーマットし、S3 バケットからデータをロードします。このステップは、Amazon SageMaker の事前構築済み XGBoost アルゴリズムを使用するために必要です。

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.inputs.TrainingInput(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

b.Amazon SageMaker セッションを設定し、XGBoost モデル (予測ツール) のインスタンスを作成し、モデルのハイパーパラメーターを定義します。以下のコードをコピーして次のコードセルに貼り付け、[Run] (実行) を選択します。

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(xgboost_container,role, instance_count=1, 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)

c.トレーニングジョブを開始します。以下のコードをコピーして次のコードセルに貼り付け、[Run] (実行) を選択します。

このコードは、ml.m4.xlarge インスタンスで勾配最適化を使用してモデルをトレーニングします。数分後、Jupyter ノートブックにトレーニングログが生成されているのを確認できるはずです。

xgb.fit({'train': s3_input_train})

ステップ 4.モデルのデプロイ

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


a.Jupyter ノートブックの新しいコードセルで、以下のコードをコピーして貼り付け、[Run] (実行) を選択します。

このコードはモデルをサーバーにデプロイし、アクセスできる SageMaker エンドポイントを作成します。このステップが完了するまでに数分かかることがあります。

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')

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

from sagemaker.serializers import CSVSerializer

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.serializer = CSVSerializer() # 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)

ステップ 5.モデルの性能評価

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


Jupyter ノートブックの新しいコードセルで、以下のコードをコピーして貼り付け、[Run] (実行) を選択します。

このコードは、混同行列と呼ばれるテーブルで実際の値と予測値を比較します。

予測によると、テストデータにおける顧客の 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))

ステップ 6.クリーンアップ

このステップでは、このラボで使用したリソースを終了させます。

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


a.エンドポイントを削除する: Jupyter ノートブックで以下のコードをコピーして貼り付け、[Run] (実行) を選択します。

xgb_predictor.delete_endpoint(delete_endpoint_config=True)

b.トレーニングアーティファクトと S3 バケットを削除する: Jupyter ノートブックで、次のコードをコピーして貼り付け、[Run] (実行) を選択します。

bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()

c.SageMaker Notebook を削除する: SageMaker Notebook を停止して削除します。

  1. SageMaker コンソールを開きます。
  2. [Notebooks] (ノートブック) で、[Notebook instances] (ノートブックインスタンス) を選択します。
  3. このチュートリアル用に作成したノートブックインスタンスを選択し、[Actions] (アクション)、[Stop] (停止) の順に選択します。ノートブックインスタンスが停止するまで数分かかることがあります。[Status] (ステータス) が [Stopped] (停止) に変わったら、次のステップに進みます。
  4. [Actions] (アクション) を選択してから、[Delete] (削除) を選択します。
  5. [Delete] (削除) を選択します。

お疲れ様でした。

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

このチュートリアルは役に立ちましたか?

ありがとうございます
このチュートリアルで良かった点をお聞かせください。
閉じる
ご期待に添えず申し訳ありません
古い説明、わかりにくい説明、間違った説明はございませんでしたか? このチュートリアルの改善のために、ぜひフィードバックをお寄せください。
閉じる

Amazon SageMaker Studio のツアーを見る

Amazon SageMaker Autopilot を使用して ML モデルを自動的に構築、トレーニング、およびデプロイする方法を学ぶ