機械学習モデルをトレーニングする

チュートリアル

概要

このチュートリアルでは、Amazon SageMaker Studio と Amazon SageMaker Clarify を使用して、機械学習 (ML) モデルをトレーニング、チューニング、評価する方法を学びます。

Amazon SageMaker Studio は、機械学習のための統合開発環境 (IDE) であり、フルマネージドな Jupyter Notebook インターフェイスを提供し、エンドツーエンドの機械学習ライフサイクルタスクを実行することができます。SageMaker Studio を使用すると、データセットの作成と探索、トレーニングデータの準備、モデルの構築、トレーニング、チューニング、およびトレーニング済みモデルの推論へのデプロイをすべて 1 か所で行うことができます。Amazon SageMaker Clarify を使用すると、トレーニングデータとモデルの可視性が向上するため、バイアスを特定して制限し、予測を説明できるようになります。

このチュートリアルでは、合成的に生成された自動車保険の請求のデータセットを使用します。入力はトレーニング、検証、テストデータセットで、それぞれ請求と顧客に関する詳細や抽出された特徴量、そして請求が不正かそうでないかを示す不正列を含んでいます。オープンソースの XGBoost フレームワークを使用して、この合成データセットで二項分類モデルを構築し、請求が不正である可能性を予測します。 また、バイアスと特微量の重要性レポートを実行してトレーニング済みモデルを評価し、テスト用にモデルをデプロイし、サンプル推論を実行してモデルのパフォーマンスを評価し、予測を説明することができます。

実行する内容

このガイドでは、以下のことを行います。

  • スクリプトモードを使用したモデルの構築、トレーニング、およびチューニング
  • ML モデルのバイアスを検出し、モデルの予測を理解する
  • トレーニングされたモデルをリアルタイム推論エンドポイントにデプロイし、テストする
  • サンプル予測を生成し、特微量の影響を理解することにより、モデルを評価する

前提条件

本ガイドを開始する前に、以下のものが必要です。

  • AWS アカウント: まだお持ちでない場合は、AWS 環境の設定入門ガイドに従って簡単な概要を確認してください。

 AWS の使用経験

初心者

 所要時間

2 時間

 完了までのコスト

このチュートリアルにかかるコストの見積もりは、SageMaker の料金を参照してください。

 次のことが求められます

AWS アカウントにログインしている必要があります。

 使用するサービス

Amazon SageMaker Studio、Amazon SageMaker Clarify

 最終更新日

2022 年 5 月 3 日

実装

ステップ 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 Studio] と入力し、[SageMaker Studio] を選択します。

SageMaker コンソール右上にあるリージョンのドロップダウンリストから、[米国東部 (バージニア北部)] を選択します。[Launch app] (アプリケーションの起動) で [Studio] を選択し、studio-user プロファイルを使用して SageMaker Studio を開きます。

SageMaker Studio インターフェイスを開きます。ナビゲーションバーで、[ファイル]、[新規作成]、[ノートブック] を選択します。 

[Set up notebook environment] (ノートブック環境の設定) ダイアログボックスで、[画像] の下にある [データサイエンス] を選択します。[Python 3] カーネルが自動的に選択されます。[選択] を選択します。

ノートブックの右上のカーネルに [Python 3 (Data Science)] (Python 3 (データサイエンス)) と表示されているはずです。

オープンソースの XGBoost と Pandas ライブラリの特定のバージョンをインストールするには、次のコードスニペットをコピーしてノートブックのセルに貼り付け、シフトとエンターキーを押して現在のセルを実行します。カーネルを再起動するようにという警告や、依存関係の衝突のエラーは無視してください。

%pip install -q  xgboost==1.3.1 pandas==1.0.5

また、S3 クライアントオブジェクトと、メトリクスやモデルアーティファクトなどのコンテンツがアップロードされるデフォルトの S3 バケット内の場所をインスタンス化する必要があります。これを行うには、以下のコード例をコピーしてノートブックのセルに貼り付け、実行します。 

import pandas as pd
import boto3
import sagemaker
import json
import joblib
from sagemaker.xgboost.estimator import XGBoost
from sagemaker.tuner import (
    IntegerParameter,
    ContinuousParameter,
    HyperparameterTuner
)
from sagemaker.inputs import TrainingInput
from sagemaker.image_uris import retrieve
from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer

# Setting SageMaker variables
sess = sagemaker.Session()
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)

sagemaker_role = sagemaker.get_execution_role()
sagemaker_client = boto3.client("sagemaker")
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 


# Setting S3 location for read and write operations
train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
validation_data_key = f"{read_prefix}/validation.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}"
validation_data_uri = f"s3://{read_bucket}/{validation_data_key}"
model_uri = f"s3://{write_bucket}/{model_key}"
output_uri = f"s3://{write_bucket}/{output_key}"
estimator_output_uri = f"s3://{write_bucket}/{write_prefix}/training_jobs"
bias_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/bias"
explainability_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/explainability"

書き込みバケット名は、SageMaker セッションオブジェクトから派生していることに注意してください。デフォルトのバケットは sagemaker-<your-Region>-<your-account-id> という名前になっています。このバケットには、すべてのトレーニングアーティファクトがアップロードされます。トレーニングに使用するデータセットは、sagemaker-sample-filesという名前のパブリック S3 バケットに存在し、これは読み込みバケットとして指定されています。 なお、インポートされる SageMaker XGBoost フレームワークは、前のステップでインストールしたオープンソースのフレームワークではありません。これは、モデルのトレーニングをスケールアップするために使用する Docker コンテナイメージの組み込みフレームワークです。

以下のコードブロックをコピーして貼り付け、モデル名とトレーニングおよび推論インスタンスの構成と回数を設定します。これらの設定により、適切なインスタンスタイプとカウントを使用して、トレーニングと推論のプロセスを管理することができます。

tuning_job_name_prefix = "xgbtune" 
training_job_name_prefix = "xgbtrain"

xgb_model_name = "fraud-detect-xgb-model"
endpoint_name_prefix = "xgb-fraud-model-dev"
train_instance_count = 1
train_instance_type = "ml.m4.xlarge"
predictor_instance_count = 1
predictor_instance_type = "ml.m4.xlarge"
clarify_instance_count = 1
clarify_instance_type = "ml.m4.xlarge"

ステップ 3: スクリプトモードでのハイパーパラメータチューニングジョブの起動

SageMaker Studio では、Python スクリプト内に独自のロジックを持ち込んでトレーニングに使用することができます。トレーニングロジックをスクリプトでカプセル化することで、AWS が管理する共通の機械学習フレームワークコンテナを使用しながら、カスタムトレーニングルーチンやモデル構成を取り入れることができます。このチュートリアルでは、AWS が提供する XGBoost コンテナがサポートするオープンソースの XGBoost フレームワークを使用したトレーニングスクリプトを用意し、ハイパーパラメータのチューニングジョブを大規模に起動します。モデルのトレーニングには、ターゲットカラムとして不正列を使用します。

スクリプトモードの最初のレベルは、自己完結型でカスタマイズされた Python スクリプトで独自のトレーニングプロセスを定義し、SageMaker 推定子を定義する際のエントリポイントとしてそのスクリプトを使用する機能です。次のコードブロックをコピーして貼り付けると、モデルトレーニングロジックをカプセル化した Python スクリプトを書くことができます。

%%writefile xgboost_train.py

import argparse
import os
import joblib
import json
import pandas as pd
import xgboost as xgb
from sklearn.metrics import roc_auc_score

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # Hyperparameters and algorithm parameters are described here
    parser.add_argument("--num_round", type=int, default=100)
    parser.add_argument("--max_depth", type=int, default=3)
    parser.add_argument("--eta", type=float, default=0.2)
    parser.add_argument("--subsample", type=float, default=0.9)
    parser.add_argument("--colsample_bytree", type=float, default=0.8)
    parser.add_argument("--objective", type=str, default="binary:logistic")
    parser.add_argument("--eval_metric", type=str, default="auc")
    parser.add_argument("--nfold", type=int, default=3)
    parser.add_argument("--early_stopping_rounds", type=int, default=3)
    

    # SageMaker specific arguments. Defaults are set in the environment variables
    # Location of input training data
    parser.add_argument("--train_data_dir", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
    # Location of input validation data
    parser.add_argument("--validation_data_dir", type=str, default=os.environ.get("SM_CHANNEL_VALIDATION"))
    # Location where trained model will be stored. Default set by SageMaker, /opt/ml/model
    parser.add_argument("--model_dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
    # Location where model artifacts will be stored. Default set by SageMaker, /opt/ml/output/data
    parser.add_argument("--output_data_dir", type=str, default=os.environ.get("SM_OUTPUT_DATA_DIR"))
    
    args = parser.parse_args()

    data_train = pd.read_csv(f"{args.train_data_dir}/train.csv")
    train = data_train.drop("fraud", axis=1)
    label_train = pd.DataFrame(data_train["fraud"])
    dtrain = xgb.DMatrix(train, label=label_train)
    
    
    data_validation = pd.read_csv(f"{args.validation_data_dir}/validation.csv")
    validation = data_validation.drop("fraud", axis=1)
    label_validation = pd.DataFrame(data_validation["fraud"])
    dvalidation = xgb.DMatrix(validation, label=label_validation)

    params = {"max_depth": args.max_depth,
              "eta": args.eta,
              "objective": args.objective,
              "subsample" : args.subsample,
              "colsample_bytree":args.colsample_bytree
             }
    
    num_boost_round = args.num_round
    nfold = args.nfold
    early_stopping_rounds = args.early_stopping_rounds
    
    cv_results = xgb.cv(
        params=params,
        dtrain=dtrain,
        num_boost_round=num_boost_round,
        nfold=nfold,
        early_stopping_rounds=early_stopping_rounds,
        metrics=["auc"],
        seed=42,
    )
    
    model = xgb.train(params=params, dtrain=dtrain, num_boost_round=len(cv_results))
    
    train_pred = model.predict(dtrain)
    validation_pred = model.predict(dvalidation)
    
    train_auc = roc_auc_score(label_train, train_pred)
    validation_auc = roc_auc_score(label_validation, validation_pred)
    
    print(f"[0]#011train-auc:{train_auc:.2f}")
    print(f"[0]#011validation-auc:{validation_auc:.2f}")

    metrics_data = {"hyperparameters" : params,
                    "binary_classification_metrics": {"validation:auc": {"value": validation_auc},
                                                      "train:auc": {"value": train_auc}
                                                     }
                   }
              
    # Save the evaluation metrics to the location specified by output_data_dir
    metrics_location = args.output_data_dir + "/metrics.json"
    
    # Save the model to the location specified by model_dir
    model_location = args.model_dir + "/xgboost-model"

    with open(metrics_location, "w") as f:
        json.dump(metrics_data, f)

    with open(model_location, "wb") as f:
        joblib.dump(model, f)

このスクリプトでは、先ほどインストールしたオープンソースの XGBoost ライブラリがインポートされていることに注意してください。

SageMaker はエントリポイントスクリプトを実行し、モデル設定の詳細や入出力パスなど、すべての入力パラメータをコマンドライン引数として供給します。スクリプトは「argparse」Python ライブラリを使用して、供給された引数をキャプチャします。

トレーニングスクリプトは Docker コンテナ内で実行され、SageMaker は自動的に Amazon S3 からコンテナ内のローカルパスにトレーニングと検証のデータセットをダウンロードします。これらの場所は、環境変数を通してアクセスすることができます。SageMaker の環境変数を網羅したリストは、環境変数を参照してください。

トレーニングスクリプトを準備したら、SageMaker 推定子をインスタンス化することができます。カスタムスクリプトを実行できる XGBoost コンテナを管理するため、AWS が管理する XGBoost 推定子を使用します。XGBoost 推定子をインスタンス化するには、以下のコードをコピーして貼り付けてください。

# SageMaker estimator

# Set static hyperparameters that will not be tuned
static_hyperparams = {  
                        "eval_metric" : "auc",
                        "objective": "binary:logistic",
                        "num_round": "5"
                      }

xgb_estimator = XGBoost(
                        entry_point="xgboost_train.py",
                        output_path=estimator_output_uri,
                        code_location=estimator_output_uri,
                        hyperparameters=static_hyperparams,
                        role=sagemaker_role,
                        instance_count=train_instance_count,
                        instance_type=train_instance_type,
                        framework_version="1.3-1",
                        base_job_name=training_job_name_prefix
                    )

推定子を指定する際に、静的な設定パラメータを指定することができます。このチュートリアルでは、評価メトリクスとして Receiver Operating Characteristics Area Under the Curve (ROC-AUC) を使用します。実行にかかる時間を制御するため、ラウンド数を 5 回に設定しています。

カスタムスクリプトとトレーニングインスタンスの構成は、推定子オブジェクトに引数として渡されます。XGBoost のバージョンは、先にインストールしたものと同じものが選ばれています。

 

このチュートリアルでは、4 つの XGBoost のハイパーパラメータをチューニングします。

  • eta: 過剰適合を防ぐために更新で使用されるステップサイズの縮小。各ブースティングステップの後、新しい特徴量の重みを直接取得することができます。eta パラメータは実際に特徴量の重みを縮小し、ブースティング処理をより保守的にします。
  • サブサンプル: トレーニングインスタンスのサブサンプル比率。0.5 に設定すると、XGBoost はツリーを成長させる前にトレーニングデータの半分をランダムにサンプリングすることを意味します。ブースティングの反復ごとに異なるサブセットを使用することで、過剰適合を防ぐことができます。
  • colsample_bytree: ブースティング処理の各ツリーを生成するために使用される特徴量の一部。各ツリーの生成に特徴量のサブセットを用いることで、モデリングプロセスのランダム性を高め、一般化率を向上させます。
  • max_depth: ツリーの最大深度。この値を大きくすると、モデルがより複雑になり、過剰適合する可能性が高くなります。

以下のコードブロックをコピーして貼り付け、先行するハイパーパラメータの検索範囲を設定します。

# Setting ranges of hyperparameters to be tuned
hyperparameter_ranges = {
    "eta": ContinuousParameter(0, 1),
    "subsample": ContinuousParameter(0.7, 0.95),
    "colsample_bytree": ContinuousParameter(0.7, 0.95),
    "max_depth": IntegerParameter(1, 5)
}

以下のコードブロックをコピーして貼り付け、ハイパーパラメータチューナーを設定します。SageMaker は、検索処理のためにベイズ最適化ルーチンをデフォルトで実行します。このチュートリアルでは、実行時間を短縮するためにランダム検索アプローチを使用します。パラメータは、検証データセットにおけるモデルの AUC パフォーマンスに基づいてチューニングされます。

objective_metric_name = "validation:auc"

# Setting up tuner object
tuner_config_dict = {
                     "estimator" : xgb_estimator,
                     "max_jobs" : 5,
                     "max_parallel_jobs" : 2,
                     "objective_metric_name" : objective_metric_name,
                     "hyperparameter_ranges" : hyperparameter_ranges,
                     "base_tuning_job_name" : tuning_job_name_prefix,
                     "strategy" : "Random"
                    }
tuner = HyperparameterTuner(**tuner_config_dict)

チューナーオブジェクトの fit() メソッドを呼び出すと、ハイパーパラメータのチューニングジョブを起動することができます。チューナーのフィットのために、異なる入力チャネルを指定することができます。このチュートリアルでは、トレーニングと検証のチャネルを提供します。以下のコードブロックをコピーして貼り付け、ハイパーパラメータチューニングジョブを起動します。これは約 13 分で完了します。

# Setting the input channels for tuning job
s3_input_train = TrainingInput(s3_data="s3://{}/{}".format(read_bucket, train_data_key), content_type="csv", s3_data_type="S3Prefix")
s3_input_validation = (TrainingInput(s3_data="s3://{}/{}".format(read_bucket, validation_data_key), 
                                    content_type="csv", s3_data_type="S3Prefix")
                      )

tuner.fit(inputs={"train": s3_input_train, "validation": s3_input_validation}, include_cls_metadata=False)
tuner.wait()

起動したチューニングジョブは、SageMaker コンソールの[Hyperparameter tuning jobs] (ハイパーパラメータチューニングジョブ) から確認できます (タイムスタンプが異なるため、添付画像にあるチューニングジョブ名と表示内容が一致しないことに注意してください)。

 

 

チューニングが完了すると、結果のサマリーにアクセスすることができます。以下のコードブロックをコピーして貼り付けると、チューニングジョブの結果がパフォーマンスの降順で並んだ pandas データフレームに取得されます。

# Summary of tuning results ordered in descending order of performance
df_tuner = sagemaker.HyperparameterTuningJobAnalytics(tuner.latest_tuning_job.job_name).dataframe()
df_tuner = df_tuner[df_tuner["FinalObjectiveValue"]>-float('inf')].sort_values("FinalObjectiveValue", ascending=False)
df_tuner

最も良い性能を発揮したハイパーパラメータの組み合わせを確認することができます。

 

 

ステップ 4: モデルのバイアスをチェックし、SageMaker Clarify を使ってモデルの予測を説明する

トレーニング済みモデルができたら、デプロイする前に、モデルやデータに固有のバイアスがないかどうかを理解することが重要です。モデルの予測はバイアスの原因となり得ます (例えば、あるグループに対して別のグループよりも頻繁に否定的な結果をもたらすような予測をする場合など)。SageMaker Clarify では、トレーニング済みモデルがどのように予測を行うのか、特徴量帰属アプローチを用いて説明します。このチュートリアルでは、モデルの説明可能性のために、トレーニング後のバイアスメトリクスと SHAP の値に焦点を当てます。具体的には、以下のような一般的なタスクがカバーされています。

  • データおよびモデルのバイアス検出
  • 特徴量重要度値を用いたモデルの説明可能性
  • 単一データサンプルの特徴量と局所的説明の影響

SageMaker Clarify がモデルバイアス検出を行うには、SageMaker モデルが必要です。SageMaker Clarify はこれを分析の一部としてエフェメラルエンドポイントにデプロイします。このエンドポイントは、SageMaker Clarify による分析が完了すると削除されます。以下のコードブロックをコピーして貼り付け、チューニングジョブから特定された最適なトレーニングジョブから SageMaker モデルを作成します。

tuner_job_info = sagemaker_client.describe_hyper_parameter_tuning_job(HyperParameterTuningJobName=tuner.latest_tuning_job.job_name)

model_matches = sagemaker_client.list_models(NameContains=xgb_model_name)["Models"]

if not model_matches:
    _ = sess.create_model_from_job(
            name=xgb_model_name,
            training_job_name=tuner_job_info['BestTrainingJob']["TrainingJobName"],
            role=sagemaker_role,
            image_uri=tuner_job_info['TrainingJobDefinition']["AlgorithmSpecification"]["TrainingImage"]
            )
else:

    print(f"Model {xgb_model_name} already exists.")

バイアス検出を実行するために、SageMaker Clarify では複数のコンポーネント構成が設定されていることが予想されます。詳しくは Amazon SageMaker Clarify をご覧ください。このチュートリアルでは、標準的な構成とは別に、ターゲットが顧客の性別に基づいた値に偏っているかどうかをチェックすることによって、データが統計的に女性に偏っているかどうかを検出するように SageMaker Clarify を設定します。以下のコードをコピーして貼り付け、SageMaker Clarify 構成を設定します。

train_df = pd.read_csv(train_data_uri)
train_df_cols = train_df.columns.to_list()

clarify_processor = sagemaker.clarify.SageMakerClarifyProcessor(
    role=sagemaker_role,
    instance_count=clarify_instance_count,
    instance_type=clarify_instance_type,
    sagemaker_session=sess,
)

# Data config
bias_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=bias_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Model config
model_config = sagemaker.clarify.ModelConfig(
    model_name=xgb_model_name,
    instance_type=train_instance_type,
    instance_count=1,
    accept_type="text/csv",
)

# Model predictions config to get binary labels from probabilities
predictions_config = sagemaker.clarify.ModelPredictedLabelConfig(probability_threshold=0.5)

# Bias config
bias_config = sagemaker.clarify.BiasConfig(
    label_values_or_threshold=[0],
    facet_name="customer_gender_female",
    facet_values_or_threshold=[1],
)

# Run Clarify job
clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"])

clarify_bias_job_name = clarify_processor.latest_job.name

SageMaker Clarify 内では、トレーニング前のメトリクスはデータ内の既存のバイアスを示し、トレーニング後のメトリクスはモデルからの予測のバイアスを示します。SageMaker SDK を使用すると、バイアスをチェックするグループと、考慮するバイアスメトリクスを指定することができます。このチュートリアルでは、Class Imbalance (CI)予測ラベルの正比例の差 (DPPL) を、それぞれトレーニング前とトレーニング後のバイアス統計の例として使用します。その他のバイアスメトリクスの詳細は、トレーニング前のバイアスの測定トレーニング後のデータとモデルのバイアスをご覧ください。以下のコードブロックをコピーして貼り付けると、SageMaker Clarify が実行され、バイアスレポートが生成されます。選択したバイアスメトリクスは run_bias メソッドの引数として渡されます。このコードは約 12 分で完了します。

clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"]
    )

clarify_bias_job_name = clarify_processor.latest_job.name

SageMaker Clarify の出力は、デフォルトの S3 バケットに保存されます。以下のコードをコピーして貼り付け、SageMaker Clarify のレポートを PDF 形式で Amazon S3 から SageMaker Studio のローカルディレクトリにダウンロードします。

# Copy bias report and view locally
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/bias/report.pdf ./clarify_bias_output.pdf

PDF レポートでは、トレーニング前とトレーニング後のバイアスメトリクスに基づき、データセットには顧客の性別の特微量に関してクラスの不均衡があるように見えます。このようなアンバランスは、SMOTE などの技術を適用してトレーニングデータセットを再作成することで修正することができます。また、SageMaker Data Wrangler を使用して、サービス内で利用可能な SMOTE を含む複数のオプションのいずれかを指定し、トレーニングデータセットのバランスをとることができます。詳細については、Data Wrangler Balance Data を参照してください。このチュートリアルでは、簡潔にするため、このステップは含まれていません。

SageMaker Clarify では、データのバイアスに加えて、トレーニング済みモデルを分析し、特微量重要度に基づいてモデルの説明可能性レポートを作成することもできます。SageMaker Clarify は SHAP 値を使用して、各入力特微量が最終的な予測に与える寄与度を説明します。以下のコードブロックをコピーして貼り付け、モデルの説明可能性分析を構成および実行します。このコードブロックは約 14 分で完了します。

explainability_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=explainability_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Use mean of train dataset as baseline data point
shap_baseline = [list(train_df.drop(["fraud"], axis=1).mean())]

shap_config = sagemaker.clarify.SHAPConfig(
    baseline=shap_baseline,
    num_samples=500,
    agg_method="mean_abs",
    save_local_shap_values=True,
)

clarify_processor.run_explainability(
    data_config=explainability_data_config,
    model_config=model_config,
    explainability_config=shap_config
)

以下のコードをコピーして貼り付け、SageMaker Clarify の説明可能性レポートを PDF 形式で Amazon S3 から SageMaker Studio のローカルディレクトリにダウンロードします。

# Copy explainability report and view
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/explainability/report.pdf ./clarify_explainability_output.pdf

このレポートには、入力特徴量がモデル予測にどのように寄与しているかを示す特徴量重要度チャートが含まれています。このチュートリアルでトレーニング済みのモデルでは、num-injuries 特微量が最も重要なロールを果たし、customer_gender_male 特微量がその後に続いて予測を生成しているようです。このような特微量のランキングは、予測メカニズムに対する重要なインサイトを提供し、公正で説明可能な機械学習の使用でモデルの改良と開発を促進します。

 

 

バイアスや説明可能性の分析結果は、SageMaker Studio のドロップダウンリストの [SageMaker リソース] と[Experiments and trials] (実験とトライアル) オプションでも確認することができます。[Unassigned trial components] (アサインされていないトライアルコンポーネント) を選択します。

 

 

clarify-explainability-<datetimestamp>という名前の説明可能性レポートを選択します。

 

 

[Explainability] (説明可能性) タブでは、特徴量重要度チャートを可視化することができます。また、[PDF レポートのエクスポート] を選択して、レポートをダウンロードすることもできます。

 

 

SageMaker Clarify が生成する説明可能性レポートには、個々のサンプルのローカル SHAP 値を含む out.csv というファイルも含まれます。以下のコードブロックをコピーして貼り付け、このファイルを使用して、任意の 1 つの例の説明 (各特微量がモデルの予測に与える影響) を可視化することができます。

import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
local_explanations_out = pd.read_csv(explainability_report_output_uri + "/explanations_shap/out.csv")
feature_names = [str.replace(c, "_label0", "") for c in 
local_explanations_out.columns.to_series()]
local_explanations_out.columns = feature_names

selected_example = 100
print("Example number:", selected_example)

local_explanations_out.iloc[selected_example].plot(
    kind="bar", title="Local explanation for the example number " + str(selected_example), rot=60, figsize=(20, 8)
);

選択された例 (テストセットの最初のサンプル) では、総請求額、性別、および負傷の数が予測に最も寄与しました。

 

 

ステップ 5: リアルタイム推論エンドポイントにモデルをデプロイする

このステップでは、ハイパーパラメータチューニングジョブから得られた最適なモデルをリアルタイム推論エンドポイントにデプロイし、そのエンドポイントを使用して予測を生成します。トレーニング済みのモデルをデプロイする方法としては、SageMaker SDK、AWS SDK - Boto3、SageMaker コンソールなど、複数の方法があります。詳細については、Amazon SageMaker ドキュメントの推論のためのモデルのデプロイを参照してください。この例では、SageMaker SDK を使用してリアルタイムエンドポイントにモデルをデプロイします。

 

以下のコードブロックをコピーして貼り付け、最適なモデルをデプロイします。

best_train_job_name = tuner.best_training_job()

model_path = estimator_output_uri + '/' + best_train_job_name + '/output/model.tar.gz'
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")
create_model_config = {"model_data":model_path,
                       "role":sagemaker_role,
                       "image_uri":training_image,
                       "name":endpoint_name_prefix,
                       "predictor_cls":sagemaker.predictor.Predictor
                       }
# Create a SageMaker model
model = sagemaker.model.Model(**create_model_config)

# Deploy the best model and get access to a SageMaker Predictor
predictor = model.deploy(initial_instance_count=predictor_instance_count, 
                         instance_type=predictor_instance_type,
                         serializer=CSVSerializer(),
                         deserializer=CSVDeserializer())
print(f"\nModel deployed at endpoint : {model.endpoint_name}")

このコードでは、最適なトレーニングジョブ名を使用して、Amazon S3 からモデルを取得します。XGBoost は、text/libsvm または text/csv 形式のどちらかの入力データを受け取ることができます。このチュートリアルで使用する入力データセットは CSV 形式なので、デプロイ構成には、CSV 入力をバイトストリームに変換する CSVSerializer と、バイトストリームのネイティブモデル出力を消費用に CSV 形式に戻す CSVDeserializer が含まれています。完了すると、コードブロックはモデルがデプロイされたエンドポイントの名前を返します。また、デプロイでは、次のセクションで示すように、エンドポイントを呼び出して予測を実行するために使用できる SageMaker Predictor も返されます。

 

SageMaker Studio インターフェイスから SageMaker リソースアイコンをクリックし、ドロップダウンリストから [エンドポイント] を選択すると、デプロイされたエンドポイントを確認することができます。

また、SageMaker コンソールの [推論]、[エンドポイント] からもエンドポイントを確認することができます。

モデルがエンドポイントにデプロイされたので、REST API を直接呼び出す (このチュートリアルでは説明しません)、AWS SDK を使用する、SageMaker Studio のグラフィカルインターフェイスを使用する、または SageMaker Python SDK を使用することで呼び出すことができます。このチュートリアルでは、デプロイステップで利用可能になる SageMaker Predictor を使用して、1 つまたは複数のテストサンプルでリアルタイムのモデル予測を取得します。以下のコードブロックをコピーして貼り付け、エンドポイントを呼び出し、テストデータのサンプルを 1 つ送信します。

# Sample test data
test_df = pd.read_csv(test_data_uri)
payload = test_df.drop(["fraud"], axis=1).iloc[0].to_list()
print(f"Model predicted score : {float(predictor.predict(payload)[0][0]):.3f}, True label : {test_df['fraud'].iloc[0]}")

セルの出力には、モデルエンドポイントから送り返された true ラベルと予測されたスコアが表示されます。予測された確率は非常に低いので、テストサンプルはモデルによって不正でなく正しくラベル付けされました。

ステップ 6: リソースをクリーンアップする

意図しない料金が発生しないように、使用しなくなったリソースは削除することがベストプラクティスです。

モデルとエンドポイントを削除するには、以下のコードをコピーしてノートブックに貼り付けます。

# Delete model
try:
 sess.delete_model(xgb_model_name)
except:
 pass
sess.delete_model(model.name)

# Delete inference endpoint config
sess.delete_endpoint_config(endpoint_config_name=predictor._get_endpoint_config_name())

# Delete inference endpoint
sess.delete_endpoint(endpoint_name=model.endpoint_name)

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 ドメインを使用した場合は、ステップ 6 の残りをスキップして、結論のセクションに直接進んでください。 

ステップ 1 で CloudFormation テンプレートを実行して新しい SageMaker Studio ドメインを作成した場合は、次のステップに進み、CloudFormation テンプレートで作成したドメイン、ユーザー、リソースを削除してください。  

CloudFormation コンソールを開くには、AWS コンソールの検索バーに [CloudFormation] と入力し、検索結果から [CloudFormation] を選択します。

[CloudFormation] ペインで、[スタック] を選択します。ステータスドロップダウンリストから、[アクティブ] を選択します。スタック名で、[CFN-SM-IM-Lambda-catalog] を選択し、スタックの詳細ページを開きます。

CFN-SM-IM-Lambda-catalog スタックの詳細ページで、[削除] を選択して、ステップ 1 で作成したリソースと一緒にスタックを削除します。

まとめ

おめでとうございます。 これで、機械学習モデルをトレーニングするチュートリアルは終了です。 

このチュートリアルでは、Amazon SageMaker Studio を使用して、スクリプトモードで二項分類モデルをトレーニングしました。オープンソースの XGBoost ライブラリと AWS が管理する XGBoost コンテナを使用して、SageMaker のハイパーパラメータチューニングジョブでモデルをトレーニングおよびチューニングしました。また、SageMaker Clarify を使用してバイアスとモデルの説明可能性を分析し、レポートを使用して個々の予測に対する機能の影響を評価しました。最後に、SageMaker SDK を使用してリアルタイム推論エンドポイントにモデルをデプロイし、サンプルペイロードでテストしました。

以下の次のステップのセクションに従うことで、Amazon SageMaker を使用したデータサイエンティストのジャーニーを続けることができます。

このページは役に立ちましたか?

機械学習モデルを自動的に作成する

コードを書かずに機械学習モデルを開発するために AutoML を使用する方法を学びます。
次へ »

トレーニング済みのモデルをデプロイする

推論のためにトレーニング済み機械学習モデルをデプロイする方法を学びます。
次へ »

その他のハンズオンチュートリアルを探す

他の機械学習チュートリアルを参照して、より深く掘り下げます。
次へ »