概要
このチュートリアルでは、Amazon SageMaker Studio ノートブック内で機械学習 (ML) モデルをローカルに構築してトレーニングする方法を学びます。
Amazon SageMaker Studio は、機械学習のための統合開発環境 (IDE) であり、フルマネージドな Jupyter Notebook インターフェイスを提供し、エンドツーエンドの機械学習ライフサイクルタスクを実行することができます。SageMaker Studio を使用すると、データセットの作成と探索、トレーニングデータの準備、モデルの構築とトレーニング、およびトレーニング済みモデルの推論へのデプロイをすべて 1 か所で行うことができます。
データセットのサンプルを探索し、完全なデータセットでトレーニングする前に、複数のモデルとパラメータ設定を繰り返すことは、機械学習開発における一般的なプラクティスです。この探索段階において、Amazon SageMaker はローカルモードを提供し、本格的なトレーニングジョブを実行する前に、トレーニングロジックをテストし、異なるモデリングアプローチを試し、モデル性能を評価することができます。
このチュートリアルでは、合成的に生成された自動車保険の請求のデータセットを使用します。入力はトレーニングおよびテストデータセットで、それぞれ請求と顧客に関する詳細や抽出された特徴量、そして請求が不正かそうでないかを示す不正列を含んでいます。オープンソースの XGBoost フレームワークを使用して、この合成データセットで二項分類モデルをプロトタイプ化し、請求が不正である可能性を予測します。
実行する内容
このガイドでは、以下のことを行います。
- Amazon S3 から Amazon SageMaker にトレーニングデータを取り込む
- ローカルで XGBoost モデルを構築し、トレーニングする
- トレーニング済みモデルとアーティファクトを Amazon S3 に保存する
前提条件
本ガイドを開始する前に、以下のものが必要です。
- AWS アカウント: まだお持ちでない場合は、AWS 環境の設定入門ガイドに従って簡単な概要を確認してください。
AWS の使用経験
初心者
所要時間
15 分
完了までのコスト
このチュートリアルにかかるコストの見積もりは、SageMaker の料金を参照してください。
次のことが求められます
AWS アカウントにログインしている必要があります。
使用するサービス
Amazon SageMaker Studio
最終更新日
2022 年 7 月
実装
ステップ 1: Amazon SageMaker Studio ドメインを設定する
Amazon SageMaker では、コンソールを使用して視覚的にモデルをデプロイするか、SageMaker Studio または SageMaker ノートブックのいずれかを使用してプログラムでモデルをデプロイすることができます。このチュートリアルでは、SageMaker Studio ノートブックを使用してプログラムでモデルをデプロイしますが、これには SageMaker Studio ドメインが必要です。
AWS アカウントは、1 つのリージョンにつき 1 つの SageMaker Studio ドメインのみを持つことができます。米国東部 (バージニア北部) リージョンに SageMaker Studio ドメインを既にお持ちの場合は、SageMaker Studio 設定ガイドに従って必要な AWS IAM ポリシーを SageMaker Studio アカウントにアタッチし、ステップ 1 をスキップして直接ステップ 2 に進みます。
既存の SageMaker Studio ドメインがない場合は、ステップ 1 に進み、SageMaker Studio ドメインを作成し、このチュートリアルの残りの部分に必要なアクセス許可を追加する AWS CloudFormation テンプレートを実行します。
AWS CloudFormation スタックリンクを選択します。このリンクから AWS CloudFormation コンソールが開き、SageMaker Studio ドメインと studio-userというユーザーが作成されます。また、SageMaker Studio アカウントに必要なアクセス許可を追加します。CloudFormation コンソールで、右上に表示される [リージョン] が [米国東部 (バージニア北部)] であることを確認します。 [スタック名] は [CFN-SM-IM-Lambda-catalog] とし、変更しないようにします。 このスタックは、すべてのリソースを作成するのに 10 分ほどかかります。
このスタックは、アカウントに既にパブリック VPC が設定されていることを想定しています。パブリック VPC がない場合、パブリック VPC の作成方法については、単一のパブリックサブネットを持つ VPC を参照してください。
[I acknowledge that AWS CloudFormation might create IAM resources] (私は、AWS CloudFormation が IAM リソースを作成する可能性があることを認めます) を選択し、[Create stack] (スタックの作成) を選択します。
[CloudFormation] ペインで、[スタック] を選択します。スタックが作成されるまで 10 分程度かかります。スタックが作成されると、スタックのステータスが [CREATE_IN_PROGRESS] から [CREATE_COMPLETE] に変更されます。
ステップ 2: SageMaker Studio ノートブックを設定する
このステップでは、新しい SageMaker Studio ノートブックを起動し、必要なオープンソースライブラリをインストールし、Amazon Simple Storage Service (Amazon S3) などの他のサービスとやり取りするために必要な SageMaker 変数を設定します。
SageMaker コンソール右上にあるリージョンのドロップダウンリストから、[米国東部 (バージニア北部)] を選択します。[Launch app] (アプリケーションの起動) で [Studio] を選択し、studio-user プロファイルを使用して SageMaker Studio を開きます。
[Set up notebook environment] (ノートブック環境の設定) ダイアログボックスで、[画像] の下にある [データサイエンス] を選択します。[Python 3] カーネルが自動的に選択されます。[選択] を選択します。
以下のコードスニペットをコピーしてノートブックのセルに貼り付け、シフトとエンターキーを押して現在のセルを実行し、AWS の多くのサービスとやりとりするための API であるaiobotocoreライブラリを更新し、XGBoost ライブラリをインストールします。カーネルを再起動するようにという警告や、依存関係の衝突のエラーは無視してください。
%pip install --upgrade -q aiobotocore
%pip install -q xgboost==1.3.1
また、S3 クライアントオブジェクトと、メトリクスやモデルアーティファクトなどのコンテンツがアップロードされるデフォルトの S3 バケット内の場所をインスタンス化する必要があります。これを行うには、以下のコードブロックをコピーして貼り付け、セルを実行します。 書き込みバケット名は、SageMaker セッションオブジェクトから派生していることに注意してください。デフォルトのバケットは sagemaker-<your-Region>-<your-account-id> という名前になっています。このバケットには、すべてのトレーニングアーティファクトがアップロードされます。トレーニングに使用するデータセットは、sagemaker-sample-files という名前のパブリック S3 バケットに存在し、これは読み込みバケットとして指定されています。バケット内の位置は、read prefix で指定します。
import pandas as pd
import boto3
import sagemaker
import json
import joblib
import xgboost as xgb
from sklearn.metrics import roc_auc_score
# Set SageMaker and S3 client variables
sess = sagemaker.Session()
region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)
sagemaker_role = sagemaker.get_execution_role()
# Set read and write S3 buckets and locations
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims"
train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
model_key = f"{write_prefix}/model"
output_key = f"{write_prefix}/output"
train_data_uri = f"s3://{read_bucket}/{train_data_key}"
test_data_uri = f"s3://{read_bucket}/{test_data_key}"
ステップ 3: XGBoost モデルのトレーニング
このステップでは、合成自動車保険請求データセットに対して XGBoost 二項分類モデルを設定およびトレーニングし、モデルの性能を評価します。ターゲット列として、不正 (fraud)という名前の列を使用します。目標は、不正な請求と正当な請求を区別できる XGBoost 二項分類器をトレーニングし、ベースラインのモデル性能を評価することです。
オープンソースの XGBoost フレームワークは、モデル性能を制御するために使用できる複数のハイパーパラメータを公開しています。このチュートリアルでは、いくつかの重要なハイパーパラメータを設定し、受信者動作特性曲線下面積 (ROC-AUC、Receiver Operating Characteristic Area Under the Curve) を評価メトリクスとして選択します。以下のコードブロックをコピーしてセルに貼り付け、XGBoost モデルの交差検証およびトレーニングを実行します。
hyperparams = {
"max_depth": 3,
"eta": 0.2,
"objective": "binary:logistic",
"subsample" : 0.8,
"colsample_bytree" : 0.8,
"min_child_weight" : 3
}
num_boost_round = 100
nfold = 3
early_stopping_rounds = 10
# Set up data input
label_col = "fraud"
data = pd.read_csv(train_data_uri)
# Read training data and target
train_features = data.drop(label_col, axis=1)
train_label = pd.DataFrame(data[label_col])
dtrain = xgb.DMatrix(train_features, label=train_label)
# Cross-validate on training data
cv_results = xgb.cv(
params=hyperparams,
dtrain=dtrain,
num_boost_round=num_boost_round,
nfold=nfold,
early_stopping_rounds=early_stopping_rounds,
metrics=["auc"],
seed=10,
)
metrics_data = {
"binary_classification_metrics": {
"validation:auc": {
"value": cv_results.iloc[-1]["test-auc-mean"],
"standard_deviation": cv_results.iloc[-1]["test-auc-std"]
},
"train:auc": {
"value": cv_results.iloc[-1]["train-auc-mean"],
"standard_deviation": cv_results.iloc[-1]["train-auc-std"]
},
}
}
print(f"Cross-validated train-auc:{cv_results.iloc[-1]['train-auc-mean']:.2f}")
print(f"Cross-validated validation-auc:{cv_results.iloc[-1]['test-auc-mean']:.2f}")
交差検証の性能を測定したら、トレーニングデータセットをいくつかのフォールドに分割する代わりに、テストセットを早期停止に使用しながら、完全なトレーニングデータセットでモデルを再トレーニングすることができます。早期停止はモデルの複雑さを制御するのに役立ち、過剰適合を減らします。以下のコードブロックをコピーして貼り付け、トレーニングデータセットとテストデータセットで再トレーニングと評価を行います。なお、ローカルモードでの再トレーニングは、データセットが Amazon S3 からローカルの SageMaker Studio インスタンス環境に引き出されることを意味します。SageMaker Studio インスタンスには、ローカルにデータを保存するのに十分な容量がある必要があります。
data = pd.read_csv(test_data_uri)
test_features = data.drop(label_col, axis=1)
test_label = pd.DataFrame(data[label_col])
dtest = xgb.DMatrix(test_features, label=test_label)
model = (xgb.train(params=hyperparams, dtrain=dtrain, evals = [(dtrain,'train'), (dtest,'eval')], num_boost_round=num_boost_round,
early_stopping_rounds=early_stopping_rounds, verbose_eval = 0)
)
# Test model performance on train and test sets
test_pred = model.predict(dtest)
train_pred = model.predict(dtrain)
test_auc = roc_auc_score(test_label, test_pred)
train_auc = roc_auc_score(train_label, train_pred)
print(f"Train-auc:{train_auc:.2f}, Test-auc:{test_auc:.2f}")
これで、自動車保険請求データセットに対する二項分類モデルのトレーニングと評価は完了です。以下のコードブロックをコピーして貼り付け、評価メトリクスを JSON ファイルとして、トレーニング済みモデルを pickle ファイルとして保存します。このコードは、SageMaker Studio 内のローカルディレクトリと、デフォルトの S3 バケットに、両方保存します。
# Save model and performance metrics locally
with open("./metrics.json", "w") as f:
json.dump(metrics_data, f)
with open("./xgboost-model", "wb") as f:
joblib.dump(model, f)
# Upload model and performance metrics to S3
metrics_location = output_key + "/metrics.json"
model_location = model_key + "/xgboost-model"
s3_client.upload_file(Filename="./metrics.json", Bucket=write_bucket, Key=metrics_location)
s3_client.upload_file(Filename="./xgboost-model", Bucket=write_bucket, Key=model_location)
ステップ 4: リソースのクリーンアップ
意図しない料金が発生しないように、使用しなくなったリソースは削除することがベストプラクティスです。
S3 バケットを削除するには、以下を実行します。
- Amazon S3 コンソールを開きます。ナビゲーションバーで、[バケット]、sagemaker-<your-Region>-<your-account-id> を選択し、[fraud-detect-demo] の横のチェックボックスを選択します。その後、[Delete] (削除) を選択します。
- [Delete objects] (オブジェクトの削除) ダイアログボックスで、削除するオブジェクトが正しく選択されていることを確認し、[Permanently delete objects] (オブジェクトの完全削除) 確認ボックスに [permanently delete] (完全に削除する) と入力します。
- これが完了し、バケットが空になったら、再度同じ手順で sagemaker-<your-Region>-<your-account-id> バケットを削除することができます。
このチュートリアルでノートブック画像を実行するために使用されているデータサイエンスカーネルは、カーネルを停止するか、次のステップを実行してアプリケーションを削除するまで、料金が蓄積されます。 詳細については、Amazon SageMaker Developer Guideのリソースのシャットダウンを参照してください。
SageMaker Studio のアプリケーションを削除するには、次の手順を実行します。SageMaker Studio コンソールで、[studio-user] を選択し、[Delete app] (アプリケーションの削除) を選択して [Apps] (アプリケーション) の下に表示されているアプリケーションをすべて削除します。[ステータス] が [削除] に変わるまで待ちます。
ステップ 1 で既存の SageMaker Studio ドメインを使用した場合は、ステップ 4 の残りをスキップして、結論のセクションに直接進んでください。
ステップ 1 で CloudFormation テンプレートを実行して新しい SageMaker Studio ドメインを作成した場合は、次のステップに進み、CloudFormation テンプレートで作成したドメイン、ユーザー、リソースを削除してください。
[CloudFormation] ペインで、[スタック] を選択します。ステータスドロップダウンリストから、[アクティブ] を選択します。[スタック名] で、[CFN-SM-IM-Lambda-catalog] を選択し、スタックの詳細ページを開きます。
まとめ
おめでとうございます。 これで、「機械学習モデルをローカルに構築し、トレーニングする」チュートリアルが終了しました。
このチュートリアルでは、Amazon SageMaker Studio を使用して、XGBoost オープンソースライブラリを使用して二項分類モデルをローカルに構築し、モデルアーティファクトおよび出力を Amazon S3 に保存しました。このチュートリアルで示したように、SageMaker Studio で迅速にプロトタイプを作成することで、完全なデータセットを使用して本番モデルのトレーニングを行う前に、モデル性能と過剰適合の可能性の問題を評価することができます。
以下の次のステップのセクションに従うことで、Amazon SageMaker を使用したデータサイエンティストのジャーニーを続けることができます。