

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SageMaker Model Monitor を使用したデータとモデルの品質モニタリング
<a name="model-monitor"></a>

Amazon SageMaker Model Monitor は本番稼働中の Amazon SageMaker 機械学習モデルの品質をモニタリングします。Model Monitor を使用すると、以下を設定できます。
+ リアルタイムエンドポイントを使用した継続的なモニタリング
+ 定期的に実行されるバッチ変換ジョブを使用した継続的なモニタリング
+ 非同期バッチ変換ジョブのスケジュールに沿ったモニタリング

Model Monitor では、モデルの品質に偏差がある場合に通知するアラートを設定できます。のような偏差を早期かつ積極的に検出することで、是正措置を講じることができます。モデルを手動でモニタリングしたり、追加のツールを構築したりする必要なく、モデルの再トレーニング、上流システムの監査、品質問題の修正などの措置を講じることができます。コーディングが不要な Model Monitor のビルド済みモニタリング機能を使用できます。また、カスタム分析を提供するコーディングによってモデルを柔軟に監視できます。

Model Monitor は次のタイプのモニタリング機能を提供します。
+ [データ品質](model-monitor-data-quality.md) - データ品質のドリフトを監視します。
+ [モデルの質](model-monitor-model-quality.md) - モデル品質メトリクス (精度など) のドリフトをモニタリングします。
+ [本番稼働用モデルのバイアスドリフト](clarify-model-monitor-bias-drift.md) - モデルの予測のバイアスをモニタリングします。
+ [本番稼働用モデルの Feature Attribution ドリフト](clarify-model-monitor-feature-attribution-drift.md) - 特徴属性のドリフトを監視します。

**Topics**
+ [本番環境でのモデルのモニタリング](how-it-works-model-monitor.md)
+ [Amazon SageMaker Model Monitor の仕組み](#model-monitor-how-it-works)
+ [データキャプチャ](model-monitor-data-capture.md)
+ [データ品質](model-monitor-data-quality.md)
+ [モデルの質](model-monitor-model-quality.md)
+ [本番稼働用モデルのバイアスドリフト](clarify-model-monitor-bias-drift.md)
+ [本番稼働用モデルの Feature Attribution ドリフト](clarify-model-monitor-feature-attribution-drift.md)
+ [モニタリングジョブのスケジューリング](model-monitor-scheduling.md)
+ [Amazon SageMaker Model Monitor のビルド済みコンテナ](model-monitor-pre-built-container.md)
+ [結果の解釈](model-monitor-interpreting-results.md)
+ [Amazon SageMaker Studio でリアルタイムエンドポイントの結果を視覚化する](model-monitor-interpreting-visualize-results.md)
+ [高度なトピック](model-monitor-advanced-topics.md)
+ [モデルモニターのよくある質問](model-monitor-faqs.md)

# 本番環境でのモデルのモニタリング
<a name="how-it-works-model-monitor"></a>

モデルを本番環境にデプロイした後、Amazon SageMaker Model Monitor を使用して、機械学習モデルの品質をリアルタイムで継続的にモニタリングできます。Amazon SageMaker Model Monitor を使用すると、データドリフトや異常値など、モデルの品質に逸脱がある場合に、自動アラートをトリガーするシステムを設定できます。Amazon CloudWatch Logs は、モデルのステータスをモニタリングするログファイルを収集し、モデルの品質がプリセットした特定のしきい値に達した場合にそれを通知します。CloudWatch は指定された Amazon S3 バケットにログファイルを保存します。モデルモニター製品による AWS モデル偏差の早期かつ積極的な検出により、デプロイされたモデルの品質を維持および改善するための迅速なアクションを実行できます。

SageMaker Model Monitoring 製品情報の詳細については、「[Amazon SageMaker Model Monitor を使用したデータとモデルの品質モニタリング](model-monitor.md)」を参照してください。

SageMaker AI で機械学習ジャーニーを開始するには、[SageMaker AI のセットアップ](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-set-up.html)で AWS アカウントにサインアップします。

## Amazon SageMaker Model Monitor の仕組み
<a name="model-monitor-how-it-works"></a>

Amazon SageMaker Model Monitor は本番稼働の機械学習 (ML) モデルを自動的にモニタリングして、品質問題が発生した場合には通知します。Model Monitor は、ルールを使用してモデルのドリフトを検出し、ドリフトが発生した場合はアラートが表示されます。次の図は、モデルがリアルタイムエンドポイントにデプロイされた場合のこのプロセスの仕組みを示しています。

![\[Amazon SageMaker Model Monitor を使用したモデルのモニタリングプロセス。\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mmv2-architecture.png)


Model Monitor を使用して、リアルタイムエンドポイントの代わりにバッチ変換ジョブをモニタリングすることもできます。この場合、Model Monitor はエンドポイントへのリクエストを受信して予測を追跡する代わりに、推論の入出力をモニタリングします。次の図は、バッチ変換ジョブをモニタリングするプロセスを示しています。

![\[Amazon SageMaker Model Monitor を使用したモデルのモニタリングプロセス。\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mmv2-architecture-batch.png)


モデルのモニタリングを有効にするには、次の手順を実行します。この手順では、さまざまなデータ収集プロセス、モニタリングプロセス、分析プロセスを通じたデータの経路をたどります。
+ リアルタイムエンドポイントで、トレーニング済み ML モデルが受信したリクエストのデータや、結果として得られたモデル予測をキャプチャできるようにします。
+ バッチ変換ジョブでは、バッチ変換の入出力のデータキャプチャを可能にします。
+ モデルトレーニングに使用されたデータセットからベースラインを作成します。ベースラインはメトリクスを計算し、メトリクスの制約を提案します。モデルからのリアルタイム予測またはバッチ予測が、制約と比較されます。制約値を外れた場合、違反として報告されます。
+ 収集するデータ、収集する頻度、分析方法、作成するレポートを指定するモニタリングスケジュールを作成します。
+ 最新のデータとベースラインを比較するレポートを検査します。Amazon CloudWatch から報告された違反、メトリクス、通知がないかを監視します。

**注意事項**  
Model Monitor は、表形式のデータのみに基づいてモデルメトリクスと統計を計算します。例えば、イメージを入力として受け取り、そのイメージに基づいてラベルを出力するイメージ分類モデルも引き続きモニタリングできます。Model Monitor は、入力ではなく出力のメトリクスと統計を計算できます。
Model Monitor は現在、単一モデルをホストするエンドポイントのみをサポートしており、マルチモデルエンドポイントのモニタリングはサポートしていません。マルチモデルエンドポイントの使用方法については、「[マルチモデルエンドポイント](multi-model-endpoints.md)」を参照してください。
Model Monitor は、推論パイプラインのモニタリングをサポートしています。ただし、データのキャプチャと分析はパイプライン内の個別のコンテナではなく、パイプライン全体に対して実行されます。
推論リクエストへの影響を防ぐため、ディスク使用率のレベルが高くなると、データキャプチャはリクエストのキャプチャを停止します。データキャプチャがリクエストのキャプチャを継続して実行できるように、ディスク使用率は 75% 未満に維持することをお勧めします。
カスタム Amazon VPC で SageMaker Studio を起動する場合は、Model Monitor が Amazon S3 および CloudWatch と通信できるように VPC エンドポイントを作成する必要があります。詳細については、*Amazon Virtual Private Cloud ユーザーガイド*の「[VPC エンドポイント](https://docs.aws.amazon.com/vpc/latest/privatelink/concepts.html)」を参照してください。カスタム VPC で SageMaker Studio を起動する方法については、「[VPC 内の Studio ノートブックを外部リソースに接続する](studio-notebooks-and-internet-access.md)」を参照してください。

### Model Monitor のサンプルノートブック
<a name="model-monitor-sample-notebooks"></a>

リアルタイムエンドポイントで Model Monitor を使用した、エンドツーエンドのワークフロー全体にわたって説明するサンプルノートブックについては、「[Introduction to Amazon SageMaker Model Monitor](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_model_monitor/introduction/SageMaker-ModelMonitoring.html)」を参照してください。

モニタリングスケジュールで選択した実行の statistics.json ファイルを視覚化するサンプルノートブックについては、「[Model Monitor Visualization](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_model_monitor/visualization/SageMaker-Model-Monitor-Visualize.html)」を参照してください。

SageMaker AI でサンプルを実行するために使用できる Jupyter Notebook インスタンスを作成してアクセスする方法の詳細については、「[Amazon SageMaker ノートブックインスタンス](nbi.md)」を参照してください。ノートブックインスタンスを作成して開いた後、**[SageMaker AI サンプル]** タブを選択して、すべての SageMaker AI サンプルのリストを表示します。ノートブックを開くには、そのノートブックの **[Use]** (使用) タブを選択し、**[Create copy]** (コピーを作成) を選択します。

# データキャプチャ
<a name="model-monitor-data-capture"></a>

エンドポイントへの入力とデプロイされたモデルからの推論出力を Amazon S3 に記録するには、「データキャプチャ」と呼ばれる機能を有効にできます。**「データキャプチャ」は通常、トレーニング、デバッグ、モニタリングに使用できる情報を記録するために使用されます。**Amazon SageMaker Model Monitor は、このキャプチャされたデータを自動的に解析し、そのデータのメトリクスをモデル用に作成したベースラインと比較します。Model Monitor の詳細については、「[Amazon SageMaker Model Monitor を使用したデータとモデルの品質モニタリング](model-monitor.md)」を参照してください。

 AWS SDK for Python (Boto) または SageMaker Python SDK を使用して、リアルタイムモードとバッチモデルモニターモードの両方*のデータキャプチャ*を実装できます。リアルタイムエンドポイントの場合は、エンドポイントの作成時に「データキャプチャ」設定を指定します。**リアルタイムエンドポイントは永続的であるため、特定の時間にデータキャプチャをオンまたはオフにしたり、サンプリング頻度を変更したりするための追加オプションを設定できます。推論データを暗号化することもできます。

バッチ変換ジョブでは、予定どおりにモデルのモニタリングを実行したり、定期的に行われるバッチ変換ジョブのモデルのモニタリングを継続的に実行したりする場合、「データキャプチャ」を有効にできます。**「データキャプチャ」設定は、バッチ変換ジョブを作成するときに指定します。**この設定では、暗号化を有効にするか、出力で推論 ID を生成することができます。これにより、キャプチャしたデータを Ground Truth データと一致させることができます。

# リアルタイムエンドポイントからデータをキャプチャする
<a name="model-monitor-data-capture-endpoint"></a>

**注記**  
推論リクエストへの影響を防ぐため、ディスク使用率のレベルが高くなると、データキャプチャはリクエストのキャプチャを停止します。データキャプチャがリクエストのキャプチャを続行できるように、ディスク使用率を 75% 未満に抑えることをお勧めします。

リアルタイムエンドポイントのデータをキャプチャするには、SageMaker AI ホスティングサービスを使用してモデルをデプロイする必要があります。これには、SageMaker AI モデルを作成し、エンドポイント設定を定義して、HTTPS エンドポイントを作成する必要があります。

データキャプチャを有効にするために必要な手順は、 AWS SDK for Python (Boto) と SageMaker Python SDK のどちらを使用する場合でも同様です。 AWS SDK を使用する場合は、[CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpointConfig.html) メソッド内で [DataCaptureConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCaptureConfig.html) ディクショナリと必須フィールドを定義して、データキャプチャを有効にします。SageMaker Python SDK を使用する場合は、[DataCaptureConfig](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html#sagemaker.model_monitor.data_capture_config.DataCaptureConfig) クラスをインポートし、このクラスからインスタンスを初期化します。次に、このオブジェクトを `sagemaker.model.Model.deploy()` メソッドの `DataCaptureConfig` パラメータに渡します。

上のコードスニペットを使用するには、コード例の*イタリック体のプレースホルダーテキスト*を独自の情報に置き換えます。

## データキャプチャを有効にする方法
<a name="model-monitor-data-capture-defing.title"></a>

データキャプチャ設定を指定します。この設定では、要求ペイロード、応答ペイロード、またはその両方をキャプチャできます。前述のコードスニペットは、 AWS SDK for Python (Boto) と SageMaker AI Python SDK を使用してデータキャプチャを有効にする方法を示しています。

**注記**  
Model Monitor を使用してリクエストまたはレスポンスペイロードをキャプチャする必要はありません。

------
#### [ AWS SDK for Python (Boto) ]

`CreateEndpointConfig` メソッドを使用してエンドポイントを作成するときに、[DataCaptureConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCaptureConfig.html) ディクショナリでキャプチャするデータを設定します。`EnableCapture` をブール値 True に設定します。また、以下の必須パラメータを指定します。
+ `EndpointConfigName`: エンドポイント設定の名前。この名前は、`CreateEndpoint` リクエストを行うときに使用します。
+ `ProductionVariants`: このエンドポイントでホストするモデルのリスト。モデルごとにディクショナリデータ型を定義します。
+ `DataCaptureConfig`: サンプリングするデータの初期パーセンテージ (`InitialSamplingPercentage`) に対応する整数値、キャプチャしたデータを保存する Amazon S3 URI、キャプチャオプション (`CaptureOptions`) リストを指定するディクショナリデータ型。`CaptureOptions` リスト内の `CaptureMode` に `Input` または `Output` のいずれかを指定します。

key-value ペアの引数を `CaptureContentTypeHeader` ディクショナリに渡すことで、SageMaker AI がキャプチャしたデータをどのようにエンコードするかを任意で指定できます。

```
# Create an endpoint config name.
endpoint_config_name = '<endpoint-config-name>'

# The name of the production variant.
variant_name = '<name-of-production-variant>'                   
  
# The name of the model that you want to host. 
# This is the name that you specified when creating the model.
model_name = '<The_name_of_your_model>'

instance_type = '<instance-type>'
#instance_type='ml.m5.xlarge' # Example    

# Number of instances to launch initially.
initial_instance_count = <integer>

# Sampling percentage. Choose an integer value between 0 and 100
initial_sampling_percentage = <integer>                                                                                                                                                                                                                        

# The S3 URI containing the captured data
s3_capture_upload_path = 's3://<bucket-name>/<data_capture_s3_key>'

# Specify either Input, Output, or both
capture_modes = [ "Input",  "Output" ] 
#capture_mode = [ "Input"] # Example - If you want to capture input only
                            
endpoint_config_response = sagemaker_client.create_endpoint_config(
    EndpointConfigName=endpoint_config_name, 
    # List of ProductionVariant objects, one for each model that you want to host at this endpoint.
    ProductionVariants=[
        {
            "VariantName": variant_name, 
            "ModelName": model_name, 
            "InstanceType": instance_type, # Specify the compute instance type.
            "InitialInstanceCount": initial_instance_count # Number of instances to launch initially.
        }
    ],
    DataCaptureConfig= {
        'EnableCapture': True, # Whether data should be captured or not.
        'InitialSamplingPercentage' : initial_sampling_percentage,
        'DestinationS3Uri': s3_capture_upload_path,
        'CaptureOptions': [{"CaptureMode" : capture_mode} for capture_mode in capture_modes] # Example - Use list comprehension to capture both Input and Output
    }
)
```

その他のエンドポイント設定オプションの詳細については、「[Amazon SageMaker AI サービス API リファレンスガイド](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Operations_Amazon_SageMaker_Service.html)」の「[CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpointConfig.html)」API を参照してください。

------
#### [ SageMaker Python SDK ]

[sagemaker.model\$1monitor](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html) モジュールから `DataCaptureConfig` クラスをインポートします。 `EnableCapture` ブール値 `True` に設定してデータキャプチャを有効にします。

オプションで、以下のパラメータに引数を指定します。
+ `SamplingPercentage`: サンプリングするデータのパーセンテージに対応する整数値。サンプリング率を指定しない場合、SageMaker AI はデフォルトで 20 (20%) のデータをサンプリングします。
+ `DestinationS3Uri`: SageMaker AI がキャプチャしたデータを保存するために使用する Amazon S3 URI。指定しない場合、SageMaker AI はキャプチャしたデータを `"s3://<default-session-bucket>/ model-monitor/data-capture"` に保存します。

```
from sagemaker.model_monitor import DataCaptureConfig

# Set to True to enable data capture
enable_capture = True

# Optional - Sampling percentage. Choose an integer value between 0 and 100
sampling_percentage = <int> 
# sampling_percentage = 30 # Example 30%

# Optional - The S3 URI of stored captured-data location
s3_capture_upload_path = 's3://<bucket-name>/<data_capture_s3_key>'

# Specify either Input, Output or both. 
capture_modes = ['REQUEST','RESPONSE'] # In this example, we specify both
# capture_mode = ['REQUEST'] # Example - If you want to only capture input.

# Configuration object passed in when deploying Models to SM endpoints
data_capture_config = DataCaptureConfig(
    enable_capture = enable_capture, 
    sampling_percentage = sampling_percentage, # Optional
    destination_s3_uri = s3_capture_upload_path, # Optional
    capture_options = ["REQUEST", "RESPONSE"],
)
```

------

## モデルをデプロイする
<a name="model-monitor-data-capture-deploy"></a>

モデルをデプロイし、`DataCapture` を有効にして HTTPS エンドポイントを作成します。

------
#### [ AWS SDK for Python (Boto3) ]

SageMaker AI にエンドポイント設定を提供します。このサービスは、ML コンピューティングインスタンスを起動し、設定で指定された 1 つ以上のモデルをデプロイします。

モデルとエンドポイントの設定が完了したら、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpoint.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpoint.html) API を使用してエンドポイントを作成します。エンドポイント名は、 AWS アカウントの AWS リージョン内で一意である必要があります。

次が、リクエストで指定されたエンドポイント設定を使用してエンドポイントを作成します。Amazon SageMaker AI は、エンドポイントを使用してリソースをプロビジョンし、モデルをデプロイします。

```
# The name of the endpoint. The name must be unique within an AWS Region in your AWS account.
endpoint_name = '<endpoint-name>' 

# The name of the endpoint configuration associated with this endpoint.
endpoint_config_name='<endpoint-config-name>'

create_endpoint_response = sagemaker_client.create_endpoint(
                                            EndpointName=endpoint_name, 
                                            EndpointConfigName=endpoint_config_name)
```

詳細については、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpoint.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpoint.html) API を参照してください。

------
#### [ SageMaker Python SDK ]

エンドポイントの名前を定義します。この手順は省略可能です。指定しない場合、SageMaker AI は一意の名前を作成します。

```
from datetime import datetime

endpoint_name = f"DEMO-{datetime.utcnow():%Y-%m-%d-%H%M}"
print("EndpointName =", endpoint_name)
```

Model オブジェクトに組み込まれている `deploy()` メソッドを使用して、モデルをリアルタイム HTTPS エンドポイントにデプロイします。このモデルをデプロイする Amazon EC2 インスタンスタイプの名前を `instance_type` フィールドに、エンドポイントを実行するインスタンスの初期数を `initial_instance_count` フィールドに指定します。

```
initial_instance_count=<integer>
# initial_instance_count=1 # Example

instance_type='<instance-type>'
# instance_type='ml.m4.xlarge' # Example

# Uncomment if you did not define this variable in the previous step
#data_capture_config = <name-of-data-capture-configuration>

model.deploy(
    initial_instance_count=initial_instance_count,
    instance_type=instance_type,
    endpoint_name=endpoint_name,
    data_capture_config=data_capture_config
)
```

------

## キャプチャしたデータを表示する
<a name="model-monitor-data-capture-view"></a>

SageMaker Python SDK の[予測子](https://sagemaker.readthedocs.io/en/stable/api/inference/predictors.html)クラスから予測子オブジェクトを作成します。`Predictor` クラスによって返されたオブジェクトを使用して、後のステップでエンドポイントを呼び出します。エンドポイントの名前 (以前に `endpoint_name` と定義) と、シリアライザのシリアライザオブジェクトとデシリアライザのデシリアライザオブジェクトを指定します。シリアライザタイプの詳細については、「[SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/index.html)」の「[Serializers](https://sagemaker.readthedocs.io/en/stable/api/inference/serializers.html)」クラスを参照してください。

```
from sagemaker.predictor import Predictor
from sagemaker.serializers import <Serializer>
from sagemaker.deserializers import <Deserializers>

predictor = Predictor(endpoint_name=endpoint_name,
                      serializer = <Serializer_Class>,
                      deserializer = <Deserializer_Class>)

# Example
#from sagemaker.predictor import Predictor
#from sagemaker.serializers import CSVSerializer
#from sagemaker.deserializers import JSONDeserializer

#predictor = Predictor(endpoint_name=endpoint_name,
#                      serializer=CSVSerializer(),
#                      deserializer=JSONDeserializer())
```

このコード例のシナリオでは、`validation_with_predictions` という名前の CSV ファイルにローカルに保存したサンプル検証データを使用してエンドポイントを呼び出します。サンプル検証セットには、各入力のラベルが含まれています。

with ステートメントの最初の数行では、まず検証セットの CSV ファイルを開き、次にファイル内の各行をカンマ文字 `","` で分割し、返された 2 つのオブジェクトを label 変数と input\$1cols 変数に格納します。行ごとに、入力 (`input_cols`) が予測子変数の (`predictor`) オブジェクトの組み込みメソッド `Predictor.predict()` に渡されます。

モデルが確率を返すと仮定します。確率の範囲は 0 から 1.0 までの整数値です。モデルから返される確率が 80% (0.8) を超える場合は、予測に 1 の整数値ラベルを割り当てます。それ以外の場合は、予測に 0 の整数値ラベルを割り当てます。

```
from time import sleep

validate_dataset = "validation_with_predictions.csv"

# Cut off threshold of 80%
cutoff = 0.8

limit = 200  # Need at least 200 samples to compute standard deviations
i = 0
with open(f"test_data/{validate_dataset}", "w") as validation_file:
    validation_file.write("probability,prediction,label\n")  # CSV header
    with open("test_data/validation.csv", "r") as f:
        for row in f:
            (label, input_cols) = row.split(",", 1)
            probability = float(predictor.predict(input_cols))
            prediction = "1" if probability > cutoff else "0"
            baseline_file.write(f"{probability},{prediction},{label}\n")
            i += 1
            if i > limit:
                break
            print(".", end="", flush=True)
            sleep(0.5)
print()
print("Done!")
```

前のステップでデータキャプチャを有効にしたことにより、要求ペイロードと応答ペイロードは、追加のメタデータと共に、`DataCaptureConfig` で指定した Amazon S3 の場所に保存されます。キャプチャデータの Amazon S3 への配信には数分かかる場合があります。

Amazon S3 に保存されたデータキャプチャファイルを一覧表示して、キャプチャされたデータを表示します。Amazon S3 のパス形式は次のとおりです。`s3:///{endpoint-name}/{variant-name}/yyyy/mm/dd/hh/filename.jsonl`

呼び出しが発生した時間に基づいて編成された、異なる期間の異なるファイルが表示されます。以下を実行して 1 つのキャプチャファイルの内容を出力します。

```
print("\n".join(capture_file[-3:-1]))
```

これにより、SageMaker AI 固有の JSON 行形式のファイルが返されます。以下は、`csv/text` データを使用して呼び出したリアルタイムエンドポイントから取得した応答サンプルです。

```
{"captureData":{"endpointInput":{"observedContentType":"text/csv","mode":"INPUT",
"data":"69,0,153.7,109,194.0,105,256.1,114,14.1,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0\n",
"encoding":"CSV"},"endpointOutput":{"observedContentType":"text/csv; charset=utf-8","mode":"OUTPUT","data":"0.0254181120544672","encoding":"CSV"}},
"eventMetadata":{"eventId":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee","inferenceTime":"2022-02-14T17:25:49Z"},"eventVersion":"0"}
{"captureData":{"endpointInput":{"observedContentType":"text/csv","mode":"INPUT",
"data":"94,23,197.1,125,214.5,136,282.2,103,9.5,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1\n",
"encoding":"CSV"},"endpointOutput":{"observedContentType":"text/csv; charset=utf-8","mode":"OUTPUT","data":"0.07675473392009735","encoding":"CSV"}},
"eventMetadata":{"eventId":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee","inferenceTime":"2022-02-14T17:25:49Z"},"eventVersion":"0"}
```

上の例では、`capture_file` オブジェクトはリストタイプです。リストの最初の要素にインデックスを付けると、1 つの推論リクエストが表示されます。

```
# The capture_file object is a list. Index the first element to view a single inference request  
print(json.dumps(json.loads(capture_file[0]), indent=2))
```

これにより次のような応答が返されます。返される値は、エンドポイント設定、SageMaker AI モデル、キャプチャされたデータによって異なります。

```
{
  "captureData": {
    "endpointInput": {
      "observedContentType": "text/csv", # data MIME type
      "mode": "INPUT",
      "data": "50,0,188.9,94,203.9,104,151.8,124,11.6,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0\n",
      "encoding": "CSV"
    },
    "endpointOutput": {
      "observedContentType": "text/csv; charset=character-encoding",
      "mode": "OUTPUT",
      "data": "0.023190177977085114",
      "encoding": "CSV"
    }
  },
  "eventMetadata": {
    "eventId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "inferenceTime": "2022-02-14T17:25:06Z"
  },
  "eventVersion": "0"
}
```

# バッチ変換ジョブからデータをキャプチャする
<a name="model-monitor-data-capture-batch"></a>

 バッチ変換ジョブのデータキャプチャを有効にするために必要な手順は、 AWS SDK for Python (Boto) と SageMaker Python SDK のどちらを使用する場合でも似ています。 AWS SDK を使用する場合は、[DataCaptureConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCaptureConfig.html) ディクショナリと必須フィールドを `CreateTransformJob`メソッド内で定義して、データキャプチャを有効にします。SageMaker AI Python SDK を使用する場合は、`BatchDataCaptureConfig` クラスをインポートし、このクラスからインスタンスを初期化します。次に、このオブジェクトを変換ジョブインスタンスの `batch_data_capture_config` パラメータに渡します。

 次のコードスニペットを使用するには、コード例の*イタリック体のプレースホルダーテキスト*を独自の情報に置き換えます。

## データキャプチャを有効にする方法
<a name="data-capture-batch-enable"></a>

 変換ジョブを起動するときに、データキャプチャ設定を指定します。を使用するか SageMaker AWS SDK for Python (Boto3) Python SDK を使用するかにかかわらず、 `DestinationS3Uri`引数を指定する必要があります。これは、変換ジョブでキャプチャされたデータをログに記録するディレクトリです。オプションで次のパラメータを指定することもできます。
+  `KmsKeyId`: キャプチャされたデータの暗号化に使用される AWS KMS キー。
+  `GenerateInferenceId`: データをキャプチャするときに、変換ジョブで推論 ID と時間を出力に追加するかどうかを示すブール型フラグ。これは、Ground Truth データを取り込む必要があるモデル品質モニタリングに役立ちます。推論 ID と時間は、キャプチャしたデータを Ground Truth データと一致させるのに役立ちます。

------
#### [ AWS SDK for Python (Boto3) ]

 `CreateTransformJob` メソッドを使用して変換ジョブを作成するときに、[DataCaptureConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCaptureConfig.html) ディクショナリでキャプチャするデータを設定します。

```
input_data_s3_uri = "s3://input_S3_uri"
output_data_s3_uri = "s3://output_S3_uri"
data_capture_destination = "s3://captured_data_S3_uri"

model_name = "model_name"

sm_client.create_transform_job(
    TransformJobName="transform_job_name",
    MaxConcurrentTransforms=2,
    ModelName=model_name,
    TransformInput={
        "DataSource": {
            "S3DataSource": {
                "S3DataType": "S3Prefix",
                "S3Uri": input_data_s3_uri,
            }
        },
        "ContentType": "text/csv",
        "CompressionType": "None",
        "SplitType": "Line",
    },
    TransformOutput={
        "S3OutputPath": output_data_s3_uri,
        "Accept": "text/csv",
        "AssembleWith": "Line",
    },
    TransformResources={
        "InstanceType": "ml.m4.xlarge",
        "InstanceCount": 1,
    },
    DataCaptureConfig={
       "DestinationS3Uri": data_capture_destination,
       "KmsKeyId": "kms_key",
       "GenerateInferenceId": True,
    }
    )
```

------
#### [ SageMaker Python SDK ]

 [sagemaker.model\$1monitor](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html) モジュールから `BatchDataCaptureConfig` クラスをインポートします。

```
from sagemaker.transformer import Transformer
from sagemaker.inputs import BatchDataCaptureConfig

# Optional - The S3 URI of where to store captured data in S3
data_capture_destination = "s3://captured_data_S3_uri"

model_name = "model_name"

transformer = Transformer(model_name=model_name, ...)
transform_arg = transformer.transform(
    batch_data_capture_config=BatchDataCaptureConfig(
        destination_s3_uri=data_capture_destination,
        kms_key_id="kms_key",
        generate_inference_id=True,
    ),
    ...
)
```

------

## キャプチャされたデータを表示する方法
<a name="data-capture-batch-view"></a>

 変換ジョブが完了すると、キャプチャされたデータは、データ キャプチャ設定で指定した `DestinationS3Uri` の下に記録されます。`DestinationS3Uri` の下には `/input` と `/output` という 2 つのサブディレクトリがあります。`DestinationS3Uri` が `s3://my-data-capture` の場合、変換ジョブは次のディレクトリを作成します。
+  `s3://my-data-capture/input`: 変換ジョブのキャプチャされた入力データ。
+  `s3://my-data-capture/output`: 変換ジョブのキャプチャされた出力データ。

 データの重複を避けるため、前の 2 つのディレクトリにあるキャプチャされたデータはマニフェストです。各マニフェストは、ソースオブジェクトの Amazon S3 ロケーションを含む JSONL ファイルです。マニフェストファイルの例として、以下のようなものがあります。

```
# under "/input" directory
[
    {"prefix":"s3://input_S3_uri/"},
    "dummy_0.csv",
    "dummy_1.csv",
    "dummy_2.csv",
    ...
]

# under "/output" directory
[
    {"prefix":"s3://output_S3_uri/"},
    "dummy_0.csv.out",
    "dummy_1.csv.out",
    "dummy_2.csv.out",
    ...
]
```

 変換ジョブは、これらのマニフェストを整理し、キャプチャされた日時を示す *yyyy/mm/dd/hh* S3 プレフィックスを使ってラベル付けします。これにより、モデルモニターは分析するデータの適切な部分を判断しやすくなります。例えば、2022 年 8 月 26 日 13 時 (UTC) に変換ジョブを開始すると、キャプチャされたデータにはプレフィックス文字列 `2022/08/26/13/` のラベルが付けられます。

## 推論 ID の生成
<a name="data-capture-batch-inferenceid"></a>

 変換ジョブの `DataCaptureConfig` を設定するときに、ブール型フラグ `GenerateInferenceId` をオンにできます。これは、ユーザーが取り込んだ Ground Truth データが必要となる、モデル品質やモデルバイアスのモニタリングジョブを実行しなければならない場合に特に便利です。モデルモニターは、推論 ID を使用してキャプチャされたデータと Ground Truth データを照合します。Ground Truth 取り込みに関する詳細については、「[Ground Truth ラベルを取り込んで予測とマージする](model-monitor-model-quality-merge.md)」を参照してください。`GenerateInferenceId` をオンにすると、変換出力には、推論 ID (ランダムな UUID) と変換ジョブの開始時刻 (UTC) がレコードごとに追加されます。モデル品質とモデルバイアスのモニタリングを実行するには、これら 2 つの値が必要です。Ground Truth データを作成するときは、出力データと一致するように同じ推論 ID を指定する必要があります。現在、この機能は CSV、JSON、JSONL 形式の変換出力をサポートしています。

 変換出力が CSV 形式の場合、出力ファイルは次の例のようになります。

```
0, 1f1d57b1-2e6f-488c-8c30-db4e6d757861,2022-08-30T00:49:15Z
1, 22445434-0c67-45e9-bb4d-bd1bf26561e6,2022-08-30T00:49:15Z
...
```

 最後の 2 つの列は推論 ID と変換ジョブの開始時刻です。これらは変更しないでください。残りの列は変換ジョブの出力です。

 変換出力が JSON または JSONL 形式の場合、出力ファイルは次の例のようになります。

```
{"output": 0, "SageMakerInferenceId": "1f1d57b1-2e6f-488c-8c30-db4e6d757861", "SageMakerInferenceTime": "2022-08-30T00:49:15Z"}
{"output": 1, "SageMakerInferenceId": "22445434-0c67-45e9-bb4d-bd1bf26561e6", "SageMakerInferenceTime": "2022-08-30T00:49:15Z"}
...
```

 `SageMakerInferenceId` と `SageMakerInferenceTime` の 2 つのフィールドが追加されています。これらのフィールドは、マージジョブに必要であるため、モデル品質モニタリングやモデルバイアスモニタリングを実行する必要がある場合は変更しないでください。

# データ品質
<a name="model-monitor-data-quality"></a>

データ品質モニタリング機能は、本番稼働中の機械学習 (ML) モデルを自動的にモニタリングし、データ品質の問題が発生したときに通知します。本番稼働中の ML モデルは、実際のデータを予測する必要があります。こうしたデータは、ほとんどのトレーニングデータセットとは異なり、慎重に厳選されていません。本番稼働中にモデルが受け取るデータの統計的性質が、トレーニングに使用されたベースラインデータの性質からドリフトすると、モデルの予測精度が低下していきます。Amazon SageMaker Model Monitor では、ルールを使用してデータのドリフトを検出し、発生時に警告します。データ品質を監視するには、次のステップを実行します。
+ データキャプチャを有効にします。データキャプチャは、リアルタイム推論エンドポイントまたはバッチ変換ジョブからの推論の入出力をキャプチャするか、データを Amazon S3 に保存します。詳細については、「[データキャプチャ](model-monitor-data-capture.md)」を参照してください。
+ ベースラインを作成します。このステップでは、指定した入力データセットを分析するベースラインジョブを実行します。このベースラインは、Apache Spark に構築されたオープンソースライブラリである [Deequ](https://github.com/awslabs/deequ) を使用して、各特徴のベースラインスキーマの制約と統計を計算します。このライブラリは、大規模なデータセットのデータ品質を測定するために使用されます。詳細については、「[ベースラインの作成](model-monitor-create-baseline.md)」を参照してください。
+ データ品質モニタリングジョブを定義し、スケジュールします。データ品質モニタリングジョブの具体的な情報とコードサンプルについては、「[データ品質モニタリングジョブのスケジューリング](model-monitor-schedule-data-monitor.md)」を参照してください。モニタリングジョブのスケジュールに関する一般的な情報については、「[モニタリングジョブのスケジューリング](model-monitor-scheduling.md)」を参照してください。
  + オプションで、前処理スクリプトと後処理スクリプトを使用して、データ品質分析から得られたデータを変換します。詳細については、「[前処理と後処理](model-monitor-pre-and-post-processing.md)」を参照してください。
+ データ品質メトリクスを表示します。詳細については、「[統計のスキーマ (statistics.json ファイル)](model-monitor-interpreting-statistics.md)」を参照してください。
+ データ品質モニタリングを Amazon CloudWatch と統合します。詳細については、「[CloudWatch メトリクス](model-monitor-interpreting-cloudwatch.md)」を参照してください。
+ モニタリングジョブの結果を解釈します。詳細については、「[結果の解釈](model-monitor-interpreting-results.md)」を参照してください。
+ SageMaker Studio でデータ品質モニタリングを有効にして結果を視覚化するには、リアルタイムエンドポイントを使用します。詳細については、「[Amazon SageMaker Studio でリアルタイムエンドポイントの結果を視覚化する](model-monitor-interpreting-visualize-results.md)」を参照してください。

**注記**  
Model Monitor は、表形式のデータのみに基づいてモデルメトリクスと統計を計算します。例えば、イメージを入力として受け取り、そのイメージに基づいてラベルを出力するイメージ分類モデルも引き続きモニタリングできます。Model Monitor は、入力ではなく出力のメトリクスと統計を計算できます。

**Topics**
+ [ベースラインの作成](model-monitor-create-baseline.md)
+ [データ品質モニタリングジョブのスケジューリング](model-monitor-schedule-data-monitor.md)
+ [統計のスキーマ (statistics.json ファイル)](model-monitor-interpreting-statistics.md)
+ [CloudWatch メトリクス](model-monitor-interpreting-cloudwatch.md)
+ [違反のスキーマ (constraint\$1violations.json ファイル)](model-monitor-interpreting-violations.md)

# ベースラインの作成
<a name="model-monitor-create-baseline"></a>

統計と制約のベースライン計算は、データのドリフトやその他のデータ品質の問題を検出できる標準として必要とされます。Model Monitor には、CSV およびフラット JSON 入力の制約を自動的に推奨する機能を提供する組み込みコンテナが用意されています。この *sagemaker-model-monitor-analyzer* コンテナは、ベースラインに対する制約の検証などのさまざまなモデルモニタリング機能や Amazon CloudWatch メトリクスの出力を提供します。このコンテナは Spark バージョン 3.3.0 に基づいており、[Deequ](https://github.com/awslabs/deequ) バージョン 2.0.2 で構築されています。ベースラインデータセット内のすべての列名が Spark に準拠している必要があります。列名には小文字のみを使用でき、特殊文字は「`_`」のみ使用できます。

モデルのトレーニングに使用したトレーニングデータセットは、通常、適切なベースラインデータセットです。トレーニングデータセットデータスキーマと推論データセットスキーマは、正確に一致する必要があります (特徴量の数と順序)。予測/出力の列は、トレーニングデータセットの 1 列目と見なされます。トレーニングデータセットから、一連のベースライン制約を推奨し、データを探索するための記述統計を生成するように SageMaker AI に指示することができます。この例では、この例に含まれている事前トレーニング済みモデルのトレーニングに使用されたトレーニングデータセットをアップロードします。Amazon S3 にトレーニングデータセットをすでに保存している場合は、それを直接指定できます。

**トレーニングデータセットからベースラインを作成するには** 

トレーニングデータを準備して Amazon S3 に保存したら、[Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) を使用して `DefaultModelMonitor.suggest_baseline(..)` のベースライン処理ジョブを開始します。このジョブでは、ベースライン統計を生成してデータセットのベースライン制約を推奨し、指定した `output_s3_uri` の場所にこれらを書き込む [Amazon SageMaker Model Monitor のビルド済みコンテナ](model-monitor-pre-built-container.md) を使用します。

```
from sagemaker.model_monitor import DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat

my_default_monitor = DefaultModelMonitor(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    volume_size_in_gb=20,
    max_runtime_in_seconds=3600,
)

my_default_monitor.suggest_baseline(
    baseline_dataset=baseline_data_uri+'/training-dataset-with-header.csv',
    dataset_format=DatasetFormat.csv(header=True),
    output_s3_uri=baseline_results_uri,
    wait=True
)
```

**注記**  
トレーニングデータセット内の特徴/列の名前を 1 行目として指定し、上記のコードサンプルのように `header=True` オプションを設定した場合、SageMaker AI は制約および統計ファイル内の特徴名を使用します。

データセットのベースライン統計は statistics.json ファイルに含まれており、推奨ベースライン制約は `output_s3_uri` で指定した場所の constraints.json ファイルに含まれています。

表形式データセットの統計および制約の出力ファイル


| ファイル名 | 説明 | 
| --- | --- | 
| statistics.json |  このファイルには、分析対象のデータセット内の各フィーチャに対する列状の統計が含まれます。ファイルのスキーマの詳細については、「[統計のスキーマ (statistics.json ファイル)](model-monitor-byoc-statistics.md)」を参照してください。  | 
| constraints.json |  このファイルには、確認されたフィーチャの制約が含まれます。ファイルのスキーマの詳細については、「[制約のスキーマ (constraints.json ファイル)](model-monitor-byoc-constraints.md)」を参照してください。  | 

[Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) には、ベースラインの統計と制約を生成するための便利な関数が用意されています。しかし、この目的のために代わりに処理ジョブを直接呼び出す場合は、次の例のように `Environment` マップを設定する必要があります。

```
"Environment": {
    "dataset_format": "{\"csv\”: { \”header\”: true}",
    "dataset_source": "/opt/ml/processing/sm_input",
    "output_path": "/opt/ml/processing/sm_output",
    "publish_cloudwatch_metrics": "Disabled",
}
```

# データ品質モニタリングジョブのスケジューリング
<a name="model-monitor-schedule-data-monitor"></a>

ベースラインを作成したら、`DefaultModelMonitor` クラスインスタンスの `create_monitoring_schedule()` メソッドを呼び出して、1 時間ごとのデータ品質モニターをスケジュールできます。以下のセクションでは、リアルタイムエンドポイントにデプロイされたモデルとバッチ変換ジョブのデータ品質モニターを作成する方法を示します。

**重要**  
モニタリングスケジュールを作成するときに、バッチ変換入力またはエンドポイント入力のいずれかを指定できますが、両方を指定することはできません。

## リアルタイムエンドポイントにデプロイされたモデルのデータ品質モニタリング
<a name="model-monitor-data-quality-rt"></a>

リアルタイムエンドポイントのデータ品質モニターをスケジュールするには、次のコードサンプルに示すように、`EndpointInput` インスタンスを `DefaultModelMonitor` インスタンスの `endpoint_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator
                
data_quality_model_monitor = DefaultModelMonitor(
   role=sagemaker.get_execution_role(),
   ...
)

schedule = data_quality_model_monitor.create_monitoring_schedule(
   monitor_schedule_name=schedule_name,
   post_analytics_processor_script=s3_code_postprocessor_uri,
   output_s3_uri=s3_report_path,
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   statistics=data_quality_model_monitor.baseline_statistics(),
   constraints=data_quality_model_monitor.suggested_constraints(),
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   enable_cloudwatch_metrics=True,
   endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint",
   )
)
```

## バッチ変換ジョブのデータ品質モニタリング
<a name="model-monitor-data-quality-bt"></a>

バッチ変換ジョブのデータ品質モニターをスケジュールするには、次のコードサンプルに示すように、`BatchTransformInput` インスタンスを `DefaultModelMonitor` インスタンスの `batch_transform_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator
                
data_quality_model_monitor = DefaultModelMonitor(
   role=sagemaker.get_execution_role(),
   ...
)

schedule = data_quality_model_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    batch_transform_input=BatchTransformInput(
        data_captured_destination_s3_uri=s3_capture_upload_path,
        destination="/opt/ml/processing/input",
        dataset_format=MonitoringDatasetFormat.csv(header=False),
    ),
    output_s3_uri=s3_report_path,
    statistics= statistics_path,
    constraints = constraints_path,
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

# 統計のスキーマ (statistics.json ファイル)
<a name="model-monitor-interpreting-statistics"></a>

Amazon SageMaker Model Monitor のビルド済みコンテナは、列/特徴の統計に基づいて計算を行います。統計は、ベースラインデータセットおよび分析中の現在のデータセットについて計算されます。

```
{
    "version": 0,
    # dataset level stats
    "dataset": {
        "item_count": number
    },
    # feature level stats
    "features": [
        {
            "name": "feature-name",
            "inferred_type": "Fractional" | "Integral",
            "numerical_statistics": {
                "common": {
                    "num_present": number,
                    "num_missing": number
                },
                "mean": number,
                "sum": number,
                "std_dev": number,
                "min": number,
                "max": number,
                "distribution": {
                    "kll": {
                        "buckets": [
                            {
                                "lower_bound": number,
                                "upper_bound": number,
                                "count": number
                            }
                        ],
                        "sketch": {
                            "parameters": {
                                "c": number,
                                "k": number
                            },
                            "data": [
                                [
                                    num,
                                    num,
                                    num,
                                    num
                                ],
                                [
                                    num,
                                    num
                                ][
                                    num,
                                    num
                                ]
                            ]
                        }#sketch
                    }#KLL
                }#distribution
            }#num_stats
        },
        {
            "name": "feature-name",
            "inferred_type": "String",
            "string_statistics": {
                "common": {
                    "num_present": number,
                    "num_missing": number
                },
                "distinct_count": number,
                "distribution": {
                    "categorical": {
                         "buckets": [
                                {
                                    "value": "string",
                                    "count": number
                                }
                          ]
                     }
                }
            },
            #provision for custom stats
        }
    ]
}
```

次の点に注意してください。
+ ビルド済みコンテナは、コンパクトな分位数スケッチである [KLL スケッチ](https://datasketches.apache.org/docs/KLL/KLLSketch.html)を計算します。
+ デフォルトでは、10 個のバケットにディストリビューションをマテリアライズします。これは現在設定できません。

# CloudWatch メトリクス
<a name="model-monitor-interpreting-cloudwatch"></a>

CloudWatch メトリクスには、組み込みの Amazon SageMaker Model Monitor コンテナを使用できます。ベースライン制約ファイルで `emit_metrics` オプションが `Enabled` である場合、SageMaker AI は次の名前空間のデータセットで確認された各特徴量/列に、これらのメトリクスを出力します。
+ `EndpointName` と `ScheduleName` ディメンションを含む `For real-time endpoints: /aws/sagemaker/Endpoints/data-metric` 名前空間。
+ `MonitoringSchedule` ディメンションを含む `For batch transform jobs: /aws/sagemaker/ModelMonitoring/data-metric` 名前空間。

数値フィールドの場合、組み込みコンテナは次の CloudWatch メトリクスを出力します。
+ メトリクス: Max → `MetricName: feature_data_{feature_name}, Stat: Max` のクエリ
+ メトリクス: Min → `MetricName: feature_data_{feature_name}, Stat: Min` のクエリ
+ メトリクス: Sum → `MetricName: feature_data_{feature_name}, Stat: Sum` のクエリ
+ メトリクス: SampleCount → `MetricName: feature_data_{feature_name}, Stat: SampleCount` のクエリ
+ メトリクス: Average → `MetricName: feature_data_{feature_name}, Stat: Average` のクエリ

数値フィールドおよび文字列フィールドの場合、組み込みコンテナは次の CloudWatch メトリクスを出力します。
+ メトリクス: 完全性 → `MetricName: feature_non_null_{feature_name}, Stat: Sum` のクエリ
+ メトリクス: ベースラインドリフト → `MetricName: feature_baseline_drift_{feature_name}, Stat: Sum` のクエリ

# 違反のスキーマ (constraint\$1violations.json ファイル)
<a name="model-monitor-interpreting-violations"></a>

違反ファイルは `MonitoringExecution` の出力として生成されます。この出力には、分析された現在のデータセットに対して制約 (constraints.json ファイルで指定) を評価した結果が示されます。Amazon SageMaker Model Monitor のビルド済みコンテナは、次の違反チェックを行います。

```
{
    "violations": [{
      "feature_name" : "string",
      "constraint_check_type" :
              "data_type_check",
            | "completeness_check",
            | "baseline_drift_check",
            | "missing_column_check",
            | "extra_column_check",
            | "categorical_values_check"
      "description" : "string"
    }]
}
```

監視される違反のタイプ 


| 違反チェックタイプ | 説明  | 
| --- | --- | 
| data\$1type\$1check | 現在の実行のデータ型がベースラインデータセットのデータ型と同じでない場合、この違反にはフラグが付けられます。 ベースラインステップでは、生成された制約によって、各列の推定データ型が推奨されます。`monitoring_config.datatype_check_threshold` パラメータを微調整すると、違反としてフラグが付けられる際のしきい値を調整できます。  | 
| completeness\$1check | 現在の実行で確認された完全性 (非 null 項目の割合) が、フィーチャごとに指定された完全性しきい値に指定されているしきい値を超えると、この違反にフラグが付けられます。 ベースラインステップ中に、生成された制約によって完全性の値が推奨されます。  | 
| baseline\$1drift\$1check | 現在のデータセットとベースラインデータセットの間で計算されたディストリビューション距離が、`monitoring_config.comparison_threshold` で指定されているしきい値を超えている場合、この違反にフラグが付けられます。  | 
| missing\$1column\$1check | 現在のデータセットの列数がベースラインデータセットの列数よりも少ない場合、この違反にフラグが付けられます。  | 
| extra\$1column\$1check | 現在のデータセットの列数がベースラインの列数より大きい場合、この違反にフラグが付けられます。  | 
| categorical\$1values\$1check | 現在のデータセット内の未知の値が、ベースラインデータセット内の未知の値よりも多い場合、この違反にフラグが付けられます。この値は、`monitoring_config.domain_content_threshold` のしきい値によって決定されます。  | 

# モデルの質
<a name="model-monitor-model-quality"></a>

モデル品質のモニタリングジョブは、モデルによる予測と、モデルが予測しようとする実際の Ground Truth ラベルを比較して、モデルのパフォーマンスをモニタリングします。これを行うために、モデル品質モニタリングは、リアルタイム推論またはバッチ推論からキャプチャしたデータを Amazon S3 バケットに保存されている実際のラベルとマージしてから、予測を実際のラベルと比較します。

Model Monitor は、モデルの品質の測定に機械学習問題のタイプに応じてさまざまなメトリクスを使用します。例えば、モデルが回帰問題の場合、評価される指標の 1 つは平均二乗誤差 (mse) です。さまざまな機械学習問題タイプで使用されるすべてのメトリクスについては、「[モデル品質メトリクスと Amazon CloudWatch モニタリング](model-monitor-model-quality-metrics.md)」を参照してください。

モデル品質モニタリングではデータ品質モニタリングと同じステップを実行しますが、Amazon S3 からの実際のラベルをリアルタイム推論エンドポイントからまたはバッチ変換ジョブから取得した予測とマージするというステップが追加されています。データ品質をモニタリングするには、次のステップを実行します。
+ データキャプチャを有効にします。データキャプチャは、リアルタイム推論エンドポイントまたはバッチ変換ジョブからの推論の入出力をキャプチャするか、データを Amazon S3 に保存します。詳細については、「[データキャプチャ](model-monitor-data-capture.md)」を参照してください。
+ ベースラインを作成します。このステップでは、モデルによる予測をベースラインデータセット内の Ground Truth ラベルと比較するベースラインジョブを実行します。ベースラインジョブは、ベースラインとなるしきい値を定義する統計ルールと制約を自動的に作成し、これらと比較してモデルのパフォーマンスを評価します。詳細については、「[モデルの質ベースラインを作成する](model-monitor-model-quality-baseline.md)」を参照してください。
+ モデル品質モニタリングジョブを定義し、スケジュールします。データ品質モニタリングジョブの具体的な情報とコードサンプルについては、「[モデルの質モニタリングジョブをスケジュールする](model-monitor-model-quality-schedule.md)」を参照してください。モニタリングジョブのスケジュールに関する一般的な情報については、「[モニタリングジョブのスケジューリング](model-monitor-scheduling.md)」を参照してください。
+ Ground Truth ラベルを取り込みます。Model Monitor はこれをリアルタイム推論エンドポイントまたはバッチ変換ジョブから取得した予測データとマージします。詳細については、「[Ground Truth ラベルを取り込んで予測とマージする](model-monitor-model-quality-merge.md)」を参照してください。
+ モデル品質モニタリングを Amazon CloudWatch と統合します。詳細については、「[CloudWatch メトリクスを使用したモデルの質モニタリング](model-monitor-model-quality-metrics.md#model-monitor-model-quality-cw)」を参照してください。
+ モニタリングジョブの結果を解釈します。詳細については、「[結果の解釈](model-monitor-interpreting-results.md)」を参照してください。
+ SageMaker Studio を使用して、モデル品質モニタリングを有効にし、結果を視覚化します。詳細については、「[Amazon SageMaker Studio でリアルタイムエンドポイントの結果を視覚化する](model-monitor-interpreting-visualize-results.md)」を参照してください。

**Topics**
+ [モデルの質ベースラインを作成する](model-monitor-model-quality-baseline.md)
+ [モデルの質モニタリングジョブをスケジュールする](model-monitor-model-quality-schedule.md)
+ [Ground Truth ラベルを取り込んで予測とマージする](model-monitor-model-quality-merge.md)
+ [モデル品質メトリクスと Amazon CloudWatch モニタリング](model-monitor-model-quality-metrics.md)

# モデルの質ベースラインを作成する
<a name="model-monitor-model-quality-baseline"></a>

モデルによる予測と Amazon S3 に保存したベースラインデータセット内の正解ラベルを比較するベースラインジョブを作成します。通常、トレーニングデータセットをベースラインデータセットとして使用します。ベースラインジョブはモデルのメトリクスを計算し、モデル品質のドリフトのモニタリングに使用する制約を提案します。

ベースラインジョブを作成するには、モデルの予測と、データの Ground Truth を表すラベルが含まれているデータセットが必要です。

ベースラインジョブを作成するには、SageMaker Python SDK で提供される `ModelQualityMonitor` クラスで、次のステップを実行します。

**モデル品質のベースラインジョブを作成するには**

1.  まず、`ModelQualityMonitor` クラスのインスタンスを作成します。次のコードスニペットは、これを実行する方法を説明しています。

   ```
   from sagemaker import get_execution_role, session, Session
   from sagemaker.model_monitor import ModelQualityMonitor
                   
   role = get_execution_role()
   session = Session()
   
   model_quality_monitor = ModelQualityMonitor(
       role=role,
       instance_count=1,
       instance_type='ml.m5.xlarge',
       volume_size_in_gb=20,
       max_runtime_in_seconds=1800,
       sagemaker_session=session
   )
   ```

1. 次に、`ModelQualityMonitor` オブジェクトの `suggest_baseline` メソッドを呼び出して、ベースラインジョブを実行します。次のコードスニペットは、予測とAmazon S3 に保存されたラベルの両方が含まれているベースラインデータセットがあることを前提としています。

   ```
   baseline_job_name = "MyBaseLineJob"
   job = model_quality_monitor.suggest_baseline(
       job_name=baseline_job_name,
       baseline_dataset=baseline_dataset_uri, # The S3 location of the validation dataset.
       dataset_format=DatasetFormat.csv(header=True),
       output_s3_uri = baseline_results_uri, # The S3 location to store the results.
       problem_type='BinaryClassification',
       inference_attribute= "prediction", # The column in the dataset that contains predictions.
       probability_attribute= "probability", # The column in the dataset that contains probabilities.
       ground_truth_attribute= "label" # The column in the dataset that contains ground truth labels.
   )
   job.wait(logs=False)
   ```

1. ベースラインジョブの終了後、ジョブが生成した制約を確認できます。まず、`ModelQualityMonitor` オブジェクトの `latest_baselining_job` メソッドを呼び出して、ベースラインジョブの結果を取得します。

   ```
   baseline_job = model_quality_monitor.latest_baselining_job
   ```

1. ベースラインジョブでは制約が提案されます。これは、Model Monitor が測定するメトリクスのしきい値です。メトリクスがこの提案されたしきい値を超えた場合、Model Monitor は違反を報告します。ベースラインジョブが生成した制約を表示するには、ベースラインジョブの `suggested_constraints` メソッドを呼び出します。次のコードスニペットは、Pandas データフレームにバイナリ分類モデルの制約をロードします。

   ```
   import pandas as pd
   pd.DataFrame(baseline_job.suggested_constraints().body_dict["binary_classification_constraints"]).T
   ```

   生成された制約を表示し、必要に応じて変更してから、モニタリングに使用することをお勧めします。例えば、制約が厳しすぎると、違反アラートが必要以上に多くなる可能性があります。

   制約に科学的記数法で表現された数値が含まれている場合は、その数値を float に変換する必要があります。次の Python [前処理スクリプト](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-pre-and-post-processing.html#model-monitor-pre-processing-script)の例は、科学的記数法の数値を float に変換する方法を示しています。

   ```
   import csv
   
   def fix_scientific_notation(col):
       try:
           return format(float(col), "f")
       except:
           return col
   
   def preprocess_handler(csv_line):
       reader = csv.reader([csv_line])
       csv_record = next(reader)
       #skip baseline header, change HEADER_NAME to the first column's name
       if csv_record[0] == “HEADER_NAME”:
          return []
       return { str(i).zfill(20) : fix_scientific_notation(d) for i, d in enumerate(csv_record)}
   ```

   [Model Monitor](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html) のドキュメントで定義されているように、前処理スクリプトをベースラインまたはモニタリングスケジュールに `record_preprocessor_script` として追加できます。

1. 制約の調整が完了したら、モニタリングスケジュールを作成するときにその制約を `constraints` パラメータとして渡します。詳細については、「[モデルの質モニタリングジョブをスケジュールする](model-monitor-model-quality-schedule.md)」を参照してください。

提案されたベースライン制約は、`output_s3_uri` で指定した場所の constraints.json ファイルに含まれています。このファイルのスキーマの詳細については、「[制約のスキーマ (constraints.json ファイル)](model-monitor-byoc-constraints.md)」を参照してください。

# モデルの質モニタリングジョブをスケジュールする
<a name="model-monitor-model-quality-schedule"></a>

ベースラインを作成したら、`ModelQualityMonitor` クラスインスタンスの `create_monitoring_schedule()` メソッドを呼び出して、1 時間ごとにモデル品質モニターをスケジュールできます。以下のセクションでは、リアルタイムエンドポイントにデプロイされたモデルとバッチ変換ジョブのデータ品質モニターを作成する方法を示します。

**重要**  
モニタリングスケジュールを作成するときに、バッチ変換入力またはエンドポイント入力のいずれかを指定できますが、両方を指定することはできません。

データ品質モニタリングとは異なり、モデル品質をモニタリングしたい場合は Ground Truth ラベルを指定する必要があります。ただし、Ground Truth ラベルは遅れる可能性があります。これに対処するには、モニタリングスケジュールを作成するときにオフセットを指定します。

## モデルモニターのオフセット
<a name="model-monitor-model-quality-schedule-offsets"></a>

モデル品質のジョブには `StartTimeOffset` と `EndTimeOffset` が含まれます。これらは `create_model_quality_job_definition` メソッドの `ModelQualityJobInput` パラメータのフィールドで、次のように機能します。
+ `StartTimeOffset` - 指定した場合、ジョブはこの時間を開始時刻から減算します。
+ `EndTimeOffset` - 指定した場合、ジョブはこの時間を終了時刻から減算します。

例えば、オフセットの形式は -PT7H (7H は 7 時間) です。-P\$1H または -P\$1D を使えます (H = 時間、D = 日、M = 分、\$1 は数字)。さらに、オフセットは [ISO 8601 期間形式](https://en.wikipedia.org/wiki/ISO_8601#Durations)にする必要があります。

例えば、Ground Truth が 1 日後に取り込まれ始めるものの、1 週間では完了しない場合、`StartTimeOffset` を `-P8D` に、`EndTimeOffset` を `-P1D` に設定します。その後、ジョブを `2020-01-09T13:00` に実行するようにスケジュールした場合、`2020-01-01T13:00`～`2020-01-08T13:00` 間のデータが分析されます。

**重要**  
スケジュールの繰り返しの頻度は、1 つの実行が完了してから次の実行を開始するように設定する必要があります。これにより、Ground Truth マージジョブとモニタリングジョブを完了できます。実行の最大ランタイムは 2 つのジョブに分割されるため、1 時間おきに実行されるモデル品質モニタリングジョブの場合、`StoppingCondition` の一部として指定される `MaxRuntimeInSeconds` は 1,800 以下にする必要があります。

## リアルタイムエンドポイントにデプロイされたモデルのモデル品質モニタリング
<a name="model-monitor-data-quality-schedule-rt"></a>

リアルタイムエンドポイントのモデル品質モニターをスケジュールするには、次のコードサンプルに示すように、`EndpointInput` インスタンスを `ModelQualityMonitor` インスタンスの `endpoint_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator
                    
model_quality_model_monitor = ModelQualityMonitor(
   role=sagemaker.get_execution_role(),
   ...
)

schedule = model_quality_model_monitor.create_monitoring_schedule(
   monitor_schedule_name=schedule_name,
   post_analytics_processor_script=s3_code_postprocessor_uri,
   output_s3_uri=s3_report_path,
   schedule_cron_expression=CronExpressionGenerator.hourly(),    
   statistics=model_quality_model_monitor.baseline_statistics(),
   constraints=model_quality_model_monitor.suggested_constraints(),
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   enable_cloudwatch_metrics=True,
   endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint",
        start_time_offset="-PT2D",
        end_time_offset="-PT1D",
    )
)
```

## バッチ変換ジョブのデータ品質モニタリング
<a name="model-monitor-data-quality-schedule-tt"></a>

バッチ変換ジョブのデータ品質モニターをスケジュールするには、次のコードサンプルに示すように、`BatchTransformInput` インスタンスを `ModelQualityMonitor` インスタンスの `batch_transform_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator

model_quality_model_monitor = ModelQualityMonitor(
   role=sagemaker.get_execution_role(),
   ...
)

schedule = model_quality_model_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    batch_transform_input=BatchTransformInput(
        data_captured_destination_s3_uri=s3_capture_upload_path,
        destination="/opt/ml/processing/input",
        dataset_format=MonitoringDatasetFormat.csv(header=False),
        # the column index of the output representing the inference probablity
        probability_attribute="0",
        # the threshold to classify the inference probablity to class 0 or 1 in 
        # binary classification problem
        probability_threshold_attribute=0.5,
        # look back 6 hour for transform job outputs.
        start_time_offset="-PT6H",
        end_time_offset="-PT0H"
    ),
    ground_truth_input=gt_s3_uri,
    output_s3_uri=s3_report_path,
    problem_type="BinaryClassification",
    constraints = constraints_path,
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

# Ground Truth ラベルを取り込んで予測とマージする
<a name="model-monitor-model-quality-merge"></a>

モデル品質モニタリングでは、モデルの予測を正解ラベルと比較し、モデルの品質を測定します。これを機能させるには、エンドポイントでキャプチャされたデータを定期的にラベル付けし、Amazon S3 にアップロードする必要がありますます。

Ground Truth ラベルとキャプチャされた予測データを照合するには、データセット内の各レコードに一意の識別子が必要です。正解データの各レコードの構造は次のとおりです。

```
{
  "groundTruthData": {
    "data": "1",
    "encoding": "CSV"
  },
  "eventMetadata": {
    "eventId": "aaaa-bbbb-cccc"
  },
  "eventVersion": "0"
}
```

`groundTruthData` の構造において、`eventId` の値は次のいずれかになります。
+ `eventId`— この ID は、ユーザーがエンドポイントを呼び出すと自動的に生成されます。
+ `inferenceId`— この ID は、呼び出したユーザーがエンドポイントを呼び出すときに指定します。

`inferenceId` がキャプチャされたデータレコードに存在する場合、Model Monitor はそれを使用してキャプチャされたデータを Ground Truth レコードとマージします。Ground Truth レコードにある `inferenceId` がキャプチャされたレコードの `inferenceId` と一致していることを確認する作業はユーザーが行う必要があります。`inferenceId` がキャプチャされたデータレコードに存在しない場合、Model Monitor はキャプチャされたデータの `eventId` を使用して Ground Truth レコードと照合します。

Ground Truth データは、キャプチャされたデータと同じパス形式の Amazon S3 バケットにアップロードする必要があります。

**データ形式の要件**  
Amazon S3 にデータを保存する際は、jsonlines 形式 (.jsonl) を使用し、以下の命名構造を使用して保存する必要があります。jsonline の要件の詳細については、「[入力データと出力データを使用する](sms-data.md)」を参照してください。

```
s3://amzn-s3-demo-bucket1/prefix/yyyy/mm/dd/hh
```

このパスの日付は、Ground Truth ラベルが収集された日付です。推論が生成された日付と一致している必要はありません。

Ground Truth ラベルを作成してアップロードした後、モニタリングジョブを作成するときにそのラベルの場所をパラメータとして含めます。を使用している場合は AWS SDK for Python (Boto3)、 `create_model_quality_job_definition`メソッドの呼び出しで Ground Truth ラベルの場所を `GroundTruthS3Input`パラメータの `S3Uri`フィールドとして指定して、これを行います。SageMaker Python SDK を使用している場合は、`ModelQualityMonitor` オブジェクトの `create_monitoring_schedule` メソッドを呼び出すときに、Ground Truth ラベルの場所を `ground_truth_input` として指定します。

# モデル品質メトリクスと Amazon CloudWatch モニタリング
<a name="model-monitor-model-quality-metrics"></a>

モデル品質モニタリングジョブは、機械学習モデルの品質とパフォーマンスを評価するためにさまざまなメトリクスを計算します。計算される特定のメトリクスは、リグレッション、二項分類、または多クラス分類などの ML 問題のタイプによって異なります。このようなメトリクスのモニタリングは、経時的なモデルのドリフトを検出するうえで重要です。以降のセクションでは、問題タイプごとの主要なモデルの質メトリクスと、CloudWatch を使用して自動モニタリングとアラートを設定し、モデルのパフォーマンスを継続的に追跡する方法について説明します。

**注記**  
メトリクスの標準偏差は、200 件以上のサンプルを使用できる場合にのみ得ることができます。Model Monitor は、データの 80% をランダムに 5 回サンプリングしてメトリクスを計算し、これらの結果の標準偏差を取得することで、標準偏差を計算します。

## リグレッションメトリクス
<a name="model-monitor-model-quality-metrics-regression"></a>

以下は、回帰問題においてモデル品質モニタリングが計算するメトリクスの例を示しています。

```
"regression_metrics" : {
    "mae" : {
      "value" : 0.3711832061068702,
      "standard_deviation" : 0.0037566388129940394
    },
    "mse" : {
      "value" : 0.3711832061068702,
      "standard_deviation" : 0.0037566388129940524
    },
    "rmse" : {
      "value" : 0.609248066149471,
      "standard_deviation" : 0.003079253267651125
    },
    "r2" : {
      "value" : -1.3766111872212665,
      "standard_deviation" : 0.022653980022771227
    }
  }
```

## 二項分類メトリクス
<a name="model-monitor-model-quality-metrics-binary"></a>

以下は、バイナリ分類問題においてモデル品質モニタリングが計算するメトリクスの例を示しています。

```
"binary_classification_metrics" : {
    "confusion_matrix" : {
      "0" : {
        "0" : 1,
        "1" : 2
      },
      "1" : {
        "0" : 0,
        "1" : 1
      }
    },
    "recall" : {
      "value" : 1.0,
      "standard_deviation" : "NaN"
    },
    "precision" : {
      "value" : 0.3333333333333333,
      "standard_deviation" : "NaN"
    },
    "accuracy" : {
      "value" : 0.5,
      "standard_deviation" : "NaN"
    },
    "recall_best_constant_classifier" : {
      "value" : 1.0,
      "standard_deviation" : "NaN"
    },
    "precision_best_constant_classifier" : {
      "value" : 0.25,
      "standard_deviation" : "NaN"
    },
    "accuracy_best_constant_classifier" : {
      "value" : 0.25,
      "standard_deviation" : "NaN"
    },
    "true_positive_rate" : {
      "value" : 1.0,
      "standard_deviation" : "NaN"
    },
    "true_negative_rate" : {
      "value" : 0.33333333333333337,
      "standard_deviation" : "NaN"
    },
    "false_positive_rate" : {
      "value" : 0.6666666666666666,
      "standard_deviation" : "NaN"
    },
    "false_negative_rate" : {
      "value" : 0.0,
      "standard_deviation" : "NaN"
    },
    "receiver_operating_characteristic_curve" : {
      "false_positive_rates" : [ 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ],
      "true_positive_rates" : [ 0.0, 0.25, 0.5, 0.75, 1.0, 1.0 ]
    },
    "precision_recall_curve" : {
      "precisions" : [ 1.0, 1.0, 1.0, 1.0, 1.0 ],
      "recalls" : [ 0.0, 0.25, 0.5, 0.75, 1.0 ]
    },
    "auc" : {
      "value" : 1.0,
      "standard_deviation" : "NaN"
    },
    "f0_5" : {
      "value" : 0.3846153846153846,
      "standard_deviation" : "NaN"
    },
    "f1" : {
      "value" : 0.5,
      "standard_deviation" : "NaN"
    },
    "f2" : {
      "value" : 0.7142857142857143,
      "standard_deviation" : "NaN"
    },
    "f0_5_best_constant_classifier" : {
      "value" : 0.29411764705882354,
      "standard_deviation" : "NaN"
    },
    "f1_best_constant_classifier" : {
      "value" : 0.4,
      "standard_deviation" : "NaN"
    },
    "f2_best_constant_classifier" : {
      "value" : 0.625,
      "standard_deviation" : "NaN"
    }
  }
```

## 多クラスメトリクス
<a name="model-monitor-model-quality-metrics-multi"></a>

以下は、複数クラス分類問題においてモデル品質モニタリングが計算するメトリクスの例を示しています。

```
"multiclass_classification_metrics" : {
    "confusion_matrix" : {
      "0" : {
        "0" : 1180,
        "1" : 510
      },
      "1" : {
        "0" : 268,
        "1" : 138
      }
    },
    "accuracy" : {
      "value" : 0.6288167938931297,
      "standard_deviation" : 0.00375663881299405
    },
    "weighted_recall" : {
      "value" : 0.6288167938931297,
      "standard_deviation" : 0.003756638812994008
    },
    "weighted_precision" : {
      "value" : 0.6983172269629505,
      "standard_deviation" : 0.006195912915307507
    },
    "weighted_f0_5" : {
      "value" : 0.6803947317178771,
      "standard_deviation" : 0.005328406973561699
    },
    "weighted_f1" : {
      "value" : 0.6571162346664904,
      "standard_deviation" : 0.004385008075019733
    },
    "weighted_f2" : {
      "value" : 0.6384024354394601,
      "standard_deviation" : 0.003867109755267757
    },
    "accuracy_best_constant_classifier" : {
      "value" : 0.19370229007633588,
      "standard_deviation" : 0.0032049848450732355
    },
    "weighted_recall_best_constant_classifier" : {
      "value" : 0.19370229007633588,
      "standard_deviation" : 0.0032049848450732355
    },
    "weighted_precision_best_constant_classifier" : {
      "value" : 0.03752057718081697,
      "standard_deviation" : 0.001241536088657851
    },
    "weighted_f0_5_best_constant_classifier" : {
      "value" : 0.04473443104152011,
      "standard_deviation" : 0.0014460485504284792
    },
    "weighted_f1_best_constant_classifier" : {
      "value" : 0.06286421244683643,
      "standard_deviation" : 0.0019113576884608862
    },
    "weighted_f2_best_constant_classifier" : {
      "value" : 0.10570313141262414,
      "standard_deviation" : 0.002734216826748117
    }
  }
```

## CloudWatch メトリクスを使用したモデルの質モニタリング
<a name="model-monitor-model-quality-cw"></a>

モニタリングスケジュールを作成する際、`enable_cloudwatch_metrics` の値を `True` に設定すると、モデルの質モニタリングジョブはすべてのメトリクスを CloudWatch に送信します。

モデル品質メトリクスは、次の名前空間に表示されます。
+ リアルタイムエンドポイントの場合: `aws/sagemaker/Endpoints/model-metrics`
+ バッチ変換ジョブの場合: `aws/sagemaker/ModelMonitoring/model-metrics`

出力されるメトリクスのリストについては、このページの前のセクションを参照してください。

CloudWatch メトリクスを使用して、指定したしきい値を特定のメトリクスが満たさない場合のアラームを作成できます。CloudWatch アラームを作成する手順については、「*CloudWatch ユーザーガイド*」の「[静的しきい値に基づいて CloudWatch アラームを作成する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)」を参照してください。

# 本番稼働用モデルのバイアスドリフト
<a name="clarify-model-monitor-bias-drift"></a>

Amazon SageMaker Clarify バイアスモニタリングは、データサイエンティストと機械学習エンジニアが予測のバイアスを定期的にモニタリングするのに役立ちます。モデルのモニタリング中は、バイアスを詳細に説明する、エクスポート可能なレポートとグラフを SageMaker Studio で表示できます。また、Amazon CloudWatch でアラートを設定して、特定のしきい値を超えるバイアスが検出された場合に通知を送信するようにできます。トレーニングデータがデプロイ中にモデルに表示されるデータ (つまり、ライブデータ) と異なる場合、デプロイされた機械学習モデルではバイアスが発生または悪化するおそれがあります。ライブデータの分布におけるこのような変化は、一時的 (原因が短期間の現実世界の出来事である場合など) または永続的である場合があります。いずれの場合も、変化を検出することが重要です。例えば、モデルトレーニングに使用された住宅ローン利率が現在の現実世界の住宅ローン利率と異なる場合、住宅価格を予測するためのモデルの出力にバイアスが生じる可能性があります。Model Monitor のバイアス検出機能を使用すると、SageMaker AI が特定のしきい値を超えるバイアスを検出した場合に、SageMaker Studio と Amazon CloudWatch アラートを通じて表示できるメトリクスが自動的に生成されます。

一般的に、トレーニングとデプロイの段階でのみバイアスを測定するのでは不十分です。モデルのデプロイ後、デプロイされたモデルが参照するデータ (つまり、ライブデータ) の分布がトレーニングデータセット内のデータ分布と異なる場合があるためです。この変化により、時間の経過とともにモデルにバイアスが生じる可能性があります。ライブデータの分布における変化は、一時的 (原因がホリデーシーズンなどの短期間の行動による場合など) または永続的である場合があります。いずれの場合も、これらの変化を検出し、必要に応じてバイアスを減らすための措置を講じることが重要です。

これらの変更を検出するために、SageMaker Clarify は、デプロイされたモデルのバイアスメトリクスを継続的にモニタリングし、メトリクスがしきい値を超えた場合に自動アラートを発する機能を提供します。DPPL バイアスメトリクスを例として考えてみます。値の許容範囲を指定します (A=(amin​, amax​))。DPPL がデプロイメント中に収まっている必要がある差は (-0.1, 0.1) などです。この範囲から逸脱した場合は*バイアスの検出*アラートが発生します。SageMaker Clarify を使用すると、このようなチェックを定期的に実行できます。

例えば、チェックの頻度を 2 日に設定できます。この設定では、SageMaker Clarify は 2 日間の期間中に収集されたデータに対する DPPL メトリクスを計算します。この例では、Dwin はモデルが過去 2 日間の期間中に処理したデータです。DPPL 値 bwin​ が Dwin​ で計算された許容範囲 A から外れた場合、アラートが発行されます。bwin が A から外れているかどうかをチェックするこのアプローチ手法は、ノイズが多くなる場合があります。Dwin​ がごく少数のサンプルで構成され、ライブデータの分布を表していない場合などです。サンプルサイズが小さいと、Dwin​ に基づいて計算されたバイアス bwin​ があまり堅牢な推定ではない可能性があります。実は、非常に高い (または低い) bwin の値は純粋に偶然で観測されたのかもしれません。観測されたデータ Dwin から導き出された結論が統計的に有意であることを確認するために、SageMaker Clarify では信頼区間を使用しています。具体的には、正規分布ブートストラップ法を使用して区間 C=(cmin​, cmax) を構築します。このようにすることで、SageMaker Clarify は、ライブデータ全体に基づいて計算された真のバイアス値が高い確率で C に含まれていると確信を持てます。ここで、信頼区間 C が許容範囲 A と重なる場合、SageMaker Clarify は「ライブデータ分布のバイアスメトリクス値が許容範囲内にある可能性が高い」と解釈します。C と A が重ならない場合、SageMaker Clarify はバイアスメトリクスが A に含まれていないと確信し、アラートを発します。

## Model Monitor のサンプルノートブック
<a name="clarify-model-monitor-sample-notebooks-bias-drift"></a>

Amazon SageMaker Clarify には、リアルタイムエンドポイントの推論データをキャプチャし、進化するバイアスをモニタリングするためのベースラインを作成し、結果を確認する方法を示す次のサンプルノートブックが用意されています。
+ [バイアスドリフトと特徴属性ドリフトのモニタリング (Amazon SageMaker Clarify)](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_model_monitor/fairness_and_explainability/SageMaker-Model-Monitor-Fairness-and-Explainability.html) — Amazon SageMaker Model Monitor を使用して、バイアスドリフトと特徴属性ドリフトを経時的にモニタリングします。

このノートブックの動作確認が実施されているのは、Amazon SageMaker Studio のみです。Amazon SageMaker Studio でノートブックを開く方法の手順については、「[Amazon SageMaker Studio Classic ノートブックを作成する、または開く](notebooks-create-open.md)」を参照してください。カーネルの選択を求めるメッセージが表示されたら、**[Python 3 (Data Science)]** (Python 3 (データサイエンス)) を選択します。次のトピックでは、最後の 2 つのステップの要点が説明されています。サンプルノートブックのコードサンプルも含まれています。

**Topics**
+ [Model Monitor のサンプルノートブック](#clarify-model-monitor-sample-notebooks-bias-drift)
+ [バイアスドリフトのベースラインを作成する](clarify-model-monitor-bias-drift-baseline.md)
+ [バイアスドリフト違反](clarify-model-monitor-bias-drift-violations.md)
+ [バイアスドリフトをモニタリングするためのパラメータ](clarify-config-json-monitor-bias-parameters.md)
+ [バイアスドリフトのモニタリングジョブをスケジュールする](clarify-model-monitor-bias-drift-schedule.md)
+ [データのバイアスドリフトのレポートを確認する](clarify-model-monitor-bias-drift-report.md)
+ [バイアスドリフト分析の CloudWatch メトリクス](clarify-model-monitor-bias-drift-cw.md)

# バイアスドリフトのベースラインを作成する
<a name="clarify-model-monitor-bias-drift-baseline"></a>

アプリケーションのリアルタイム推論データまたはバッチ変換推論データのキャプチャを設定した後、バイアスドリフトのモニタリングで最初に行うタスクはベースラインの作成です。これには、データ入力、機密性の高いグループ、予測のキャプチャ方法、モデルとそのトレーニング後のバイアスメトリクスの設定が含まれます。その後に、ベースライン作成ジョブを開始する必要があります。

モデルのバイアスモニタリングは、機械学習モデルのバイアスドリフトを定期的に検出できます。他のモニタリングタイプと同様に、モデルバイアスモニタリングを作成する手順は、ベースラインを作成してからモニタリングスケジュールを作成する方法が一般的です。

```
model_bias_monitor = ModelBiasMonitor(
    role=role,
    sagemaker_session=sagemaker_session,
    max_runtime_in_seconds=1800,
)
```

`DataConfig` には、分析するデータセット (データセットファイルなど)、その形式 (CSV または JSON Lines)、ヘッダー (存在する場合)、およびラベルに関する情報が保存されています。

```
model_bias_baselining_job_result_uri = f"{baseline_results_uri}/model_bias"
model_bias_data_config = DataConfig(
    s3_data_input_path=validation_dataset,
    s3_output_path=model_bias_baselining_job_result_uri,
    label=label_header,
    headers=all_headers,
    dataset_type=dataset_type,
)
```

`BiasConfig` は、データセット内の機微グループの設定です。通常、バイアスはメトリクスを計算し、それをグループ間で比較することで測定されます。その対象となるグループは、*ファセット*と呼ばれます。トレーニング後のバイアスに関しては、正のラベルも考慮する必要があります。

```
model_bias_config = BiasConfig(
    label_values_or_threshold=[1],
    facet_name="Account Length",
    facet_values_or_threshold=[100],
)
```

`ModelPredictedLabelConfig` はモデルの出力から予測ラベルを抽出する方法を指定します。この例では、顧客が頻繁に離脱することを予想して、0.8 のカットオフ値が選択されています。より複雑な出力の場合は、他にもいくつかのオプションがあります。例えば、「label」はエンドポイント応答ペイロードで予測されたラベルの位置を示すインデックス、名前、または JMESPath です。

```
model_predicted_label_config = ModelPredictedLabelConfig(
    probability_threshold=0.8,
)
```

`ModelConfig` は、推論に使用されるモデルに関連する設定です。トレーニング後のバイアスメトリクスを計算するには、指定されたモデル名の推論を取得して計算に含める必要があります。これを実現するために、処理ジョブはモデルを使用して一時エンドポイント (*シャドウエンドポイント*とも呼ばれる) を作成します。処理ジョブは、計算が完了した後にシャドウエンドポイントを削除します。この設定は説明可能性モニタリングでも使用されます。

```
model_config = ModelConfig(
    model_name=model_name,
    instance_count=endpoint_instance_count,
    instance_type=endpoint_instance_type,
    content_type=dataset_type,
    accept_type=dataset_type,
)
```

これで、ベースライン作成ジョブを開始できます。

```
model_bias_monitor.suggest_baseline(
    model_config=model_config,
    data_config=model_bias_data_config,
    bias_config=model_bias_config,
    model_predicted_label_config=model_predicted_label_config,
)
print(f"ModelBiasMonitor baselining job: {model_bias_monitor.latest_baselining_job_name}")
```

スケジュールされたモニタリングは、ベースラインジョブ名を自動的に取得し、モニタリングが開始されるまで待機します。

# バイアスドリフト違反
<a name="clarify-model-monitor-bias-drift-violations"></a>

バイアスドリフトジョブは、[ベースライン設定](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelBiasJobDefinition.html#sagemaker-CreateModelBiasJobDefinition-request-ModelBiasBaselineConfig)によって提供されるベースラインの制約を、現在の `MonitoringExecution` の分析結果と照らし合わせて評価します。違反が検出されると、ジョブはその違反を実行出力場所の constraint\$1violations.json ファイルに一覧表示し、実行ステータスを [結果の解釈](model-monitor-interpreting-results.md) としてマークします。**

バイアスドリフト違反ファイルのスキーマは次のとおりです。
+ `facet` — モニタリングジョブ分析設定ファセット `name_or_index` によって提供されるファセットの名前。
+ `facet_value` — モニタリングジョブ分析設定ファセット `value_or_threshold` によって提供されるファセットの値。
+ `metric_name` — バイアスメトリクスのショートネーム。例えば、「CI」はクラスの不均衡を表します。トレーニング前の各バイアスメトリックの略称については、「[トレーニング前のバイアスメトリクス](clarify-measure-data-bias.md)」を参照してください。トレーニング後の各バイアスメトリックの短縮名については、「[トレーニング済みデータのメトリクスとモデルのバイアスのメトリクス](clarify-measure-post-training-bias.md)」を参照してください。
+ `constraint_check_type` — モニタリング対象の違反のタイプ。現在は、`bias_drift_check` のみがサポートされます。
+ `description` — 違反を説明する説明メッセージ。

```
{
    "version": "1.0",
    "violations": [{
        "facet": "string",
        "facet_value": "string",
        "metric_name": "string",
        "constraint_check_type": "string",
        "description": "string"
    }]
}
```

バイアスメトリクスは、分布の平等度を測定するために使用されます。値がゼロに近いほど、分布のバランスが取れていることを示します。ジョブ分析結果ファイル (analysis.json) 内のバイアスメトリクスの値が、ベースライン制約ファイル内の対応する値よりも悪い場合、違反が記録されます。例えば、DPPL バイアスメトリクスのベースライン制約が `0.2` で、分析結果が `0.1` の場合、`0.1` は `0.2` より `0` に近いため違反は記録されません。ただし、分析結果が `-0.3` であれば、ベースライン制約の `0.2` より `0` から離れているため、違反が記録されます。

```
{
    "version": "1.0",
    "violations": [{
        "facet": "Age",
        "facet_value": "40",
        "metric_name": "CI",
        "constraint_check_type": "bias_drift_check",
        "description": "Value 0.0751544567666083 does not meet the constraint requirement"
    }, {
        "facet": "Age",
        "facet_value": "40",
        "metric_name": "DPPL",
        "constraint_check_type": "bias_drift_check",
        "description": "Value -0.0791244970125596 does not meet the constraint requirement"
    }]
}
```

# バイアスドリフトをモニタリングするためのパラメータ
<a name="clarify-config-json-monitor-bias-parameters"></a>

Amazon SageMaker Clarify バイアスモニタリングは、[分析設定ファイル](clarify-processing-job-configure-analysis.md) の分析設定に使用されたパラメータのサブセットを再利用します。このトピックでは、設定パラメータについて説明したあと、JSON ファイルの例を紹介します。これらのファイルを使用して CSV および JSON Lines データセットを設定し、機械学習モデルが本番稼働しているときにバイアスドリフトがないかモニタリングします。

以下のパラメータは JSON ファイルで提供する必要があります。この JSON ファイルへのパスは、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelBiasAppSpecification](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelBiasAppSpecification) API の `ConfigUri` パラメータで指定する必要があります。
+ `"version"` - (オプション) 設定ファイルのスキーマバージョン。指定しない場合、サポートされている最新のバージョンが使用されます。
+ `"headers"` - (オプション) データセット内の列名のリスト。`dataset_type` が `"application/jsonlines"` で、`"label"` が指定されている場合、最後のヘッダーはラベル列のヘッダーになります。
+ `"label"` — (オプション) バイアスメトリクスに使用するモデルのターゲット属性。**列名、またはデータセット形式が CSV の場合はインデックスとして、データセット形式が JSON Lines の場合は JMESPath として指定します。
+ `"label_values_or_threshold"` — (オプション) ラベル値またはしきい値のリスト。バイアスメトリクスに使用した肯定的な結果を示します。
+ `"facet"` — (オプション) ファセットと呼ばれる機密属性である機能のリスト。ファセットはペアの形式でバイアスメトリクスに使用され、次のものが含まれます。**
  + `"name_or_index"` - ファセットの列名またはインデックス。
  + `"value_or_threshold"` — (オプション) ファセット列に入力できる値またはしきい値のリスト。バイアスの測定に使用されるグループなど、機密性の高いグループを示します。指定しない場合、バイアスメトリクスは (すべての値ではなく) 一意の値ごとに 1 つのグループとして計算されます。ファセット列が数値の場合、このしきい値は、機密性の高いグループを選択するための下限として適用されます。
+ `"group_variable"` — (オプション) 条件付き人口格差のバイアスメトリクスに使用されるグループ変数を示す列名またはインデックス。****

他のパラメーターは、 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelBiasJobInput](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelBiasJobInput) API の `EndpointInput` (リアルタイムエンドポイントの場合) または `BatchTransformInput` (バッチ変換ジョブの場合) で指定する必要があります。
+ `FeaturesAttribute` — エンドポイントの入力データ形式が `"application/jsonlines"` の場合、このパラメータは必須です。データセット形式が JSON Lines の場合、これは特徴量列の検索に使用される JMESPath です。
+ `InferenceAttribute` — バイアスメトリクスを使用してバイアスをモニタリングするために使用されるターゲット属性のモデル出力内のインデックスまたは JMESPath の場所。CSV `accept_type` ケースでこれが指定されていない場合、モデル出力がスコアまたは確率に対応する単一の数値であると仮定します。
+ `ProbabilityAttribute` — 確率を示すモデル出力内のインデックスまたは JMESPath の場所。例えば、モデル出力がラベルと確率のリストを含む JSON Lines の場合、最大確率に対応するラベルがバイアス計算用に選択されます。
+ `ProbabilityThresholdAttribute` - (オプション) 二項分類の場合にバイナリラベルを選択するためのしきい値を示す浮動小数点値。デフォルト値は 0.5 です。

## CSV および JSON Lines データセットの JSON 設定ファイルの例
<a name="clarify-config-json-monitor-bias-parameters-examples"></a>

CSV および JSON Lines データセットを設定してバイアスドリフトをモニタリングするために使用される JSON ファイルの例を次に示します。

**Topics**
+ [CSV データセット](#clarify-config-json-monitor-bias-parameters-example-csv)
+ [JSON Lines データセット](#clarify-config-json-monitor-bias-parameters-example-jsonlines)

### CSV データセット
<a name="clarify-config-json-monitor-bias-parameters-example-csv"></a>

次の例のように、4 つの特徴量列と 1 つのラベル列からなるデータセットを考えてみると、最初の特徴量とラベルはバイナリです。

```
0, 0.5814568701544718, 0.6651538910132964, 0.3138080342665499, 0
1, 0.6711642728531724, 0.7466687034026017, 0.1215477472819713, 1
0, 0.0453256543003371, 0.6377430803264152, 0.3558625219713576, 1
1, 0.4785191813363956, 0.0265841045263860, 0.0376935084990697, 1
```

次の例のように、モデル出力に 2 つの列があり、最初の列が予測ラベル、2 番目の列が確率であると仮定します。

```
1, 0.5385257417814224
```

次に、次の JSON 設定ファイルはこの CSV データセットを設定する方法の例を示します。

```
{
    "headers": [
        "feature_0",
        "feature_1",
        "feature_2",
        "feature_3",
        "target"
    ],
    "label": "target",
    "label_values_or_threshold": [1],
    "facet": [{
        "name_or_index": "feature_1",
        "value_or_threshold": [1]
    }]
}
```

予測ラベルは `"InferenceAttribute"` パラメータによって選択されます。0 から始まる番号が使用されるため、0 はモデル出力の最初の列を示します。

```
"EndpointInput": {
    ...
    "InferenceAttribute": 0
    ...
}
```

別の方法として、さまざまなパラメータを使用して確率値をバイナリ予測ラベルに変換することもできます。0 から始まる番号付けが使用されます。1 は 2 列目を示し、0.6 という `ProbabilityThresholdAttribute` 値は、確率が 0.6 を超えるとバイナリラベルが 1 と予測されることを示します。

```
"EndpointInput": {
    ...
    "ProbabilityAttribute": 1,
    "ProbabilityThresholdAttribute": 0.6
    ...
}
```

### JSON Lines データセット
<a name="clarify-config-json-monitor-bias-parameters-example-jsonlines"></a>

次の例のように、4 つの特徴量列と 1 つのラベル列からなるデータセットを考えてみると、最初の特徴量とラベルはバイナリです。

```
{"features":[0, 0.5814568701544718, 0.6651538910132964, 0.3138080342665499], "label":0}
{"features":[1, 0.6711642728531724, 0.7466687034026017, 0.1215477472819713], "label":1}
{"features":[0, 0.0453256543003371, 0.6377430803264152, 0.3558625219713576], "label":1}
{"features":[1, 0.4785191813363956, 0.0265841045263860, 0.0376935084990697], "label":1}
```

モデル出力に 2 つの列があり、最初の列が予測ラベル、2 番目の列が確率であると仮定します。

```
{"predicted_label":1, "probability":0.5385257417814224}
```

次の JSON 設定ファイルはこの JSON Lines データセットを設定する方法の例を示します。

```
{
    "headers": [
        "feature_0",
        "feature_1",
        "feature_2",
        "feature_3",
        "target"
    ],
    "label": "label",
    "label_values_or_threshold": [1],
    "facet": [{
        "name_or_index": "feature_1",
        "value_or_threshold": [1]
    }]
}
```

次に、`EndpointInput` (リアルタイムエンドポイントの場合) または `BatchTransformInput` (バッチ変換ジョブの場合) `"features"` のパラメータ値を使用してデータセット内の特徴量を検索し、`"predicted_label"` パラメータ値によってモデル出力から予測ラベルを選択します。

```
"EndpointInput": {
    ...
    "FeaturesAttribute": "features",
    "InferenceAttribute": "predicted_label"
    ...
}
```

別の方法として、`ProbabilityThresholdAttribute` パラメータ値を使用して確率値をバイナリ予測ラベルに変換することもできます。例えば、値が 0.6 の場合、確率が 0.6 を超えると、バイナリラベルは 1 と予測されます。

```
"EndpointInput": {
    ...
    "FeaturesAttribute": "features",
    "ProbabilityAttribute": "probability",
    "ProbabilityThresholdAttribute": 0.6
    ...
}
```

# バイアスドリフトのモニタリングジョブをスケジュールする
<a name="clarify-model-monitor-bias-drift-schedule"></a>

ベースラインを作成したら、`ModelBiasModelMonitor` クラスインスタンスの `create_monitoring_schedule()` メソッドを呼び出して、1 時間ごとのバイアスドリフトモニターをスケジュールできます。以下のセクションでは、リアルタイムエンドポイントにデプロイされたモデルとバッチ変換ジョブのバイアスドリフトモニターを作成する方法を示します。

**重要**  
モニタリングスケジュールを作成するときに、バッチ変換入力またはエンドポイント入力のいずれかを指定できますが、両方を指定することはできません。

データ品質モニタリングとは異なり、モデル品質をモニタリングしたい場合は Ground Truth ラベルを指定する必要があります。ただし、Ground Truth ラベルは遅れる可能性があります。これに対処するには、モニタリングスケジュールを作成するときにオフセットを指定します。タイムオフセットの作成方法の詳細については、「[モデルモニターのオフセット](model-monitor-model-quality-schedule.md#model-monitor-model-quality-schedule-offsets)」を参照してください。

ベースライン作成ジョブを送信済みである場合、モニタリングジョブはベースライン作成ジョブから分析設定を自動的に取得します。ベースライン作成のステップをスキップした場合、またはキャプチャするデータセットがトレーニングデータセットと異なる性質を持つ場合は、分析設定を指定する必要があります。

## リアルタイムエンドポイントにデプロイされたモデルのバイアスドリフトモニタリング
<a name="model-monitor-bias-quality-rt"></a>

リアルタイムエンドポイントのバイアスドリフトモニターをスケジュールするには、次のコードサンプルに示すように、`EndpointInput` インスタンスを `ModelBiasModelMonitor` インスタンスの `endpoint_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator
            
model_bias_monitor = ModelBiasModelMonitor(
    role=sagemaker.get_execution_role(),
    ...
)

model_bias_analysis_config = None
if not model_bias_monitor.latest_baselining_job:
    model_bias_analysis_config = BiasAnalysisConfig(
        model_bias_config,
        headers=all_headers,
        label=label_header,
    )

model_bias_monitor.create_monitoring_schedule(
    monitor_schedule_name=schedule_name,
    post_analytics_processor_script=s3_code_postprocessor_uri,
    output_s3_uri=s3_report_path,
    statistics=model_bias_monitor.baseline_statistics(),
    constraints=model_bias_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
    analysis_config=model_bias_analysis_config,
    endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint",
        start_time_offset="-PT1H",
        end_time_offset="-PT0H",
        probability_threshold_attribute=0.8,
    ),
)
```

## バッチ変換ジョブのバイアスドリフトモニタリング
<a name="model-monitor-bias-quality-bt"></a>

バッチ変換ジョブのバイアスドリフトモニターをスケジュールするには、次のコードサンプルに示すように、`BatchTransformInput` インスタンスを `ModelBiasModelMonitor` インスタンスの `batch_transform_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator
                
model_bias_monitor = ModelBiasModelMonitor(
    role=sagemaker.get_execution_role(),
    ...
)

model_bias_analysis_config = None
if not model_bias_monitor.latest_baselining_job:
    model_bias_analysis_config = BiasAnalysisConfig(
        model_bias_config,
        headers=all_headers,
        label=label_header,
    )
    
schedule = model_bias_monitor.create_monitoring_schedule(
   monitor_schedule_name=schedule_name,
   post_analytics_processor_script=s3_code_postprocessor_uri,
   output_s3_uri=s3_report_path,
   statistics=model_bias_monitor.baseline_statistics(),
   constraints=model_bias_monitor.suggested_constraints(),
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   enable_cloudwatch_metrics=True,
   analysis_config=model_bias_analysis_config,
   batch_transform_input=BatchTransformInput(
        destination="opt/ml/processing/input",
        data_captured_destination_s3_uri=s3_capture_path,
        start_time_offset="-PT1H",
        end_time_offset="-PT0H",
        probability_threshold_attribute=0.8
   ),
)
```

# データのバイアスドリフトのレポートを確認する
<a name="clarify-model-monitor-bias-drift-report"></a>

モニタリングの結果を SageMaker Studio で生成されたレポートで確認できない場合は、次を実行するとレポートを出力できます。

```
schedule_desc = model_bias_monitor.describe_schedule()
execution_summary = schedule_desc.get("LastMonitoringExecutionSummary")
if execution_summary and execution_summary["MonitoringExecutionStatus"] in ["Completed", "CompletedWithViolations"]:
    last_model_bias_monitor_execution = model_bias_monitor.list_executions()[-1]
    last_model_bias_monitor_execution_report_uri = last_model_bias_monitor_execution.output.destination
    print(f'Report URI: {last_model_bias_monitor_execution_report_uri}')
    last_model_bias_monitor_execution_report_files = sorted(S3Downloader.list(last_model_bias_monitor_execution_report_uri))
    print("Found Report Files:")
    print("\n ".join(last_model_bias_monitor_execution_report_files))
else:
    last_model_bias_monitor_execution = None
    print("====STOP==== \n No completed executions to inspect further. Please wait till an execution completes or investigate previously reported failures.")
```

 ベースラインと比較して違反がある場合は、こちらに一覧表示されます。

```
if last_model_bias_monitor_execution:
    model_bias_violations = last_model_bias_monitor_execution.constraint_violations()
    if model_bias_violations:
        print(model_bias_violations.body_dict)
```

モデルがリアルタイムエンドポイントにデプロイされている場合、**[エンドポイント]** タブを選択してエンドポイントをダブルクリックすると、SageMaker Studio で分析結果と CloudWatch メトリクスを視覚化して表示できます。

# バイアスドリフト分析の CloudWatch メトリクス
<a name="clarify-model-monitor-bias-drift-cw"></a>

このガイドでは、SageMaker Clarify のバイアスドリフト分析に使用できる CloudWatch メトリクスとそのプロパティについて説明します。バイアスドリフトモニタリングジョブは、[トレーニング前のバイアスメトリクス](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-measure-data-bias.html)と[トレーニング後のバイアスメトリクス](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-measure-post-training-bias.html)の両方を計算し、次の CloudWatch 名前空間に公開します。
+ リアルタイムエンドポイントの場合: `aws/sagemaker/Endpoints/bias-metrics`
+ バッチ変換ジョブの場合: `aws/sagemaker/ModelMonitoring/bias-metrics` 

CloudWatch メトリックス名は、メトリクスのショートネームを `bias_metric` に追加します。

例えば、`bias_metric_CI` はクラス不均衡 (CI) のバイアスメトリクスです。

**注記**  
`+/- infinity` は浮動小数点数 `+/- 2.348543e108` として公開され、null 値を含むエラーは公開されません。

各メトリクスには次のプロパティがあります。
+ `Endpoint`: モニタリング対象のエンドポイントの名前 (該当する場合)。
+ `MonitoringSchedule`: モニタリングジョブのスケジュールの名前。
+ `BiasStage`: バイアスドリフトモニタリングジョブのステージの名前。[`Pre-training`] または [`Post-Training`] のいずれかを選択します。
+ `Label`: モニタリングジョブの分析設定 `label` によって提供されるターゲット特徴量の名前。
+ `LabelValue`: モニタリングジョブの分析設定 `label_values_or_threshold` によって提供されるファセット特徴量の名前。
+ `Facet`: モニタリングジョブ分析設定ファセット `name_of_index` によって提供されるファセットの名前。
+ `FacetValue`: モニタリングジョブ分析設定ファセット `nvalue_or_threshold` によって提供されるファセットの値。

モニタリングジョブがメトリクスを公開しないようにするには、[モデルバイアスジョブ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelBiasJobDefinition.html) 定義の `Environment` マップで `publish_cloudwatch_metrics` を `Disabled` に設定します。

# 本番稼働用モデルの Feature Attribution ドリフト
<a name="clarify-model-monitor-feature-attribution-drift"></a>

本番稼働中のモデルのライブデータ分布がドリフトすると、バイアスメトリクスのモニタリングでバイアスドリフトが発生するのと同様に、特徴属性値でも対応するドリフトが発生する可能性があります。Amazon SageMaker Clarify 特徴属性モニタリングは、データサイエンティストと機械学習エンジニアが予測の特徴属性ドリフトを定期的にモニタリングするのに役立ちます。モデルのモニタリング中は、特徴属性を詳細に説明する、エクスポート可能なレポートとグラフを SageMaker Studio で表示できます。また、Amazon CloudWatch でアラートを設定して、特定のしきい値を超える属性値のドリフトが検出された場合に通知を送信するようにできます。

具体的な状況でこれを説明するために、大学入学のシナリオを仮定して考えてみましょう。トレーニングデータとライブデータで、次の (集約された) 特徴属性値を観察するとします。

仮定の大学入学シナリオ


| 機能 | トレーニングデータの属性 | ライブデータの属性 | 
| --- | --- | --- | 
| SAT の得点 | 0.70 | 0.10 | 
| GPA | 0.50 | 0.20 | 
| 学年順位 | 0.05 | 0.70 | 

トレーニングデータからライブデータへの変化は大きいようです。特徴の順位は完全に逆転しています。バイアスドリフトと同様に、特徴属性ドリフトは、ライブデータ分布の変化によって引き起こされ、ライブデータに基づいたモデルの動作を詳しく調べることが必要となります。繰り返しになりますが、このようなシナリオの最初のステップは、ドリフトが発生したことを示すアラームを発生させることです。

個々の特徴の順位がトレーニングデータからライブデータにどのように変化したかを比較することで、ドリフトを検出できます。順位の変化に加えて、特徴の未加工属性のスコアにも注意を向ける必要があります。例えば、トレーニングからライブデータに移行した際、同じだけ順位が下がった 2 つの特徴がある場合、トレーニングデータの属性スコアが高い特徴に対してより注意が必要です。これらの特性を念頭に置きながら、Normalized Discounted Cumulative Gain (NDCG) スコアを使用して、トレーニングデータとライブデータの特徴属性ランキングを比較します。

具体的には、次を仮定します。
+ *F=[f1,...,fm]* はトレーニングデータでの属性スコアを基準に並べられた特徴のリストです。*m*は、特徴の総数です。例えば、このシナリオでは、*F*=[SAT Score, GPA, Class Rank] となります。
+ *a(f)* は、特徴が *f* のときにトレーニングデータの特徴属性スコアを返す関数です。例えば、*a*(SAT Score) = 0.70 となります。
+ *F′=[f′​1​, …, f′​m​] *は、ライブデータでの属性スコアを基準に並べた特徴のリストです。例えば、*F*′= [Class Rank, GPA, SAT Score] となります。

NDCG は次のように計算されます。

        NDCG=DCG/iDCG​

デプロイに 
+ DCG = ∑1m*a*(*f'i*)/log2​(*i*\$11)
+ iDCG = ∑1m*a*(*fi*)/log2​(*i*\$11)

DCG の値は、トレーニングデータで属性が高順位の特徴が、ライブデータに基づいて計算された特徴属性においても上位になるかどうかを測定します。iDCG の数量は、*理想的なスコア*です。最終値が [0, 1] の範囲内に存在し、1 が最良値であることを保証する正規化係数に過ぎません。NDCG 値が 1 である場合、ライブデータの特徴属性順位がトレーニングデータの順位と同じであることを意味します。この例では順位がかなり変わったため、NDCG 値は 0.69 です。

SageMaker Clarify では、NDCG の値が 0.90 を下回ると、自動的にアラートが発行されます。

## Model Monitor のサンプルノートブック
<a name="clarify-model-monitor-sample-notebooks-feature-drift"></a>

SageMaker Clarify には、リアルタイムエンドポイントの推論データをキャプチャし、進化するバイアスをモニタリングするためのベースラインを作成し、結果を調べる方法を示す次のサンプルノートブックが用意されています。
+ [バイアスドリフトと特徴属性ドリフトのモニタリング (Amazon SageMaker Clarify)](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_model_monitor/fairness_and_explainability/SageMaker-Model-Monitor-Fairness-and-Explainability.html) — Amazon SageMaker Model Monitor を使用して、バイアスドリフトと特徴属性ドリフトを経時的にモニタリングします。

このノートブックが動作することが確認されているのは SageMaker Studio のみです。SageMaker Studio でノートブックを開く方法の手順については、「[Amazon SageMaker Studio Classic ノートブックを作成する、または開く](notebooks-create-open.md)」を参照してください。カーネルの選択を求めるメッセージが表示されたら、**[Python 3 (Data Science)]** (Python 3 (データサイエンス)) を選択します。次のトピックでは、最後の 2 つのステップの要点が説明されています。サンプルノートブックのコードサンプルも含まれています。

**Topics**
+ [Model Monitor のサンプルノートブック](#clarify-model-monitor-sample-notebooks-feature-drift)
+ [本稼働環境のモデルの SHAP ベースラインを作成する](clarify-model-monitor-shap-baseline.md)
+ [特徴量属性ドリフト違反をモニタリングする](clarify-model-monitor-model-attribution-drift-violations.md)
+ [Attribution ドリフトをモニタリングするためのパラメータ](clarify-config-json-monitor-model-explainability-parameters.md)
+ [特徴属性ドリフトのモニタリングジョブをスケジュールする](clarify-model-monitor-feature-attribute-drift-schedule.md)
+ [本番稼働モデルの特徴属性ドリフトのレポートを確認する](clarify-feature-attribute-drift-report.md)
+ [特徴量ドリフト分析のための CloudWatch メトリクス](clarify-feature-attribute-drift-cw.md)

# 本稼働環境のモデルの SHAP ベースラインを作成する
<a name="clarify-model-monitor-shap-baseline"></a>

説明とは一般的に対比的なもので、この場合はベースラインからの逸脱について説明します。説明可能性ベースラインの詳細については、「[説明可能性のための SHAP ベースライン](clarify-feature-attribute-shap-baselines.md)」を参照してください。

SageMaker Clarify では、インスタンスごとの推論の説明を提供するのみでなく、機械学習モデル全体の説明もサポートしています。これにより、モデルの特徴に関してモデル全体の動作を理解できます。SageMaker Clarify は複数のインスタンスで Shapley 値を集計して、機械学習モデル全体の説明を生成します。SageMaker Clarify は以下のさまざまな集計方法をサポートしており、これらはベースラインの定義に使用できます。
+ `mean_abs` - すべてのインスタンスの SHAP 絶対値の平均値。
+ `median` - すべてのインスタンスの SHAP 値の中央値。
+ `mean_sq` - すべてのインスタンスの SHAP 値の二乗平均値。

アプリケーションのリアルタイム推論データまたはバッチ変換推論データのキャプチャを設定した後、特徴量属性ドリフトのモニタリングで最初に行うタスクは、比較対象となるベースラインの作成です。これには、データ入力、機微性の高いグループ、予測のキャプチャ方法、モデルとそのトレーニング後のバイアスメトリクスの設定が含まれます。その後に、ベースライン作成ジョブを開始する必要があります。モデルの説明可能性モニタリングは、推論を生成するデプロイ済みのモデルの予測を説明し、特徴属性ドリフトを定期的に検出します。

```
model_explainability_monitor = ModelExplainabilityMonitor(
    role=role,
    sagemaker_session=sagemaker_session,
    max_runtime_in_seconds=1800,
)
```

この例では、説明可能性ベースライン作成ジョブはバイアスベースライン作成ジョブとテストデータセットを共有するため、同じ `DataConfig` を使用します。唯一の違いはジョブの出力 URI です。

```
model_explainability_baselining_job_result_uri = f"{baseline_results_uri}/model_explainability"
model_explainability_data_config = DataConfig(
    s3_data_input_path=validation_dataset,
    s3_output_path=model_explainability_baselining_job_result_uri,
    label=label_header,
    headers=all_headers,
    dataset_type=dataset_type,
)
```

現在、SageMaker Clarify の説明機能にはスケーラブルで効率的な SHAP が実装されているため、説明可能性の設定は ShapConfig で行います。ShapConfig には以下が含まれます。
+ `baseline` - カーネル SHAP アルゴリズムでベースラインデータセットとして使用される行のリスト (少なくとも 1 つ) または S3 オブジェクト URI。形式は、データセット形式と同じである必要があります。各行には、特徴の列/値のみを含め、ラベルの列/値を省略する必要があります。
+ `num_samples` - カーネル SHAP アルゴリズムで使用されるサンプルの数。この数値は、SHAP 値を計算するために生成される合成データセットのサイズを決定します。
+ agg\$1method - グローバル SHAP 値の集計方法。以下の値が有効です。
  + `mean_abs` - すべてのインスタンスの SHAP 絶対値の平均値。
  + `median` - すべてのインスタンスの SHAP 値の中央値。
  + `mean_sq` - すべてのインスタンスの SHAP 値の二乗平均値。
+ `use_logit` — モデル予測にロジット関数を適用するかどうかを示す。デフォルトは `False` です。`use_logit` が `True` の場合、SHAP の値は対数オッズ単位になります。
+ `save_local_shap_values` (ブール値) — ローカルの SHAP 値を出力場所に保存するかどうかを示す。デフォルトは `False` です。

```
# Here use the mean value of test dataset as SHAP baseline
test_dataframe = pd.read_csv(test_dataset, header=None)
shap_baseline = [list(test_dataframe.mean())]

shap_config = SHAPConfig(
    baseline=shap_baseline,
    num_samples=100,
    agg_method="mean_abs",
    save_local_shap_values=False,
)
```

ベースライン作成ジョブを開始します。説明可能性ベースライン作成ジョブには、同じ `model_config` が必要です。このジョブは生成された合成データセットの予測を取得するためにシャドウエンドポイントを作成する必要があるためです。

```
model_explainability_monitor.suggest_baseline(
    data_config=model_explainability_data_config,
    model_config=model_config,
    explainability_config=shap_config,
)
print(f"ModelExplainabilityMonitor baselining job: {model_explainability_monitor.latest_baselining_job_name}")
```

# 特徴量属性ドリフト違反をモニタリングする
<a name="clarify-model-monitor-model-attribution-drift-violations"></a>

特徴量属性ドリフトジョブは、[ベースライン設定](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelExplainabilityJobDefinition.html#sagemaker-CreateModelExplainabilityJobDefinition-request-ModelExplainabilityBaselineConfig)によって提供されるベースライン制約を、現在の `MonitoringExecution` の分析結果と照らし合わせて評価します。違反が検出されると、ジョブはその違反を実行出力場所の constraint\$1violations.json ファイルに一覧表示し、実行ステータスを [結果の解釈](model-monitor-interpreting-results.md) としてマークします。**

特徴量属性ドリフト違反ファイルのスキーマは次のとおりです。
+ `label` — ラベルの名前、ジョブ分析設定、`label_headers` またはプレースホルダーの名前 (`"label0"` など)。
+ `metric_name` — 説明可能性分析メソッドの名前。現在は、`shap` のみがサポートされます。
+ `constraint_check_type` — モニタリング対象の違反のタイプ。現在は、`feature_attribution_drift_check` のみがサポートされます。
+ `description` — 違反を説明する説明メッセージ。

```
{
    "version": "1.0",
    "violations": [{
        "label": "string",
        "metric_name": "string",
        "constraint_check_type": "string",
        "description": "string"
    }]
}
```

*モニタリングジョブは、`explanations` セクションの各ラベルについて、ベースライン制約ファイルおよびジョブ分析結果ファイル (analysis.json) 内のグローバル SHAP 値の [nDCG スコア](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.ndcg_score.html)を計算します。*スコアが 0.9 未満の場合、違反が記録されます。グローバル SHAP 値の合計が評価されるので、違反エントリには `“feature”` フィールドがありません。次の出力は、記録された複数の違反の例を示しています。

```
{
    "version": "1.0",
    "violations": [{
        "label": "label0",
        "metric_name": "shap",
        "constraint_check_type": "feature_attribution_drift_check",
        "description": "Feature attribution drift 0.7639720923277322 exceeds threshold 0.9"
    }, {
        "label": "label1",
        "metric_name": "shap",
        "constraint_check_type": "feature_attribution_drift_check",
        "description": "Feature attribution drift 0.7323763972092327 exceeds threshold 0.9"
    }]
}
```

# Attribution ドリフトをモニタリングするためのパラメータ
<a name="clarify-config-json-monitor-model-explainability-parameters"></a>

Amazon SageMaker Clarify 説明可能性モニターは、[分析設定ファイル](clarify-processing-job-configure-analysis.md) の分析設定に使用されたパラメータのサブセットを再利用します。次のパラメータは JSON ファイルで指定する必要があり、パスは [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelExplainabilityAppSpecification](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelExplainabilityAppSpecification) の `ConfigUri` パラメータで指定する必要があります。
+ `"version"` - (オプション) 設定ファイルのスキーマバージョン。指定しない場合、サポートされている最新のバージョンが使用されます。
+ `"headers"` - (オプション) データセット内の特徴量名のリスト。説明可能性分析にはラベルは必要ありません。
+ `"methods"` - 分析およびレポートのメソッドとそのパラメータのリスト。セクションを省略すると、そのセクションは計算されません。
  + `"shap"` - (オプション) SHAP 値のコンピュテーションに関するセクション。
    + `"baseline"` — (オプション) 行のリスト (少なくとも 1 つ)、または Amazon Simple Storage Service (Amazon S3) オブジェクト URI。Kernel SHAP アルゴリズムのベースラインデータセット (バックグラウンドデータセットとも呼ばれます) として使用されます。形式は、データセット形式と同じである必要があります。各行には、特徴量列 (または値) のみを含める必要があります。各行をモデルに送る前に、除外する必要がある列はすべて省略します。
    + `"num_samples"` - カーネル SHAP アルゴリズムで使用されるサンプルの数。この数値は、SHAP 値を計算するために生成される合成データセットのサイズを決定します。指定しない場合、SageMaker Clarify ジョブは特徴量の数に基づいて値を選択します。
    + `"agg_method"` - グローバル SHAP 値の集計方法。有効な値は次のとおりです。
      + `"mean_abs"` - すべてのインスタンスの SHAP 絶対値の平均値。
      + `"median"` - すべてのインスタンスの SHAP 値の中央値。
      + `"mean_sq"` - すべてのインスタンスの SHAP 値の二乗平均値。
    + `"use_logit"`— (オプション) ロジット関数をモデル予測に適用するかどうかを示すブール値。`"use_logit"` が `true` の場合、SHAP の値は対数オッズ単位になります。デフォルト値は `false` です。
    + `"save_local_shap_values"` - (オプション) ローカル SHAP 値を出力場所に保存するかどうかを示すブール値。`true` を使用して保存します。`false` を使用して保存しません。デフォルトは `false` です。
+ `"predictor"` — (リアルタイムエンドポイントではオプション、バッチ変換には必須) モデルパラメータのセクション。`"shap"` と `"post_training_bias"` セクションが存在する場合は必須。
  + `"model_name"` - `CreateModel` API によってコンテナモードを `SingleModel` として作成されるモデル名。
  + `"instance_type"` - シャドウエンドポイントのインスタンスタイプ。
  + `"initial_instance_count"` - シャドウエンドポイントのインスタンス数。
  + `"content_type"` - (オプション) シャドウエンドポイントで推論を取得するために使用されるモデル入力形式。有効な値は CSV の場合は `"text/csv"`、JSON Lines の場合は `"application/jsonlines"`、Apache Parquet の場合は `application/x-parquet`、コンピュータビジョンの説明可能性を有効にする場合は `application/x-image` です。デフォルト値は `dataset_type` 形式と同じです。
  + `"accept_type"` - (オプション) シャドウエンドポイントで推論を取得するために使用されるモデル出力**形式。有効な値は、CSV の場合は `"text/csv"`、JSON Lines の場合は `"application/jsonlines"` です。省略した場合、SageMaker Clarify はキャプチャされたデータのレスポンスデータ型を使用します。
  + `"content_template"` - (オプション) データセットインスタンスからモデル入力を構築するために使用されるテンプレート文字列。`"content_type"` が `"application/jsonlines"` の場合にのみ使用されます。テンプレートにはプレースホルダー `$features` のみを含める必要があります。これはランタイムに特徴量リストに置き換えられます。例えば `"content_template":"{\"myfeatures\":$features}"` の場合、インスタンス (ラベルなし) が `1,2,3` とすると、モデル入力は JSON Lines `'{"myfeatures":[1,2,3]}'` になります。
  + `"label_headers"` — (オプション) データセット内で `"label"` が受け取る値のリスト。モデルエンドポイントまたはバッチ変換ジョブから返されたスコアを、対応するラベル値に関連付けます。指定されている場合、分析レポートは `“label0”` のようなプレースホルダーの代わりにヘッダーを使用します。

他のパラメーターは、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelExplainabilityJobInput](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelExplainabilityJobInput) API の `EndpointInput` (リアルタイムエンドポイントの場合) または `BatchTransformInput` (バッチ変換ジョブの場合) で指定する必要があります。
+ `FeaturesAttribute` — エンドポイントまたはバッチジョブの入力データ形式が `"application/jsonlines"` の場合、このパラメータは必須です。データセット形式が JSON Lines の場合、これは特徴量列の検索に使用される JMESPath です。
+ `ProbabilityAttribute` — 確率を示すモデル出力内のインデックスまたは JMESPath の場所。例えば、モデル出力がラベルと確率のリストを含む JSON Lines の場合、最大確率に対応するラベルがバイアス計算用に選択されます。

## CSV および JSON Lines データセットの JSON 設定ファイルの例
<a name="clarify-config-json-monitor-model-explainability-parameters-examples"></a>

CSV および JSON Lines データセットを設定して、特徴量属性ドリフトをモニタリングするために使用される JSON ファイルの例を次に示します。

**Topics**
+ [CSV データセット](#clarify-config-json-monitor-model-explainability-parameters-example-csv)
+ [JSON Lines データセット](#clarify-config-json-monitor-model-explainability-parameters-example-jsonlines)

### CSV データセット
<a name="clarify-config-json-monitor-model-explainability-parameters-example-csv"></a>

次の例のように、数値特徴量列が 3 つあるデータセットを考えてみましょう。

```
0.5814568701544718, 0.6651538910132964, 0.3138080342665499
0.6711642728531724, 0.7466687034026017, 0.1215477472819713
0.0453256543003371, 0.6377430803264152, 0.3558625219713576
0.4785191813363956, 0.0265841045263860, 0.0376935084990697
```

次の例のように、モデル出力に 2 つの列があり、最初の列が予測ラベル、2 番目の列が確率であると仮定します。

```
1, 0.5385257417814224
```

次の JSON 設定ファイルはこの CSV データセットを設定する方法の例を示します。

```
{
                    
    "headers": [
        "feature_1",
        "feature_2",
        "feature_3"
    ],
    "methods": {
        "shap": {
            "baseline": [
                [0.4441164946610942, 0.5190374448171748, 0.20722795300473712]
            ],
            "num_samples": 100,
            "agg_method": "mean_abs"
        }
    },
    "predictor": {
        "model_name": "my_model",
        "instance_type": "ml.m5.xlarge",
        "initial_instance_count": 1
    }
}
```

予測ラベルは `"ProbabilityAttribute"` パラメータによって選択されます。0 から始まる番号付けが使用されるため、1 はモデル出力の 2 列目を示します。

```
"EndpointInput": {
    ...
    "ProbabilityAttribute": 1
    ...
}
```

### JSON Lines データセット
<a name="clarify-config-json-monitor-model-explainability-parameters-example-jsonlines"></a>

次の例のように、4 つの特徴量列と 1 つのラベル列からなるデータセットを考えてみると、最初の特徴量とラベルはバイナリです。

```
{"features":[0, 0.5814568701544718, 0.6651538910132964, 0.3138080342665499], "label":0}
{"features":[1, 0.6711642728531724, 0.7466687034026017, 0.1215477472819713], "label":1}
{"features":[0, 0.0453256543003371, 0.6377430803264152, 0.3558625219713576], "label":1}
{"features":[1, 0.4785191813363956, 0.0265841045263860, 0.0376935084990697], "label":1}
```

次の例のように、モデル入力はデータセット形式と同じで、モデル出力は JSON Lines です。

```
{"predicted_label":1, "probability":0.5385257417814224}
```

次の例で、JSON 設定ファイルはこの JSON Lines データセットを設定する方法を示します。

```
{
    "headers": [
        "feature_1",
        "feature_2",
        "feature_3"
    ],
    "methods": {
        "shap": {
            "baseline": [
                {"features":[0.4441164946610942, 0.5190374448171748, 0.20722795300473712]}
            ],
            "num_samples": 100,
            "agg_method": "mean_abs"
        }
    },
    "predictor": {
        "model_name": "my_model",
        "instance_type": "ml.m5.xlarge",
        "initial_instance_count": 1,
        "content_template":"{\"features\":$features}"
    }
}
```

次に `EndpointInput` (リアルタイムエンドポイントの場合) または `BatchTransformInput` (バッチ変換ジョブの場合) の `"features"` パラメータ値を使用してデータセット内の特徴量を検索し、`"probability"` パラメータ値によってモデル出力から確率値を選択します。

```
"EndpointInput": {
    ...
    "FeaturesAttribute": "features",
    "ProbabilityAttribute": "probability",
    ...
}
```

# 特徴属性ドリフトのモニタリングジョブをスケジュールする
<a name="clarify-model-monitor-feature-attribute-drift-schedule"></a>

SHAP ベースラインを作成したら、`ModelExplainabilityMonitor` クラスインスタンスの `create_monitoring_schedule()` メソッドを呼び出して、1 時間ごとにモデル説明可能性モニターをスケジュールできます。以下のセクションでは、リアルタイムエンドポイントにデプロイされたモデルとバッチ変換ジョブのモデル説明可能性モニターを作成する方法を示します。

**重要**  
モニタリングスケジュールを作成するときに、バッチ変換入力またはエンドポイント入力のいずれかを指定できますが、両方を指定することはできません。

ベースライン作成ジョブを送信済みである場合、モニタリングジョブはベースライン作成ジョブから分析設定を自動的に取得します。ベースライン作成のステップをスキップした場合、またはキャプチャするデータセットがトレーニングデータセットと異なる性質を持つ場合は、分析設定を指定する必要があります。`ExplainabilityAnalysisConfig` には、ベースライン作成ジョブで必要とされるのと同じ理由で `ModelConfig` が必要となります。特徴量属性の計算に必要なのは特徴量のみであるため、Ground Truth ラベリングを除外する必要があります。

## リアルタイムエンドポイントにデプロイされたモデルの特徴量属性ドリフトモニタリング
<a name="model-monitor-explain-quality-rt"></a>

リアルタイムエンドポイントのモデル説明可能性モニターをスケジュールするには、次のコードサンプルに示すように、`EndpointInput` インスタンスを `ModelExplainabilityMonitor` インスタンスの `endpoint_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator

model_exp_model_monitor = ModelExplainabilityMonitor(
   role=sagemaker.get_execution_role(),
   ... 
)

schedule = model_exp_model_monitor.create_monitoring_schedule(
   monitor_schedule_name=schedule_name,
   post_analytics_processor_script=s3_code_postprocessor_uri,
   output_s3_uri=s3_report_path,
   statistics=model_exp_model_monitor.baseline_statistics(),
   constraints=model_exp_model_monitor.suggested_constraints(),
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   enable_cloudwatch_metrics=True,
   endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint",
    )
)
```

## バッチ変換ジョブ特徴量属性ドリフトモニタリング
<a name="model-monitor-explain-quality-bt"></a>

バッチ変換ジョブのモデル説明可能性モニターをスケジュールするには、次のコードサンプルに示すように、`BatchTransformInput` インスタンスを `ModelExplainabilityMonitor` インスタンスの `batch_transform_input` 引数に渡します。

```
from sagemaker.model_monitor import CronExpressionGenerator

model_exp_model_monitor = ModelExplainabilityMonitor(
   role=sagemaker.get_execution_role(),
   ... 
)

schedule = model_exp_model_monitor.create_monitoring_schedule(
   monitor_schedule_name=schedule_name,
   post_analytics_processor_script=s3_code_postprocessor_uri,
   output_s3_uri=s3_report_path,
   statistics=model_exp_model_monitor.baseline_statistics(),
   constraints=model_exp_model_monitor.suggested_constraints(),
   schedule_cron_expression=CronExpressionGenerator.hourly(),
   enable_cloudwatch_metrics=True,
   batch_transform_input=BatchTransformInput(
        destination="opt/ml/processing/data",
        model_name="batch-fraud-detection-model",
        input_manifests_s3_uri="s3://amzn-s3-demo-bucket/batch-fraud-detection/on-schedule-monitoring/in/",
        excludeFeatures="0",
   )
)
```

# 本番稼働モデルの特徴属性ドリフトのレポートを確認する
<a name="clarify-feature-attribute-drift-report"></a>

設定したスケジュールがデフォルトで開始されたら最初の実行が開始されるのを待ち、その後、料金が発生しないようにスケジュールを停止する必要があります。

レポートを確認するには、次のコードを使います。

```
schedule_desc = model_explainability_monitor.describe_schedule()
execution_summary = schedule_desc.get("LastMonitoringExecutionSummary")
if execution_summary and execution_summary["MonitoringExecutionStatus"] in ["Completed", "CompletedWithViolations"]:
    last_model_explainability_monitor_execution = model_explainability_monitor.list_executions()[-1]
    last_model_explainability_monitor_execution_report_uri = last_model_explainability_monitor_execution.output.destination
    print(f'Report URI: {last_model_explainability_monitor_execution_report_uri}')
    last_model_explainability_monitor_execution_report_files = sorted(S3Downloader.list(last_model_explainability_monitor_execution_report_uri))
    print("Found Report Files:")
    print("\n ".join(last_model_explainability_monitor_execution_report_files))
else:
    last_model_explainability_monitor_execution = None
    print("====STOP==== \n No completed executions to inspect further. Please wait till an execution completes or investigate previously reported failures.")
```

 ベースラインと比較して何らかの違反がある場合は、こちらに一覧表示されます。

```
if last_model_explainability_monitor_execution:
    model_explainability_violations = last_model_explainability_monitor_execution.constraint_violations()
    if model_explainability_violations:
        print(model_explainability_violations.body_dict)
```

モデルがリアルタイム エンドポイントにデプロイされている場合、**[エンドポイント]** タブを選択してエンドポイントをダブルクリックすると、SageMaker Studio で分析結果と CloudWatch メトリクスを視覚化して表示できます。

# 特徴量ドリフト分析のための CloudWatch メトリクス
<a name="clarify-feature-attribute-drift-cw"></a>

このガイドでは、SageMaker Clarify の特徴量属性ドリフト分析に使用できる CloudWatch メトリクスとそのプロパティについて説明します。特徴量属性ドリフトモニタリングジョブは、次の 2 種類のメトリクスを計算して公開します。
+ 各特徴量のグローバル SHAP 値。
**注記**  
このメトリクスの名前は、ジョブ分析設定で指定された特徴量名を `feature_` に追加します。例えば、`feature_X` は特徴量のグローバル SHAP 値 `X` です。
+ メトリクスの `ExpectedValue` 。

これらのメトリクスは次の CloudWatch 名前空間に公開されます。
+ リアルタイムエンドポイントの場合: `aws/sagemaker/Endpoints/explainability-metrics`
+ バッチ変換ジョブの場合: `aws/sagemaker/ModelMonitoring/explainability-metrics`

各メトリクスには次のプロパティがあります。
+ `Endpoint`: モニタリング対象のエンドポイントの名前 (該当する場合)。
+ `MonitoringSchedule`: モニタリングジョブのスケジュールの名前。
+ `ExplainabilityMethod`: シャープレイ値の計算に使用されるメソッドｚ。`KernelShap` を選択してください。
+ `Label`: ジョブ分析設定によって提供される名前 `label_headers` 、または `label0` のようなプレースホルダー。
+ `ValueType`: メトリクスによって返される値のタイプ。[`GlobalShapValues`] または [`ExpectedValue`] のいずれかを選択します。

モニタリングジョブがメトリクスを公開しないようにするには、[モデル説明可能性ジョブ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelExplainabilityJobDefinition.html) 定義の `Environment` マップで `publish_cloudwatch_metrics` を `Disabled` に設定します。

# モニタリングジョブのスケジューリング
<a name="model-monitor-scheduling"></a>

Amazon SageMaker Model Monitor には、リアルタイムエンドポイントから収集されたデータをモニタリングする機能があります。データを定期的なスケジュールでモニタリングすることも、1 回だけ即時にモニタリングすることもできます。[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html) API を使用してモニタリングスケジュールを作成できます。

モニタリングスケジュールを使用すると、SageMaker AIはジョブの処理を開始して、特定の期間に収集されたデータを分析できます。処理ジョブでは、SageMaker AI は現在の分析のデータセットを、指定されたベースライン統計および制約と比較します。次に、SageMaker AI は違反レポートを生成します。さらに、分析中の各特徴量について CloudWatch メトリクスが出力されます。

SageMaker AI には、表形式のデータセットを分析するためのビルド済みコンテナが用意されています。または、「[Amazon SageMaker Model Monitor を使用した独自のコンテナのサポート](model-monitor-byoc-containers.md)」のトピックで概説されているように、独自のコンテナを持ち込むこともできます。

リアルタイムエンドポイントまたはバッチ変換ジョブのモデルモニタリングスケジュールを作成できます。ベースラインリソース (制約および統計) を使用して、リアルタイムトラフィックまたはバッチジョブと比較します。

**Example ベースライン割り当て**  
次の例では、モデルのトレーニングに使用されたトレーニングデータセットが Amazon S3 にアップロードされました。データセットが Amazon S3 にすでに存在する場合は、それを直接指定できます。  

```
# copy over the training dataset to Amazon S3 (if you already have it in Amazon S3, you could reuse it)
baseline_prefix = prefix + '/baselining'
baseline_data_prefix = baseline_prefix + '/data'
baseline_results_prefix = baseline_prefix + '/results'

baseline_data_uri = 's3://{}/{}'.format(bucket,baseline_data_prefix)
baseline_results_uri = 's3://{}/{}'.format(bucket, baseline_results_prefix)
print('Baseline data uri: {}'.format(baseline_data_uri))
print('Baseline results uri: {}'.format(baseline_results_uri))
```

```
training_data_file = open("test_data/training-dataset-with-header.csv", 'rb')
s3_key = os.path.join(baseline_prefix, 'data', 'training-dataset-with-header.csv')
boto3.Session().resource('s3').Bucket(bucket).Object(s3_key).upload_fileobj(training_data_file)
```

**Example 定期分析のスケジュール**  
リアルタイムエンドポイントのモデルモニタリングをスケジュールする場合は、ベースラインの制約と統計を使用してリアルタイムのトラフィックと比較します。次のコードスニペットは、リアルタイムエンドポイントのモデルモニターをスケジュールするために使用する一般的な形式を示しています。この例では、モデルモニターを 1 時間ごとに実行するようにスケジュールしています。  

```
from sagemaker.model_monitor import CronExpressionGenerator
from time import gmtime, strftime

mon_schedule_name = 'my-model-monitor-schedule-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
my_default_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    endpoint_input=EndpointInput(
        endpoint_name=endpoint_name,
        destination="/opt/ml/processing/input/endpoint"
    ),
    post_analytics_processor_script=s3_code_postprocessor_uri,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

**Example 1 回限りの分析のスケジュール**  
`create_monitoring_schedule` メソッドに次のような引数を渡すことで、分析を繰り返し実行せずに 1 回実行するようにスケジュールすることもできます。  

```
    schedule_cron_expression=CronExpressionGenerator.now(),
    data_analysis_start_time="-PT1H",
    data_analysis_end_time="-PT0H",
```
これらの引数では、`schedule_cron_expression` パラメータは値 `CronExpressionGenerator.now()` を使用して、分析が 1 回だけ即時に実行されるようにスケジュールします。この設定を使用するどのスケジュールでも、`data_analysis_start_time` と `data_analysis_end_time` のパラメータは必須です。これらのパラメータは、分析時間枠の開始時間と終了時間を設定します。これらの時間を現在の時刻を基準にしたオフセットとして定義し、ISO 8601 の期間形式を使用します。この例では、時間 `-PT1H` と `-PT0H` を定義し、過去 1 時間から現在の時刻までの時間枠を定義します。このスケジュールでは、分析は指定された時間枠に収集されたデータのみを評価します。

**Example バッチ変換ジョブのスケジュール**  
次のコードスニペットは、バッチ変換ジョブのモデルモニターをスケジュールするために使用する一般的な形式を示しています。  

```
from sagemaker.model_monitor import (
    CronExpressionGenerator,
    BatchTransformInput, 
    MonitoringDatasetFormat, 
)
from time import gmtime, strftime

mon_schedule_name = 'my-model-monitor-schedule-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
my_default_monitor.create_monitoring_schedule(
    monitor_schedule_name=mon_schedule_name,
    batch_transform_input=BatchTransformInput(
        destination="opt/ml/processing/input",
        data_captured_destination_s3_uri=s3_capture_upload_path,
        dataset_format=MonitoringDatasetFormat.csv(header=False),
    ),
    post_analytics_processor_script=s3_code_postprocessor_uri,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

```
desc_schedule_result = my_default_monitor.describe_schedule()
print('Schedule status: {}'.format(desc_schedule_result['MonitoringScheduleStatus']))
```

# モニタリングスケジュールの cron 式
<a name="model-monitor-schedule-expression"></a>

モニタリングスケジュールの詳細を指定するには、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ScheduleConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ScheduleConfig.html) を使用します。これは、モニタリングスケジュールに関する詳細を記述する `cron` 式です。

Amazon SageMaker Model Monitor では、次の `cron` 式をサポートしています。
+ ジョブを 1 時間おきに開始するように設定するには、以下を使用します。

  `Hourly: cron(0 * ? * * *)`
+ ジョブを毎日実行するには、以下を使用します。

  `cron(0 [00-23] ? * * *)`
+ ジョブを 1 回だけ即座に実行するには、次のキーワードを使用します。

  `NOW`

例えば、有効な `cron` 式は次のとおりです。
+ 毎日午後 12 時 (UTC): `cron(0 12 ? * * *)`
+ 毎日午前 12 時 (UTC): `cron(0 0 ? * * *)`

6、12 時間ごとの実行をサポートするために、Model Monitor では次の式をサポートしています。

`cron(0 [00-23]/[01-24] ? * * *)`

例えば、有効な `cron` 式は次のとおりです。
+ 12 時間ごと、午後 5 時 (UTC) から開始: `cron(0 17/12 ? * * *)`
+ 2 時間ごと、午前 12 時 (UTC) から開始: `cron(0 0/2 ? * * *)`

**注意事項**  
`cron` 式は午後 5 時 (UTC) に開始するように設定されていますが、実際にリクエストされた時間から実行までに 0 ～ 20 分の遅延が生じる可能性があります。
日次スケジュールで実行する場合、このパラメータを指定しないでください。毎日実行する時間は、SageMaker AI が選択します。
現時点では、SageMaker は 1～24 時間の整数での時間間隔のみをサポートしています。

# モニタリングスケジュールのサービスコントロールポリシーの設定
<a name="model-monitor-scp-rules"></a>

 モニタリングジョブのスケジュールを作成または更新するときに [CreateMonitoringSchedule](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateMonitoringSchedule.html) API または [UpdateMonitoringSchedule](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateMonitoringSchedule.html) API をそれぞれ使用して、モニタリングジョブのパラメータをそれぞれ指定する必要があります。ユースケースに応じて、次のいずれかの方法でこれを行えます。
+  `CreateMonitoringSchedule` または `UpdateMonitoringSchedule` を呼び出すときに、[MonitoringScheduleConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MonitoringJobDefinition.html) の [MonitoringJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MonitoringScheduleConfig.html) フィールドを指定できます。これを使用できるのは、データ品質モニタリングジョブのスケジュールを作成または更新する場合に限られます。
+  `CreateMonitoringSchedule` または `UpdateMonitoringSchedule` を呼び出すときに、`MonitoringScheduleConfig` の `MonitoringJobDefinitionName` フィールドに、作成済みのモニタリングジョブ定義の名前を指定できます。これは、次の API のいずれかを使用して作成するどのジョブ定義にも使用できます。
  +  [CreateDataQualityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDataQualityJobDefinition.html) 
  +  [CreateModelQualityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelQualityJobDefinition.html) 
  +  [CreateModelBiasJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelBiasJobDefinition.html) 
  +  [CreateModelExplainabilityJobDefinition](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModelExplainabilityJobDefinition.html) 

   SageMaker Python SDK を使用してスケジュールを作成または更新する場合は、このプロセスを使用する必要があります。

 前述のプロセスは相互に排他的です。つまり、モニタリングスケジュールを作成または更新するときに、`MonitoringJobDefinition` フィールドまたは `MonitoringJobDefinitionName` フィールドのいずれかを指定できます。

 モニタリングジョブ定義を作成するか、`MonitoringJobDefinition` フィールドでモニタリングジョブ定義を指定すると、`NetworkConfig` や `VolumeKmsKeyId` などのセキュリティパラメータを設定できます。管理者は、モニタリングジョブが常に安全な環境で実行されるように、これらのパラメータを常に特定の値に設定するとよいでしょう。そのためには、適切な[サービスコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCP) を設定します。SCP は、組織のアクセス許可の管理に使用できる組織ポリシーの一種です。

 以下の例は、モニタリングジョブのスケジュールを作成または更新する際にインフラストラクチャーパラメータが適切に設定されてようにするために使用できる SCP を示しています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateDataQualityJobDefinition",
                "sagemaker:CreateModelBiasJobDefinition",
                "sagemaker:CreateModelExplainabilityJobDefinition",
                "sagemaker:CreateModelQualityJobDefinition"
            ],
            "Resource": "arn:*:sagemaker:*:*:*",
            "Condition": {
                "Null": {
                    "sagemaker:VolumeKmsKey":"true",
                    "sagemaker:VpcSubnets": "true",
                    "sagemaker:VpcSecurityGroupIds": "true"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateDataQualityJobDefinition",
                "sagemaker:CreateModelBiasJobDefinition",
                "sagemaker:CreateModelExplainabilityJobDefinition",
                "sagemaker:CreateModelQualityJobDefinition"
            ],
            "Resource": "arn:*:sagemaker:*:*:*",
            "Condition": {
                "Bool": {
                    "sagemaker:InterContainerTrafficEncryption": "false"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "sagemaker:CreateMonitoringSchedule",
                "sagemaker:UpdateMonitoringSchedule"
            ],
            "Resource": "arn:*:sagemaker:*:*:monitoring-schedule/*",
            "Condition": {
                "Null": {
                    "sagemaker:ModelMonitorJobDefinitionName": "true"
                }
            }
        }
    ]
}
```

------

 この例の最初の 2 つのルールでは、モニタリングジョブ定義のセキュリティパラメータが常に設定されるようになります。最後のルールでは、組織内でスケジュールを作成または更新する人は誰でも、必ず `MonitoringJobDefinitionName` フィールドを指定する必要があります。これにより、組織内の誰もスケジュールの作成または更新時に、`MonitoringJobDefinition` フィールドを指定してセキュリティパラメータに安全でない値を設定できなくなります。

# Amazon SageMaker Model Monitor のビルド済みコンテナ
<a name="model-monitor-pre-built-container"></a>

SageMaker AI は、`sagemaker-model-monitor-analyzer` というビルド済みイメージを提供しています。このイメージは、制約の提案、統計の生成、ベースラインと制約の比較検証、Amazon CloudWatch メトリクスの出力など、さまざまなモデルモニタリング機能を提供します。このイメージは Spark バージョン 3.3.0 に基づいており、[Deequ](https://github.com/awslabs/deequ) バージョン 2.0.2 で構築されています。

**注記**  
組込みの `sagemaker-model-monitor-analyzer` イメージを直接取得することはできません。この`sagemaker-model-monitor-analyzer`イメージは、いずれかの AWS SDKs を使用してベースライン処理ジョブまたはモニタリングジョブを送信するときに使用できます。

 SageMaker Python SDK (「[SageMaker Python SDK リファレンスガイド](https://sagemaker.readthedocs.io/en/stable/api/utility/image_uris.html)」の「`image_uris.retrieve`」を参照) を使用して ECR イメージ URI を生成するか、ECR イメージ URI を直接指定します。SageMaker Model Monitor のビルド済みイメージには、次のようにアクセスします。

`<ACCOUNT_ID>.dkr.ecr.<REGION_NAME>.amazonaws.com/sagemaker-model-monitor-analyzer`

例: `159807026194.dkr.ecr.us-west-2.amazonaws.com/sagemaker-model-monitor-analyzer`

中国の AWS リージョンにいる場合、SageMaker Model Monitor のビルド済みイメージには次のようにアクセスできます。

`<ACCOUNT_ID>.dkr.ecr.<REGION_NAME>.amazonaws.com.rproxy.govskope.us.cn/sagemaker-model-monitor-analyzer`

アカウント IDs[「Docker Registry Paths and Example Code](https://docs.aws.amazon.com/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths)」を参照してください。 AWS 

独自の分析コンテナを記述するには、「[カスタムモニタリングのスケジュール](model-monitor-custom-monitoring-schedules.md)」で説明されているコンテナコントラクトを参照してください。

# 結果の解釈
<a name="model-monitor-interpreting-results"></a>

ベースライン作成ジョブを実行し、データセットの統計と制約を取得した後は、モニタリングジョブを実行して統計を計算し、ベースライン制約に関連して発生した違反を一覧表示できます。Amazon CloudWatch メトリクスは、デフォルトではユーザーのアカウントにも報告されます。Amazon SageMaker Studio でモニタリング結果を表示する方法については、「[Amazon SageMaker Studio でリアルタイムエンドポイントの結果を視覚化する](model-monitor-interpreting-visualize-results.md)」を参照してください。

## 実行を一覧表示する
<a name="model-monitor-interpreting-results-list-executions"></a>

スケジュールは、指定された間隔でジョブのモニタリングを開始します。次のコードは、 最新の 5 つの実行を一覧表示します。時間単位のスケジュールを作成した後にこのコードを実行している場合、実行は空である可能性があり、実行の開始を確認するために時間境界 (UTC) を越えるまで待たなければならないことがあります。次のコードには、待機のためのロジックが含まれています。

```
mon_executions = my_default_monitor.list_executions()
print("We created a hourly schedule above and it will kick off executions ON the hour (plus 0 - 20 min buffer.\nWe will have to wait till we hit the hour...")

while len(mon_executions) == 0:
    print("Waiting for the 1st execution to happen...")
    time.sleep(60)
    mon_executions = my_default_monitor.list_executions()
```

## 特定の実行を確認する
<a name="model-monitor-interpreting-results-inspect-specific-execution"></a>

 

前のステップで、最後に完了したスケジュール実行または失敗したスケジュール実行を選択しました。何がうまくいったか、うまくいかなかったかを調べることができます。ターミナルの状態は次のとおりです。
+ `Completed` - モニタリングの実行が完了し、違反レポートに問題は見つかりませんでした。
+ `CompletedWithViolations` - 実行は完了しましたが、制約違反が検出されました。
+ `Failed` - モニタリングの実行に失敗しました。クライアントエラー (ロールの問題など) やインフラストラクチャの問題が原因である可能性があります。原因を特定するには、`FailureReason` および `ExitMessage` を確認してください。

```
latest_execution = mon_executions[-1] # latest execution's index is -1, previous is -2 and so on..
time.sleep(60)
latest_execution.wait(logs=False)

print("Latest execution status: {}".format(latest_execution.describe()['ProcessingJobStatus']))
print("Latest execution result: {}".format(latest_execution.describe()['ExitMessage']))

latest_job = latest_execution.describe()
if (latest_job['ProcessingJobStatus'] != 'Completed'):
        print("====STOP==== \n No completed executions to inspect further. Please wait till an execution completes or investigate previously reported failures.")
```

```
report_uri=latest_execution.output.destination
print('Report Uri: {}'.format(report_uri))
```

## 生成されたレポートを一覧表示する
<a name="model-monitor-interpreting-results-list-generated-reports"></a>

次のコードを使用して、生成されたレポートを一覧表示します。

```
from urllib.parse import urlparse
s3uri = urlparse(report_uri)
report_bucket = s3uri.netloc
report_key = s3uri.path.lstrip('/')
print('Report bucket: {}'.format(report_bucket))
print('Report key: {}'.format(report_key))

s3_client = boto3.Session().client('s3')
result = s3_client.list_objects(Bucket=report_bucket, Prefix=report_key)
report_files = [report_file.get("Key") for report_file in result.get('Contents')]
print("Found Report Files:")
print("\n ".join(report_files))
```

## 違反レポート
<a name="model-monitor-interpreting-results-violations-report"></a>

ベースラインと比較して、違反がある場合はこれらの違反を含む違反レポートが生成されます。次のコードを使用して、違反を一覧表示します。

```
violations = my_default_monitor.latest_monitoring_constraint_violations()
pd.set_option('display.max_colwidth', -1)
constraints_df = pd.io.json.json_normalize(violations.body_dict["violations"])
constraints_df.head(10)
```

これは、表形式データを含むデータセットにのみ適用されます。次のスキーマファイルは、計算される統計と監視される違反を指定します。

表形式データセットの出力ファイル


| ファイル名 | 説明 | 
| --- | --- | 
| statistics.json |  分析されるデータセット内の各フィーチャの列指向統計を含みます。このファイルのスキーマについては、次のトピックを参照してください。  このファイルは、データ品質モニタリングでのみ作成されます。   | 
| constraint\$1violations.json |  `baseline_constaints` および `baseline_statistics` パスで指定されたベースライン統計および制約ファイルと比較した、この現在のデータセットで検出された違反のリストを含みます。  | 

デフォルトで、[Amazon SageMaker Model Monitor のビルド済みコンテナ](model-monitor-pre-built-container.md) は各特徴の Amazon CloudWatch メトリクスのセットを保存します。

コンテナコードは `/opt/ml/output/metrics/cloudwatch` に CloudWatch メトリクスを出力できます。

# Amazon SageMaker Studio でリアルタイムエンドポイントの結果を視覚化する
<a name="model-monitor-interpreting-visualize-results"></a>

リアルタイムエンドポイントをモニタリングしている場合は、Amazon SageMaker Studio で結果を視覚化することもできます。モニタリングジョブ実行の詳細を表示し、モニタリングジョブが計算するメトリクスに対するベースラインおよびキャプチャされた値を表示するグラフを作成できます。

**モニタリングジョブの詳細な結果を表示するには**

1. Studio にサインインします。詳細については、「[Amazon SageMaker AI ドメインの概要](gs-studio-onboard.md)」を参照してください。

1. 左側のナビゲーションペインで、**[コンポーネントとレジストリ]** アイコン (![\[Orange paper airplane icon representing email or message sending functionality.\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/icons/Components_registries.png)) をクリックします。

1. **[Endpoints]** (エンドポイント) ドロップダウンメニューを選択します。  
![\[コンソールの [エンドポイント] ドロップダウンメニューの場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-endpoints.png)

1. [Endpoint] (エンドポイント) タブで、ジョブの詳細を表示するモニタリングタイプを選択します。  
![\[[モデルモニタリング] セクションの [モデルの質] タブの場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-model-quality.png)

1. モニタリングジョブのリストから、詳細を表示するモニタリングジョブ実行の名前を選択します。  
![\[[モデルモニタリング] セクションの [モデルの質] タブ\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-job-history.png)

1. **[MONITORING JOB DETAILS]** (モニタリングジョブの詳細) タブが開き、モニタリングジョブの詳細レポートが表示されます。  
![\[[ジョブの詳細モニタリング] タブ\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-job-details.png)

ある期間のベースラインメトリクスとキャプチャされたメトリクスを表示するグラフを作成できます。

**SageMaker Studio でグラフを作成してモニタリング結果を視覚化するには**

1. Studio にサインインします。詳細については、「[Amazon SageMaker AI ドメインの概要](gs-studio-onboard.md)」を参照してください。

1. 左側のナビゲーションペインで、**[コンポーネントとレジストリ]** アイコン (![\[Orange paper airplane icon representing email or message sending functionality.\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/icons/Components_registries.png)) をクリックします。

1. **[Endpoints]** (エンドポイント) ドロップダウンメニューを選択します。  
![\[コンソールの [エンドポイント] ドロップダウンメニューの場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-endpoints.png)

1. **[Endpoint]** (エンドポイント) タブで、グラフを作成するモニタリングタイプを選択します。この例では、**[Model Quality]** (モデル品質) モニタリングタイプのグラフを表示しています。  
![\[[モデルモニタリング] セクションの [モデルの質] タブの場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-model-quality.png)

1. **[Area chart]** (グラフを追加) を選択します。  
![\[コンソールの [チャートを追加] の場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-add-chart.png)

1. **[CHART PROPERTIES]** (グラフのプロパティ) タブで、グラフ化する期間、統計、およびメトリクスを選択します。次の例では、**[1 week]** (1 週間) の **[Timeline]** (タイムライン) で、**[Metric]** (メトリクス) **[f1]** の **[Statistic]** (統計) の **[Average]** (平均) がグラフで表示されています。  
![\[コンソールでメトリクスを選択する場所\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-chart-properties.png)

1. 前のステップで選択したベースラインと現在のメトリクス統計を示すグラフが、**[Endpoint]** (エンドポイント) タブに表示されます。  
![\[前のステップで選択したベースラインと現在の平均メトリクスを示すグラフの例\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model_monitor/mm-studio-f1-chart.png)

# 高度なトピック
<a name="model-monitor-advanced-topics"></a>

以下のセクションでは、前処理スクリプトと後処理スクリプトを使用してモニタリングをカスタマイズする方法、独自のコンテナを構築する方法、および CloudFormation を使用してモニタリングスケジュールを作成する方法について説明します。

**Topics**
+ [カスタムモニタリングのスケジュール](model-monitor-custom-monitoring-schedules.md)
+ [CloudFormation カスタムリソースを使用してリアルタイムエンドポイントのモニタリングスケジュールを作成する](model-monitor-cloudformation-monitoring-schedules.md)

# カスタムモニタリングのスケジュール
<a name="model-monitor-custom-monitoring-schedules"></a>

組み込みのモニタリングメカニズムを使用するだけでなく、前処理スクリプトと後処理スクリプトを使用するか、独自のコンテナを使用または構築して、独自のカスタムモニタリングスケジュールとプロシージャを作成できます。

**Topics**
+ [前処理と後処理](model-monitor-pre-and-post-processing.md)
+ [Amazon SageMaker Model Monitor を使用した独自のコンテナのサポート](model-monitor-byoc-containers.md)

# 前処理と後処理
<a name="model-monitor-pre-and-post-processing"></a>

カスタムの前処理と後処理の Python スクリプトを使用して、入力をモデルモニターに変換したり、モニタリングが正常に実行された後にコードを拡張したりできます。これらのスクリプトを Amazon S3 にアップロードし、モデルモニターを作成するときに参照します。

次の例は、前処理スクリプトと後処理スクリプトでモニタリングスケジュールをカスタマイズする方法を示しています。*ユーザープレースホルダーテキスト*を自分の情報に置き換えます。

```
import boto3, os
from sagemaker import get_execution_role, Session
from sagemaker.model_monitor import CronExpressionGenerator, DefaultModelMonitor

# Upload pre and postprocessor scripts
session = Session()
bucket = boto3.Session().resource("s3").Bucket(session.default_bucket())
prefix = "demo-sagemaker-model-monitor"
pre_processor_script = bucket.Object(os.path.join(prefix, "preprocessor.py")).upload_file("preprocessor.py")
post_processor_script = bucket.Object(os.path.join(prefix, "postprocessor.py")).upload_file("postprocessor.py")

# Get execution role
role = get_execution_role() # can be an empty string

# Instance type
instance_type = "instance-type"
# instance_type = "ml.m5.xlarge" # Example

# Create a monitoring schedule with pre and postprocessing
my_default_monitor = DefaultModelMonitor(
    role=role,
    instance_count=1,
    instance_type=instance_type,
    volume_size_in_gb=20,
    max_runtime_in_seconds=3600,
)

s3_report_path = "s3://{}/{}".format(bucket, "reports")
monitor_schedule_name = "monitor-schedule-name"
endpoint_name = "endpoint-name"
my_default_monitor.create_monitoring_schedule(
    post_analytics_processor_script=post_processor_script,
    record_preprocessor_script=pre_processor_script,
    monitor_schedule_name=monitor_schedule_name,
    # use endpoint_input for real-time endpoint
    endpoint_input=endpoint_name,
    # or use batch_transform_input for batch transform jobs
    # batch_transform_input=batch_transform_name,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

**Topics**
+ [前処理スクリプト](#model-monitor-pre-processing-script)
+ [カスタムサンプリング](#model-monitor-pre-processing-custom-sampling)
+ [後処理スクリプト](#model-monitor-post-processing-script)

## 前処理スクリプト
<a name="model-monitor-pre-processing-script"></a>

モデルモニターへの入力を変換する必要がある場合は、前処理スクリプトを使用します。

例えば、モデルの出力が配列 `[1.0, 2.1]` だとします。Amazon SageMaker Model Monitor コンテナは、表形式または `{“prediction0”: 1.0, “prediction1” : 2.1}` のようにフラット化された JSON 構造でのみ動作します。次のような前処理スクリプトを使用して、配列を正しい JSON 構造に変換することもできます。

```
def preprocess_handler(inference_record):
    input_data = inference_record.endpoint_input.data
    output_data = inference_record.endpoint_output.data.rstrip("\n")
    data = output_data + "," + input_data
    return { str(i).zfill(20) : d for i, d in enumerate(data.split(",")) }
```

別の例として、モデルにオプション機能があり、そのオプション機能に欠測値があることを示すために `-1` を使用するとします。データ品質モニターを使用している場合は、モニターのメトリクス計算に含まれないように、入力値の配列から `-1` を削除したほうがよい場合があります。次のようなスクリプトを使用して、これらの値を削除できます。

```
def preprocess_handler(inference_record):
    input_data = inference_record.endpoint_input.data
    return {i : None if x == -1 else x for i, x in enumerate(input_data.split(","))}
```

前処理スクリプトは `inference_record` を唯一の入力として受け取ります。次のコード スニペットは `inference_record` の例を示しています。

```
{
  "captureData": {
    "endpointInput": {
      "observedContentType": "text/csv",
      "mode": "INPUT",
      "data": "132,25,113.2,96,269.9,107,,0,0,0,0,0,0,1,0,1,0,0,1",
      "encoding": "CSV"
    },
    "endpointOutput": {
      "observedContentType": "text/csv; charset=utf-8",
      "mode": "OUTPUT",
      "data": "0.01076381653547287",
      "encoding": "CSV"
    }
  },
  "eventMetadata": {
    "eventId": "feca1ab1-8025-47e3-8f6a-99e3fdd7b8d9",
    "inferenceTime": "2019-11-20T23:33:12Z"
  },
  "eventVersion": "0"
}
```

次のコードスニペットは `inference_record` の完全なクラス構造を示しています。

```
KEY_EVENT_METADATA = "eventMetadata"
KEY_EVENT_METADATA_EVENT_ID = "eventId"
KEY_EVENT_METADATA_EVENT_TIME = "inferenceTime"
KEY_EVENT_METADATA_CUSTOM_ATTR = "customAttributes"

KEY_EVENTDATA_ENCODING = "encoding"
KEY_EVENTDATA_DATA = "data"

KEY_GROUND_TRUTH_DATA = "groundTruthData"

KEY_EVENTDATA = "captureData"
KEY_EVENTDATA_ENDPOINT_INPUT = "endpointInput"
KEY_EVENTDATA_ENDPOINT_OUTPUT = "endpointOutput"

KEY_EVENTDATA_BATCH_OUTPUT = "batchTransformOutput"
KEY_EVENTDATA_OBSERVED_CONTENT_TYPE = "observedContentType"
KEY_EVENTDATA_MODE = "mode"

KEY_EVENT_VERSION = "eventVersion"

class EventConfig:
    def __init__(self, endpoint, variant, start_time, end_time):
        self.endpoint = endpoint
        self.variant = variant
        self.start_time = start_time
        self.end_time = end_time


class EventMetadata:
    def __init__(self, event_metadata_dict):
        self.event_id = event_metadata_dict.get(KEY_EVENT_METADATA_EVENT_ID, None)
        self.event_time = event_metadata_dict.get(KEY_EVENT_METADATA_EVENT_TIME, None)
        self.custom_attribute = event_metadata_dict.get(KEY_EVENT_METADATA_CUSTOM_ATTR, None)


class EventData:
    def __init__(self, data_dict):
        self.encoding = data_dict.get(KEY_EVENTDATA_ENCODING, None)
        self.data = data_dict.get(KEY_EVENTDATA_DATA, None)
        self.observedContentType = data_dict.get(KEY_EVENTDATA_OBSERVED_CONTENT_TYPE, None)
        self.mode = data_dict.get(KEY_EVENTDATA_MODE, None)

    def as_dict(self):
        ret = {
            KEY_EVENTDATA_ENCODING: self.encoding,
            KEY_EVENTDATA_DATA: self.data,
            KEY_EVENTDATA_OBSERVED_CONTENT_TYPE: self.observedContentType,
        }
        return ret


class CapturedData:
    def __init__(self, event_dict):
        self.event_metadata = None
        self.endpoint_input = None
        self.endpoint_output = None
        self.batch_transform_output = None
        self.ground_truth = None
        self.event_version = None
        self.event_dict = event_dict
        self._event_dict_postprocessed = False
        
        if KEY_EVENT_METADATA in event_dict:
            self.event_metadata = EventMetadata(event_dict[KEY_EVENT_METADATA])
        if KEY_EVENTDATA in event_dict:
            if KEY_EVENTDATA_ENDPOINT_INPUT in event_dict[KEY_EVENTDATA]:
                self.endpoint_input = EventData(event_dict[KEY_EVENTDATA][KEY_EVENTDATA_ENDPOINT_INPUT])
            if KEY_EVENTDATA_ENDPOINT_OUTPUT in event_dict[KEY_EVENTDATA]:
                self.endpoint_output = EventData(event_dict[KEY_EVENTDATA][KEY_EVENTDATA_ENDPOINT_OUTPUT])
            if KEY_EVENTDATA_BATCH_OUTPUT in event_dict[KEY_EVENTDATA]:
                self.batch_transform_output = EventData(event_dict[KEY_EVENTDATA][KEY_EVENTDATA_BATCH_OUTPUT])

        if KEY_GROUND_TRUTH_DATA in event_dict:
            self.ground_truth = EventData(event_dict[KEY_GROUND_TRUTH_DATA])
        if KEY_EVENT_VERSION in event_dict:
            self.event_version = event_dict[KEY_EVENT_VERSION]

    def as_dict(self):
        if self._event_dict_postprocessed is True:
            return self.event_dict
        if KEY_EVENTDATA in self.event_dict:
            if KEY_EVENTDATA_ENDPOINT_INPUT in self.event_dict[KEY_EVENTDATA]:
                self.event_dict[KEY_EVENTDATA][KEY_EVENTDATA_ENDPOINT_INPUT] = self.endpoint_input.as_dict()
            if KEY_EVENTDATA_ENDPOINT_OUTPUT in self.event_dict[KEY_EVENTDATA]:
                self.event_dict[KEY_EVENTDATA][
                    KEY_EVENTDATA_ENDPOINT_OUTPUT
                ] = self.endpoint_output.as_dict()
            if KEY_EVENTDATA_BATCH_OUTPUT in self.event_dict[KEY_EVENTDATA]:
                self.event_dict[KEY_EVENTDATA][KEY_EVENTDATA_BATCH_OUTPUT] = self.batch_transform_output.as_dict()
        
        self._event_dict_postprocessed = True
        return self.event_dict

    def __str__(self):
        return str(self.as_dict())
```

## カスタムサンプリング
<a name="model-monitor-pre-processing-custom-sampling"></a>

前処理スクリプトにカスタムサンプリング戦略を適用することもできます。そのためには、Model Monitor のファーストパーティのビルド済みコンテナを設定して、指定したサンプリングレートに従って一部のレコードを無視するようにします。次の例では、ハンドラーはハンドラー呼び出しの 10% のレコードを返し、それ以外の場合は空のリストを返すことで、レコードの 10% をサンプリングします。

```
import random

def preprocess_handler(inference_record):
    # we set up a sampling rate of 0.1
    if random.random() > 0.1:
        # return an empty list
        return []
    input_data = inference_record.endpoint_input.data
    return {i : None if x == -1 else x for i, x in enumerate(input_data.split(","))}
```

### 前処理スクリプト用のカスタムロギング
<a name="model-monitor-pre-processing-custom-logging"></a>

 前処理スクリプトがエラーを返す場合は、CloudWatch に記録された例外メッセージを確認してデバッグします。`preprocess_handler` インターフェイスを通じて CloudWatch のロガーにアクセスできます。スクリプトから必要な情報をすべて CloudWatch に記録できます。これは前処理スクリプトをデバッグするときに役立ちます。次の例は、`preprocess_handler` インターフェイスを使用して CloudWatch にログを記録する方法を示しています。

```
def preprocess_handler(inference_record, logger):
    logger.info(f"I'm a processing record: {inference_record}")
    logger.debug(f"I'm debugging a processing record: {inference_record}")
    logger.warning(f"I'm processing record with missing value: {inference_record}")
    logger.error(f"I'm a processing record with bad value: {inference_record}")
    return inference_record
```

## 後処理スクリプト
<a name="model-monitor-post-processing-script"></a>

モニタリングが正常に実行された後にコードを拡張したい場合は、後処理スクリプトを使用します。

```
def postprocess_handler():
    print("Hello from post-proc script!")
```

# Amazon SageMaker Model Monitor を使用した独自のコンテナのサポート
<a name="model-monitor-byoc-containers"></a>

Amazon SageMaker Model Monitor には、エンドポイントまたはバッチ変換ジョブからキャプチャした表形式のデータセットのデータを分析する機能を備えた、ビルド済みコンテナが用意されています。独自のコンテナを持ち込む場合は、Model Monitor が提供する拡張ポイントを活用できます。

内部的には、`MonitoringSchedule` を作成すると、Model Monitor が処理ジョブを最終的に開始します。したがってコンテナは、「[独自の処理コンテナを構築する方法 (高度なシナリオ)](build-your-own-processing-container.md)」トピックに記載されている処理ジョブのコントラクトを認識する必要があります。Model Monitor はスケジュールに従って自動的に処理ジョブを開始することに注意してください。呼び出し中に、Model Monitor は追加の環境変数を設定し、スケジュールされた特定のモニタリング実行のデータ処理に十分なコンテキストがコンテナに含まれるようにします。コンテナ入力の詳細については、「[コンテナコントラクトの入力](model-monitor-byoc-contract-inputs.md)」を参照してください。

コンテナで、上記の環境変数/コンテキストを使用して、カスタムコード内の現在の期間のデータセットを分析できるようになりました。この分析が完了したら、出力されたレポートを S3 バケットにアップロードすることを選択できます。ビルド済みコンテナが生成するレポートについては、「[コンテナコントラクトの出力](model-monitor-byoc-contract-outputs.md)」を参照してください。SageMaker Studio でレポートを視覚化するには、同様の形式に従う必要があります。また、完全カスタムレポートの出力を選択することもできます。

「[独自のコンテナを取り込む場合の CloudWatch メトリクス](model-monitor-byoc-cloudwatch.md)」の手順に従って、コンテナから CloudWatch メトリクスを出力することもできます。

**Topics**
+ [コンテナコントラクトの入力](model-monitor-byoc-contract-inputs.md)
+ [コンテナコントラクトの出力](model-monitor-byoc-contract-outputs.md)
+ [独自のコンテナを取り込む場合の CloudWatch メトリクス](model-monitor-byoc-cloudwatch.md)

# コンテナコントラクトの入力
<a name="model-monitor-byoc-contract-inputs"></a>

Amazon SageMaker Model Monitor プラットフォームは、指定されたスケジュールに従ってコンテナコードを呼び出します。独自のコンテナコードを記述する場合は、次の環境変数を使用できます。このコンテキストでは、現在のデータセットを分析することができます。また、メトリクスを選択して出力する場合は、制約を評価できます (該当する場合)。

使用可能な環境変数は、`dataset_format` 変数を除いてリアルタイムエンドポイントでもバッチ変換ジョブでも同じです。リアルタイムエンドポイントを使用している場合、`dataset_format` 変数は以下のオプションをサポートします。

```
{\"sagemakerCaptureJson\": {\"captureIndexNames\": [\"endpointInput\",\"endpointOutput\"]}}
```

バッチ変換ジョブを使用している場合、`dataset_format` は次のオプションをサポートします。

```
{\"csv\": {\"header\": [\"true\",\"false\"]}}
```

```
{\"json\": {\"line\": [\"true\",\"false\"]}}
```

```
{\"parquet\": {}}
```

以下のコードサンプルは、コンテナコードで使用できる環境変数一式を示しています (リアルタイムエンドポイントの `dataset_format` 形式も使用しています)。

```
"Environment": {
 "dataset_format": "{\"sagemakerCaptureJson\": {\"captureIndexNames\": [\"endpointInput\",\"endpointOutput\"]}}",
 "dataset_source": "/opt/ml/processing/endpointdata",
 "end_time": "2019-12-01T16: 20: 00Z",
 "output_path": "/opt/ml/processing/resultdata",
 "publish_cloudwatch_metrics": "Disabled",
 "sagemaker_endpoint_name": "endpoint-name",
 "sagemaker_monitoring_schedule_name": "schedule-name",
 "start_time": "2019-12-01T15: 20: 00Z"
}
```

パラメータ 


| Parameter Name | 説明 | 
| --- | --- | 
| dataset\$1format |  `Endpoint` によって支援された `MonitoringSchedule` から開始されたジョブでは、これは `endpointInput`、`endpointOutput`、またはその両方のキャプチャインデックスを持つ `sageMakerCaptureJson` になります。バッチ変換ジョブの場合、CSV、JSON、Parquet のいずれかのデータ形式を指定します。  | 
| dataset\$1source |  リアルタイム エンドポイントを使用している場合、`start_time` と `end_time` で指定されたモニタリング期間に対応するデータが使用可能なローカルパス。このパスでは、データは ` /{endpoint-name}/{variant-name}/yyyy/mm/dd/hh` で使用できます。 開始時刻と終了時刻で指定されているものよりも多くのデータをダウンロードする場合があります。必要に応じてデータを解析するかどうかはコンテナコード次第です。  | 
| output\$1path |  出力レポートおよびその他のファイルを書き込むためのローカルパス。`CreateMonitoringSchedule` リクエストでこのパラメータを `MonitoringOutputConfig.MonitoringOutput[0].LocalPath` として指定します。これは、`MonitoringOutputConfig.MonitoringOutput[0].S3Uri` に指定された `S3Uri` パスにアップロードされます。  | 
| publish\$1cloudwatch\$1metrics |  `CreateMonitoringSchedule` によって起動されたジョブでは、このパラメータは `Enabled` に設定されます。コンテナは、`[filepath]` に Amazon CloudWatch 出力ファイルを書き込むことを選択できます。  | 
| sagemaker\$1endpoint\$1name |  リアルタイムエンドポイントを使用している場合は、このスケジュール済みジョブが起動された `Endpoint` の名前です。  | 
| sagemaker\$1monitoring\$1schedule\$1name |  このジョブを起動した `MonitoringSchedule` の名前。  | 
| \$1sagemaker\$1endpoint\$1datacapture\$1prefix\$1 |  リアルタイムエンドポイントを使用している場合は、`Endpoint` の `DataCaptureConfig` パラメータで指定されたプレフィックス。コンテナは、SageMaker AI が `dataset_source` パスに既にダウンロードしたデータ以外のデータに直接アクセスする必要がある場合に、これを使用できます。  | 
| start\$1time, end\$1time |  この分析の実行期間。たとえば、2020 年 2 月 20 日の 05:00 UTC に実行するようにスケジュールされたジョブの場合、`start_time`: は 2020-02-19T06:00:00Z、`end_time`: は 202020-02-20T 05:00:00 Z になります。  | 
| baseline\$1constraints: |  ` BaselineConfig.ConstraintResource.S3Uri` で指定されているベースライン制約ファイルのローカルパス。これは、このパラメータが `CreateMonitoringSchedule` リクエストで指定された場合にのみ使用できます。  | 
| baseline\$1statistics |  `BaselineConfig.StatisticsResource.S3Uri` で指定したベースライン統計ファイルへのローカルパス。これは、このパラメータが `CreateMonitoringSchedule` リクエストで指定された場合にのみ使用できます。  | 

# コンテナコントラクトの出力
<a name="model-monitor-byoc-contract-outputs"></a>

コンテナは、`*dataset_source*` パスで使用可能なデータを分析し、`*output_path*.` 内のパスにレポートを書き込むことができます。コンテナコードは、ニーズに合った任意のレポートを書くことができます。

次の構造と契約を使用すると、特定の出力ファイルは可視化と API で SageMaker AI によって特別に処理されます。これは、表形式のデータセットにのみ適用されます。

表形式データセットの出力ファイル


| ファイル名 | 説明 | 
| --- | --- | 
| statistics.json |  このファイルには、分析対象のデータセット内の各フィーチャに対する列状の統計が含まれます。このファイルのスキーマは次のセクションで確認できます。  | 
| constraints.json |  このファイルには、確認されたフィーチャの制約が含まれます。このファイルのスキーマは次のセクションで確認できます。  | 
| constraints\$1violations.json |  このファイルには、`baseline_constaints` および `baseline_statistics` パスで指定されたベースライン統計および制約ファイルと比較して、この現在のデータセットで検出された違反のリストが含まれています。  | 

さらに、`publish_cloudwatch_metrics` 値が `"Enabled"` である場合、コンテナコードは `/opt/ml/output/metrics/cloudwatch` に Amazon CloudWatch メトリクスを出力できます。これらのファイルのスキーマについては、続くセクションで説明します。

**Topics**
+ [統計のスキーマ (statistics.json ファイル)](model-monitor-byoc-statistics.md)
+ [制約のスキーマ (constraints.json ファイル)](model-monitor-byoc-constraints.md)

# 統計のスキーマ (statistics.json ファイル)
<a name="model-monitor-byoc-statistics"></a>

`statistics.json` ファイルに定義されているスキーマは、ベースラインに対して計算される統計パラメータと、取得されるデータを指定します。また、[KLL](https://datasketches.apache.org/docs/KLL/KLLSketch.html) が使用するバケットを設定します。KLL は、遅延圧縮スキームを持つ非常にコンパクトな分位数スケッチです。

```
{
    "version": 0,
    # dataset level stats
    "dataset": {
        "item_count": number
    },
    # feature level stats
    "features": [
        {
            "name": "feature-name",
            "inferred_type": "Fractional" | "Integral",
            "numerical_statistics": {
                "common": {
                    "num_present": number,
                    "num_missing": number
                },
                "mean": number,
                "sum": number,
                "std_dev": number,
                "min": number,
                "max": number,
                "distribution": {
                    "kll": {
                        "buckets": [
                            {
                                "lower_bound": number,
                                "upper_bound": number,
                                "count": number
                            }
                        ],
                        "sketch": {
                            "parameters": {
                                "c": number,
                                "k": number
                            },
                            "data": [
                                [
                                    num,
                                    num,
                                    num,
                                    num
                                ],
                                [
                                    num,
                                    num
                                ][
                                    num,
                                    num
                                ]
                            ]
                        }#sketch
                    }#KLL
                }#distribution
            }#num_stats
        },
        {
            "name": "feature-name",
            "inferred_type": "String",
            "string_statistics": {
                "common": {
                    "num_present": number,
                    "num_missing": number
                },
                "distinct_count": number,
                "distribution": {
                    "categorical": {
                         "buckets": [
                                {
                                    "value": "string",
                                    "count": number
                                }
                          ]
                     }
                }
            },
            #provision for custom stats
        }
    ]
}
```

**注意事項**  
後の可視化の変更において、SageMaker AI はこの指定されたメトリクスを認識します。必要に応じて、コンテナはより多くのメトリクスを出力できます。
[KLL スケッチ](https://datasketches.apache.org/docs/KLL/KLLSketch.html)は、認識されるスケッチです。カスタムコンテナは独自の表現を記述できますが、可視化では、SageMaker AI はそのコンテナを認識できません。
デフォルトでは、ディストリビューションは 10 個のバケットでマテリアライズされます。これを変更することはできません。

# 制約のスキーマ (constraints.json ファイル)
<a name="model-monitor-byoc-constraints"></a>

constraints.json ファイルは、データセットが満たす必要がある制約を示すために使用されます。また、Amazon SageMaker Model Monitor コンテナは constraints.json ファイルを使用して、データセットを評価できます。ビルド済みコンテナは、ベースラインデータセットの constraints.json ファイルを自動的に生成する機能を提供します。独自のコンテナを持ち込む場合は、同様の機能を提供することも、他の方法で constraints.json ファイルを作成することもできます。以下は、ビルド済みコンテナが使用する制約ファイルのスキーマです。独自のコンテナを取り込む場合、同じ形式を採用するか、必要に応じてその機能を拡張できます。

```
{
    "version": 0,
    "features":
    [
        {
            "name": "string",
            "inferred_type": "Integral" | "Fractional" | 
                    | "String" | "Unknown",
            "completeness": number,
            "num_constraints":
            {
                "is_non_negative": boolean
            },
            "string_constraints":
            {
                "domains":
                [
                    "list of",
                    "observed values",
                    "for small cardinality"
                ]
            },
            "monitoringConfigOverrides":
            {}
        }
    ],
    "monitoring_config":
    {
        "evaluate_constraints": "Enabled",
        "emit_metrics": "Enabled",
        "datatype_check_threshold": 0.1,
        "domain_content_threshold": 0.1,
        "distribution_constraints":
        {
            "perform_comparison": "Enabled",
            "comparison_threshold": 0.1,
            "comparison_method": "Simple"||"Robust",
            "categorical_comparison_threshold": 0.1,
            "categorical_drift_method": "LInfinity"||"ChiSquared"
        }
    }
}
```

`monitoring_config` オブジェクトには、機能のモニタリングジョブのオプションが含まれています。次の表で各オプションについて説明します。

制約のモニタリング

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-monitor-byoc-constraints.html)

# 独自のコンテナを取り込む場合の CloudWatch メトリクス
<a name="model-monitor-byoc-cloudwatch"></a>

`/opt/ml/processing/processingjobconfig.json` ファイル内の `Environment` マップで `publish_cloudwatch_metrics` 値が `Enabled` である場合、コンテナコードは `/opt/ml/output/metrics/cloudwatch` に Amazon CloudWatch メトリクスを出力します。

このファイルのスキーマは、CloudWatch `PutMetrics` API に厳密に基づいています。名前空間はここでは指定されていません。デフォルトでは以下のようになります。
+ `For real-time endpoints: /aws/sagemaker/Endpoint/data-metrics`
+ `For batch transform jobs: /aws/sagemaker/ModelMonitoring/data-metrics`

ただし、ディメンションを指定することはできます。少なくとも次のディメンションを追加することをお勧めします。
+ リアルタイムエンドポイントの `Endpoint` と `MonitoringSchedule`
+ バッチ変換ジョブの `MonitoringSchedule`

次の JSON スニペットは、ディメンションの設定方法を示しています。

リアルタイムエンドポイントについては、`Endpoint` と `MonitoringSchedule` のディメンションを含む次の JSON スニペットを参照してください。

```
{ 
    "MetricName": "", # Required
    "Timestamp": "2019-11-26T03:00:00Z", # Required
    "Dimensions" : [{"Name":"Endpoint","Value":"endpoint_0"},{"Name":"MonitoringSchedule","Value":"schedule_0"}]
    "Value": Float,
    # Either the Value or the StatisticValues field can be populated and not both.
    "StatisticValues": {
        "SampleCount": Float,
        "Sum": Float,
        "Minimum": Float,
        "Maximum": Float
    },
    "Unit": "Count", # Optional
}
```

バッチ変換ジョブについては、`MonitoringSchedule` のディメンションを含む次の JSON スニペットを参照してください。

```
{ 
    "MetricName": "", # Required
    "Timestamp": "2019-11-26T03:00:00Z", # Required
    "Dimensions" : [{"Name":"MonitoringSchedule","Value":"schedule_0"}]
    "Value": Float,
    # Either the Value or the StatisticValues field can be populated and not both.
    "StatisticValues": {
        "SampleCount": Float,
        "Sum": Float,
        "Minimum": Float,
        "Maximum": Float
    },
    "Unit": "Count", # Optional
}
```

# CloudFormation カスタムリソースを使用してリアルタイムエンドポイントのモニタリングスケジュールを作成する
<a name="model-monitor-cloudformation-monitoring-schedules"></a>

リアルタイムエンドポイントを使用している場合は、 CloudFormation カスタムリソースを使用してモニタリングスケジュールを作成できます。カスタムリソースは Python に含まれています。デプロイするには、「[Python の Lambda デプロイ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html)」を参照してください。

## カスタムリソース
<a name="model-monitor-cloudformation-custom-resource"></a>

まず、 CloudFormation テンプレートにカスタムリソースを追加します。これは、次のステップで作成する AWS Lambda 関数を指定します。

このリソースを使用すると、モニタリングスケジュールのパラメータをカスタマイズできます。次のサンプル CloudFormation リソースでリソースと Lambda 関数を変更することで、パラメータを追加または削除できます。

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MonitoringSchedule": {
            "Type": "Custom::MonitoringSchedule",
            "Version": "1.0",
            "Properties": {
                "ServiceToken": "arn:aws:lambda:us-west-2:111111111111:function:lambda-name",
                "ScheduleName": "YourScheduleName",
                "EndpointName": "YourEndpointName",
                "BaselineConstraintsUri": "s3://your-baseline-constraints/constraints.json",
                "BaselineStatisticsUri": "s3://your-baseline-stats/statistics.json",
                "PostAnalyticsProcessorSourceUri": "s3://your-post-processor/postprocessor.py",
                "RecordPreprocessorSourceUri": "s3://your-preprocessor/preprocessor.py",
                "InputLocalPath": "/opt/ml/processing/endpointdata",
                "OutputLocalPath": "/opt/ml/processing/localpath",
                "OutputS3URI": "s3://your-output-uri",
                "ImageURI": "111111111111.dkr.ecr.us-west-2.amazonaws.com/your-image",
                "ScheduleExpression": "cron(0 * ? * * *)",
                "PassRoleArn": "arn:aws:iam::111111111111:role/AmazonSageMaker-ExecutionRole"
            }
        }
    }
}
```

## Lambda カスタムリソースコード
<a name="model-monitor-cloudformation-lambda-custom-resource-code"></a>

この CloudFormation カスタムリソースは、 を使用して pip でインストールできる[カスタムリソースヘルパー](https://github.com/aws-cloudformation/custom-resource-helper) AWS ライブラリを使用します`pip install crhelper`。

この Lambda 関数は、スタックの作成と削除 CloudFormation 中に によって呼び出されます。この Lambda 関数は、モニタリングスケジュールの作成と削除、および前のセクションで説明したカスタムリソースに定義されているパラメータの使用を行います。

```
import boto3
import botocore
import logging

from crhelper import CfnResource
from botocore.exceptions import ClientError


logger = logging.getLogger(__name__)
sm = boto3.client('sagemaker')

# cfnhelper makes it easier to implement a CloudFormation custom resource
helper = CfnResource()

# CFN Handlers

def handler(event, context):
    helper(event, context)


@helper.create
def create_handler(event, context):
    """
    Called when CloudFormation custom resource sends the create event
    """
    create_monitoring_schedule(event)


@helper.delete
def delete_handler(event, context):
    """
    Called when CloudFormation custom resource sends the delete event
    """
    schedule_name = get_schedule_name(event)
    delete_monitoring_schedule(schedule_name)


@helper.poll_create
def poll_create(event, context):
    """
    Return true if the resource has been created and false otherwise so
    CloudFormation polls again.
    """
    schedule_name = get_schedule_name(event)
    logger.info('Polling for creation of schedule: %s', schedule_name)
    return is_schedule_ready(schedule_name)

@helper.update
def noop():
    """
    Not currently implemented but crhelper will throw an error if it isn't added
    """
    pass

# Helper Functions

def get_schedule_name(event):
    return event['ResourceProperties']['ScheduleName']

def create_monitoring_schedule(event):
    schedule_name = get_schedule_name(event)
    monitoring_schedule_config = create_monitoring_schedule_config(event)

    logger.info('Creating monitoring schedule with name: %s', schedule_name)

    sm.create_monitoring_schedule(
        MonitoringScheduleName=schedule_name,
        MonitoringScheduleConfig=monitoring_schedule_config)

def is_schedule_ready(schedule_name):
    is_ready = False

    schedule = sm.describe_monitoring_schedule(MonitoringScheduleName=schedule_name)
    status = schedule['MonitoringScheduleStatus']

    if status == 'Scheduled':
        logger.info('Monitoring schedule (%s) is ready', schedule_name)
        is_ready = True
    elif status == 'Pending':
        logger.info('Monitoring schedule (%s) still creating, waiting and polling again...', schedule_name)
    else:
        raise Exception('Monitoring schedule ({}) has unexpected status: {}'.format(schedule_name, status))

    return is_ready

def create_monitoring_schedule_config(event):
    props = event['ResourceProperties']

    return {
        "ScheduleConfig": {
            "ScheduleExpression": props["ScheduleExpression"],
        },
        "MonitoringJobDefinition": {
            "BaselineConfig": {
                "ConstraintsResource": {
                    "S3Uri": props['BaselineConstraintsUri'],
                },
                "StatisticsResource": {
                    "S3Uri": props['BaselineStatisticsUri'],
                }
            },
            "MonitoringInputs": [
                {
                    "EndpointInput": {
                        "EndpointName": props["EndpointName"],
                        "LocalPath": props["InputLocalPath"],
                    }
                }
            ],
            "MonitoringOutputConfig": {
                "MonitoringOutputs": [
                    {
                        "S3Output": {
                            "S3Uri": props["OutputS3URI"],
                            "LocalPath": props["OutputLocalPath"],
                        }
                    }
                ],
            },
            "MonitoringResources": {
                "ClusterConfig": {
                    "InstanceCount": 1,
                    "InstanceType": "ml.t3.medium",
                    "VolumeSizeInGB": 50,
                }
            },
            "MonitoringAppSpecification": {
                "ImageUri": props["ImageURI"],
                "RecordPreprocessorSourceUri": props['PostAnalyticsProcessorSourceUri'],
                "PostAnalyticsProcessorSourceUri": props['PostAnalyticsProcessorSourceUri'],
            },
            "StoppingCondition": {
                "MaxRuntimeInSeconds": 300
            },
            "RoleArn": props["PassRoleArn"],
        }
    }


def delete_monitoring_schedule(schedule_name):
    logger.info('Deleting schedule: %s', schedule_name)
    try:
        sm.delete_monitoring_schedule(MonitoringScheduleName=schedule_name)
    except ClientError as e:
        if e.response['Error']['Code'] == 'ResourceNotFound':
            logger.info('Resource not found, nothing to delete')
        else:
            logger.error('Unexpected error while trying to delete monitoring schedule')
            raise e
```

# モデルモニターのよくある質問
<a name="model-monitor-faqs"></a>

Amazon SageMaker Model Monitor の詳細については、以下のよくある質問を参照してください。

**Q: Model Monitor と SageMaker Clarify は顧客がモデルの動作をモニタリングするのにどのように役立ちますか?**

お客様は、Amazon SageMaker Model Monitor と SageMaker Clarify を通じて、[データ品質](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-data-quality.html)、[モデル品質](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality.html)、[バイアスドリフト](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-model-monitor-bias-drift.html)、[特徴量属性ドリフト](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-model-monitor-feature-attribution-drift.html)の 4 つのディメンションに沿ってモデルの動作をモニタリングできます。[Model Monitor](https://aws.amazon.com/sagemaker/model-monitor/) は、本番環境の Amazon SageMaker 機械学習モデルの品質を継続的にモニタリングします。これには、データ品質におけるドリフトのモニタリングや、精度や RMSE などのモデル品質メトリクスが含まれます。[SageMaker Clarify](https://aws.amazon.com/sagemaker/clarify/?sagemaker-data-wrangler-whats-new.sort-by=item.additionalFields.postDateTime&sagemaker-data-wrangler-whats-new.sort-order=desc) のバイアスモニタリングは、データサイエンティストや ML エンジニアがモデルの予測のバイアスや特徴量属性ドリフトをモニタリングするのに役立ちます。

**Q: Sagemaker モデルモニターを有効にすると、バックグラウンドでは何が起きますか?**

Amazon SageMaker Model Monitor はモデルモニタリングを自動化するため、モデルを手動でモニタリングしたり、追加のツールを構築したりする必要性を軽減します。プロセスを自動化するために、Model Monitor では、モデルのトレーニングに使用したデータを使ってベースライン統計と制約のセットを作成し、エンドポイントで行われる予測をモニタリングするスケジュールを設定することができます。Model Monitor は、ルールを使用してモデルのドリフトを検出し、ドリフトが発生した場合はアラートが表示されます。次の手順では、モデルモニタリングを有効にするとどうなるかを説明します。
+ **モデルモニタリングを有効にする**: リアルタイムエンドポイントでは、デプロイされた ML モデルへの受信リクエストとその結果として得られたモデル予測からのデータをエンドポイントがキャプチャできるようにする必要があります。バッチ変換ジョブでは、バッチ変換の入出力のデータキャプチャを可能にします。
+ **ベースライン処理ジョブ**: モデルのトレーニングに使用されたデータセットからベースラインを作成します。ベースラインはメトリクスを計算し、メトリクスの制約を提案します。例えば、モデルのリコールスコアが下がって 0.571 を下回ったり、精度スコアが 1.0 を下回ったりしてはいけません。モデルから得たリアルタイム予測またはバッチ予測はこの制約と比較され、制約値から外れている場合は違反として報告されます。
+ **モニタリングジョブ**: T 収集するデータ、収集する頻度、分析方法、作成するレポートを指定するモニタリングスケジュールを作成します。
+ **マージジョブ**: これは Amazon SageMaker Ground Truth を利用している場合にのみ適用されます。Model Monitor では、モデルの予測を Ground Truth ラベルと比較し、モデルの品質を測定します。これを機能させるには、エンドポイントでキャプチャされたデータを定期的にラベル付けし、Amazon S3 にアップロードする必要がありますます。

  Ground Truth ラベルを作成してアップロードした後、モニタリングジョブを作成するときにそのラベルの場所をパラメータとして含めます。

Model Monitor を使用してリアルタイムエンドポイントの代わりにバッチ変換ジョブをモニタリングする場合、エンドポイントへのリクエストを受信して予測を追跡する代わりに、Model Monitor は推論の入出力をモニタリングします。Model Monitor のスケジュールでは、処理ジョブで使用されるインスタンスの数とタイプを顧客が指定します。これらのリソースは、現在の実行状況に関係なく、スケジュールが削除されるまで確保されています。

**Q: データキャプチャとはどういうものですか? なぜ必要なのですか? また、どうすれば有効にできますか?**

モデルエンドポイントへの入力とデプロイされたモデルからの推論出力を Amazon S3 に記録するために、[データキャプチャ](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-data-capture.html)という機能を有効にできます。リアルタイムエンドポイントとバッチ変換ジョブで有効にする方法の詳細については、「[Capture data from real-time endpoint](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-data-capture-endpoint.html)」と「[ Capture data from batch transform job](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-data-capture-batch.html)」を参照してください。

**Q: データキャプチャを有効にすると、リアルタイムエンドポイントのパフォーマンスに影響しますか?**

データキャプチャは本番トラフィックに影響を与えずに非同期的に行われます。データキャプチャを有効にすると、要求ペイロードと応答ペイロードは、追加のメタデータとともに、`DataCaptureConfig` で指定した Amazon S3 の場所に保存されます。キャプチャしたデータの Amazon S3 への伝播には遅延があることに注意してください。

Amazon S3 に保存されたデータキャプチャファイルを一覧表示して、キャプチャされたデータを表示することもできます。Amazon S3 のパス形式は次のとおりです。`s3:///{endpoint-name}/{variant-name}/yyyy/mm/dd/hh/filename.jsonl`Amazon S3 データキャプチャは Model Monitor スケジュールと同じリージョンにある必要があります。また、ベースラインデータセットの列名は小文字で、区切り文字はアンダースコア (`_`) のみにする必要があります。

**Q: モデルモニタリングに Ground Truth が必要なのはなぜですか?**

Ground Truth ラベルは、Model Monitor の以下の特徴量に必要です。
+ **モデル品質モニタリング**では、モデルの予測を Ground Truth ラベルと比較し、モデルの品質を測定します。
+ **モデルバイアスモニタリング**は、予測にバイアスがないかをモニタリングします。デプロイされた ML モデルにバイアスが生じる可能性の 1 つは、トレーニングに使用されるデータが予測の生成に使用されるデータと異なる場合です。これは、トレーニングに使用されるデータが時間の経過とともに変化し (住宅ローン金利の変動など)、更新されたデータでモデルを再トレーニングしない限りモデル予測の精度が下がる場合に特に顕著になります。例えば、モデルトレーニングに使用された住宅ローン金利が実際の最新の住宅ローン金利と異なる場合、住宅価格を予測するためのモデルの出力にバイアスが生じる可能性があります。

**Q: Ground Truth をラベリングに利用している場合、モデルの品質をモニタリングするために実行できる手順を教えてください。**

モデル品質モニタリングでは、モデルの予測を Ground Truth ラベルと比較し、モデルの品質を測定します。これを機能させるには、エンドポイントでキャプチャされたデータを定期的にラベル付けし、Amazon S3 にアップロードする必要がありますます。モデルバイアスモニタリングの実行には、キャプチャの他に、Ground Truth データも必要です。実際のユースケースでは、Ground Truth データを定期的に収集し、指定された Amazon S3 の場所にアップロードする必要があります。Ground Truth ラベルとキャプチャされた予測データを照合するには、データセット内の各レコードに一意の識別子が必要です。Ground Truth データの各レコードの構造については、「[Ingest Ground Truth Labels and Merge Them With Predictions](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-merge.html)」を参照してください。

次のコード例は、表形式データセットの人工的な Ground Truth データを生成するために使用できます。

```
import random

def ground_truth_with_id(inference_id):
    random.seed(inference_id)  # to get consistent results
    rand = random.random()
    # format required by the merge container
    return {
        "groundTruthData": {
            "data": "1" if rand < 0.7 else "0",  # randomly generate positive labels 70% of the time
            "encoding": "CSV",
        },
        "eventMetadata": {
            "eventId": str(inference_id),
        },
        "eventVersion": "0",
    }


def upload_ground_truth(upload_time):
    records = [ground_truth_with_id(i) for i in range(test_dataset_size)]
    fake_records = [json.dumps(r) for r in records]
    data_to_upload = "\n".join(fake_records)
    target_s3_uri = f"{ground_truth_upload_path}/{upload_time:%Y/%m/%d/%H/%M%S}.jsonl"
    print(f"Uploading {len(fake_records)} records to", target_s3_uri)
    S3Uploader.upload_string_as_file_body(data_to_upload, target_s3_uri)
# Generate data for the last hour
upload_ground_truth(datetime.utcnow() - timedelta(hours=1))
# Generate data once a hour
def generate_fake_ground_truth(terminate_event):
    upload_ground_truth(datetime.utcnow())
    for _ in range(0, 60):
        time.sleep(60)
        if terminate_event.is_set():
            break


ground_truth_thread = WorkerThread(do_run=generate_fake_ground_truth)
ground_truth_thread.start()
```

次のコード例は、モデルエンドポイントに送信する人工的なトラフィックを生成する方法を示しています。上記で呼び出す際に使用した `inferenceId` 属性に注目してください。これが存在する場合は、Ground Truth データとの結合に使用されます (存在しない場合、`eventId` が使用されます)。

```
import threading

class WorkerThread(threading.Thread):
    def __init__(self, do_run, *args, **kwargs):
        super(WorkerThread, self).__init__(*args, **kwargs)
        self.__do_run = do_run
        self.__terminate_event = threading.Event()

    def terminate(self):
        self.__terminate_event.set()

    def run(self):
        while not self.__terminate_event.is_set():
            self.__do_run(self.__terminate_event)
def invoke_endpoint(terminate_event):
    with open(test_dataset, "r") as f:
        i = 0
        for row in f:
            payload = row.rstrip("\n")
            response = sagemaker_runtime_client.invoke_endpoint(
                EndpointName=endpoint_name,
                ContentType="text/csv",
                Body=payload,
                InferenceId=str(i),  # unique ID per row
            )
            i += 1
            response["Body"].read()
            time.sleep(1)
            if terminate_event.is_set():
                break


# Keep invoking the endpoint with test data
invoke_endpoint_thread = WorkerThread(do_run=invoke_endpoint)
invoke_endpoint_thread.start()
```

Ground Truth データは、キャプチャされたデータと同じパス形式の Amazon S3 バケットにアップロードする必要があります。これは、次の形式です。`s3://<bucket>/<prefix>/yyyy/mm/dd/hh`

**注記**  
このパスの日付は、Ground Truth ラベルが収集される日付です。推論が生成された日付と一致している必要はありません。

**Q: 顧客はどのようにモニタリングスケジュールをカスタマイズできますか?**

組み込みのモニタリングメカニズムを使用するだけでなく、前処理スクリプトと後処理スクリプトを使用したり、独自のコンテナを使用または構築したりして、独自のカスタムモニタリングスケジュールと手順を作成できます。前処理スクリプトと後処理スクリプトは、データとモデル品質ジョブでのみ機能することに注意してください。

Amazon SageMaker AI には、モデルエンドポイントによって観測されたデータをモニタリングして評価する機能があります。そのためには、リアルタイムトラフィックを比較するベースラインを作成する必要があります。ベースラインの準備ができたら、継続的に評価してベースラインと比較するスケジュールを設定します。スケジュールを作成するときに、前処理と後処理のスクリプトを用意できます。

次の例は、前処理スクリプトと後処理スクリプトでモニタリングスケジュールをカスタマイズする方法を示しています。

```
import boto3, osfrom sagemaker import get_execution_role, Sessionfrom sagemaker.model_monitor import CronExpressionGenerator, DefaultModelMonitor
# Upload pre and postprocessor scripts
session = Session()
bucket = boto3.Session().resource("s3").Bucket(session.default_bucket())
prefix = "demo-sagemaker-model-monitor"
pre_processor_script = bucket.Object(os.path.join(prefix, "preprocessor.py")).upload_file("preprocessor.py")
post_processor_script = bucket.Object(os.path.join(prefix, "postprocessor.py")).upload_file("postprocessor.py")
# Get execution role
role = get_execution_role() # can be an empty string
# Instance type
instance_type = "instance-type"
# instance_type = "ml.m5.xlarge" # Example
# Create a monitoring schedule with pre and post-processing
my_default_monitor = DefaultModelMonitor(
    role=role,
    instance_count=1,
    instance_type=instance_type,
    volume_size_in_gb=20,
    max_runtime_in_seconds=3600,
)

s3_report_path = "s3://{}/{}".format(bucket, "reports")
monitor_schedule_name = "monitor-schedule-name"
endpoint_name = "endpoint-name"
my_default_monitor.create_monitoring_schedule(
    post_analytics_processor_script=post_processor_script,
    record_preprocessor_script=pre_processor_script,
    monitor_schedule_name=monitor_schedule_name,
    # use endpoint_input for real-time endpoint
    endpoint_input=endpoint_name,
    # or use batch_transform_input for batch transform jobs
# batch_transform_input=batch_transform_name,
    output_s3_uri=s3_report_path,
    statistics=my_default_monitor.baseline_statistics(),
    constraints=my_default_monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True,
)
```

**Q: 前処理スクリプトを利用できるシナリオやユースケースにはどのようなものがありますか?**

モデルモニターへの入力を変換する必要がある場合は、前処理スクリプトを使用します。例えば、次のシナリオ例を考えてみます。

1. データ変換用の前処理スクリプト。

   モデルの出力が配列 `[1.0, 2.1]` だと仮定します。Model Monitor コンテナは、表形式または `{“prediction0”: 1.0, “prediction1” : 2.1}` のようなフラット化された JSON 構造でのみ動作します。次の例のような前処理スクリプトを使用して、配列を正しい JSON 構造に変換することもできます。

   ```
   def preprocess_handler(inference_record):
       input_data = inference_record.endpoint_input.data
       output_data = inference_record.endpoint_output.data.rstrip("\n")
       data = output_data + "," + input_data
       return { str(i).zfill(20) : d for i, d in enumerate(data.split(",")) }
   ```

1. Model Monitor のメトリクス計算で特定のレコードを除外します。

   モデルにオプションの特徴量があり、そのオプションの特徴量に欠測値があることを示すために `-1` を使用すると仮定します。データ品質モニターを使用している場合は、モニターのメトリクス計算に含まれないように、入力値の配列から `-1` を削除したほうがよい場合があります。次のようなスクリプトを使用して、これらの値を削除できます。

   ```
   def preprocess_handler(inference_record):
       input_data = inference_record.endpoint_input.data
       return {i : None if x == -1 else x for i, x in enumerate(input_data.split(","))}
   ```

1. カスタムサンプリング戦略の適用。

   前処理スクリプトにカスタムサンプリング戦略を適用することもできます。そのためには、Model Monitor のファーストパーティのビルド済みコンテナを設定して、指定したサンプリングレートに従って一部のレコードを無視するようにします。次の例では、ハンドラーはハンドラー呼び出しの 10% のレコードを返し、それ以外の場合は空のリストを返すことで、レコードの 10% をサンプリングします。

   ```
   import random
   
   def preprocess_handler(inference_record):
       # we set up a sampling rate of 0.1
       if random.random() > 0.1:
           # return an empty list
           return []
       input_data = inference_record.endpoint_input.data
       return {i : None if x == -1 else x for i, x in enumerate(input_data.split(","))}
   ```

1. カスタムログ記録を使用します。

   スクリプトから必要な情報をすべて Amazon CloudWatch に記録できます。これは、エラーが発生した場合に前処理スクリプトをデバッグするときに役立ちます。次の例は、`preprocess_handler` インターフェイスを使用して CloudWatch にログを記録する方法を示しています。

   ```
   def preprocess_handler(inference_record, logger):
       logger.info(f"I'm a processing record: {inference_record}")
       logger.debug(f"I'm debugging a processing record: {inference_record}")
       logger.warning(f"I'm processing record with missing value: {inference_record}")
       logger.error(f"I'm a processing record with bad value: {inference_record}")
       return inference_record
   ```

**注記**  
前処理スクリプトをバッチ変換データに対して実行する場合、入力タイプは必ずしも `CapturedData` オブジェクトではありません。CSV データの場合、タイプは文字列です。JSON データの場合、タイプは Python ディクショナリです。

**Q: 後処理スクリプトはいつ利用できますか?**

モニタリングが正常に実行された後は、後処理スクリプトを拡張機能として利用できます。以下は簡単な例ですが、モニタリングが正常に実行された後に実行する必要のあるビジネス機能を実行または呼び出すことができます。

```
def postprocess_handler(): 
    print("Hello from the post-processing script!")
```

**Q: モデルモニタリング用に独自のコンテナを持ち込むことを検討すべきタイミングはいつですか?**

SageMaker AI は、エンドポイントまたはバッチ変換ジョブからキャプチャした表形式のデータセットのデータを分析するためのビルド済みコンテナを提供しています。ただし、独自のコンテナを作成する必要がある場合もあります。次のシナリオを考えてみてください。
+ 組織内で作成、管理されているコンテナのみを使用するという規制要件やコンプライアンス要件がある。
+ いくつかのサードパーティライブラリを含める場合は、`requirements.txt` ファイルをローカルディレクトリに配置し、[SageMaker AI Estimator](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html#sagemaker.estimator.Estimator) のパラメータ `source_dir` を使用することで参照できます。これにより、実行時にライブラリをインストールできる。ただし、ライブラリや依存関係が多く、トレーニングジョブの実行中にインストール時間が長くなる場合は、BYOC を利用する必要がある。
+ 使用している環境ではインターネット接続 (またはサイロ) が強制されないため、パッケージのダウンロードが妨げられる。
+ NLP や CV のユースケースなど、表形式以外のデータ形式のデータをモニタリングしたい場合がある。
+ Model Monitor がサポートしていないモニタリングメトリクスが必要な場合。

**Q: NLP モデルと CV モデルがあります。データドリフトをモニタリングする方法を教えてください。**

Amazon SageMaker AI のビルド済みコンテナは表形式のデータセットをサポートします。NLP モデルと CV モデルをモニタリングする場合は、Model Monitor が提供する拡張ポイントを活用して独自のコンテナを持ち込むことができます。要件に関する詳細については、「[Bring your own containers](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-byoc-containers.html)」を参照してください。以下にその他の例を示します。
+ コンピュータービジョンのユースケースで Model Monitor を使用する方法の詳細な説明については、「[Amazon SageMaker Model Monitor と Debugger を使って不正な予測を検知して分析する](https://aws.amazon.com/blogs/machine-learning/detecting-and-analyzing-incorrect-model-predictions-with-amazon-sagemaker-model-monitor-and-debugger/)」を参照してください。
+ Model Monitor を NLP ユースケースに活用できるシナリオについては、「[Detect NLP data drift using custom Amazon SageMaker Model Monitor](https://aws.amazon.com/blogs/machine-learning/detect-nlp-data-drift-using-custom-amazon-sagemaker-model-monitor/)」を参照してください。

**Q: Model Monitor が有効になっていたモデルエンドポイントを削除したいのですが、モニタリングスケジュールがまだ有効なので削除できません。どうしたらよいですか?**

SageMaker AI でホストされている Model Monitor が有効になっている推論エンドポイントを削除する場合は、まずモデルモニタリングスケジュールを (`DeleteMonitoringSchedule` [CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/delete-monitoring-schedule.html) または [API](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeleteMonitoringSchedule.html) を使用して) 削除する必要があります。その後、エンドポイントを削除します。

**Q: SageMaker Model Monitor は入力のメトリックと統計を計算しますか?**

Model Monitor は、入力ではなく出力のメトリクスと統計を計算できます。

**Q: SageMaker Model Monitor はマルチモデルエンドポイントをサポートしていますか?**

Model Monitor は現在、単一モデルをホストするエンドポイントのみをサポートしており、マルチモデルエンドポイントのモニタリングはサポートしていません。

**Q: SageMaker Model Monitor は推論パイプライン内の個々のコンテナに関するモニタリングデータを提供しますか?**

Model Monitor は、推論パイプラインのモニタリングをサポートしていますが、データのキャプチャと分析は、パイプライン内の個々のコンテナではなく、パイプライン全体に対して行われます。

**Q: データキャプチャを設定したときに、推論リクエストに影響が出ないようにするにはどうしたらよいですか?**

推論リクエストへの影響を防ぐため、ディスク使用率のレベルが高くなると、データキャプチャはリクエストのキャプチャを停止します。データキャプチャがリクエストのキャプチャを続行できるように、ディスク使用率を 75% 未満に抑えることをお勧めします。

**Q: Amazon S3 データキャプチャは、モニタリングスケジュールが設定された AWS リージョンとは異なるリージョンにあることはできますか?**

いいえ、Amazon S3 データキャプチャはモニタリングスケジュールと同じリージョンにある必要があります。

**Q: ベースラインとはどういうものですか? また、ベースラインを作成する方法を教えてください。カスタムベースラインは作成できますか?**

ベースラインは、モデルからのリアルタイム予測またはバッチ予測を比較するための基準として使用されます。統計とメトリクスを、それらに関する制約とともに計算します。モニタリング時には、これらすべてを組み合わせて使用し、違反を特定します。

Amazon SageMaker Model Monitor のデフォルトソリューションを使用するには、[Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html) を利用できます。具体的には、[ModelMonitor](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html#sagemaker.model_monitor.model_monitoring.DefaultModelMonitor) または [ModelQualityMonitor](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html#sagemaker.model_monitor.model_monitoring.ModelQualityMonitor) クラスの [suggest\$1baseline](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html#sagemaker.model_monitor.model_monitoring.DefaultModelMonitor.suggest_baseline) メソッドを使用して、ベースラインのメトリクスと制約を計算する処理ジョブをトリガーします。

ベースラインジョブの結果として `statistics.json` と `constraints.json` の 2 つのファイルが生成されます。[統計のスキーマ](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-byoc-statistics.html)と[制約のスキーマ](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-byoc-constraints.html)にはそれぞれのファイルのスキーマが含まれます。生成された制約を確認し、変更してからモニタリングに使用することができます。ドメインとビジネス上の問題を理解したうえで、制約を強化することも、制約を緩和して違反の数や性質を制御することもできます。

**Q: ベースラインデータセットを作成するためのガイドラインとはどのようなものですか?**

どのようなモニタリングの場合でも、メトリクスと制約の計算に使用するベースラインデータセットを用意することが第一の要件です。通常、これはモデルが使用するトレーニングデータセットですが、場合によっては他の参照データセットを使用することもできます。

ベースラインデータセットの列名は Spark と互換性があります。Spark、CSV、JSON、Parquet 間の互換性を最大限に保つには、小文字のみを使用し、区切り文字として `_` のみを使用することをお勧めします。`“ ”` などの特殊文字を含むと問題を引き起こす可能性があります。

**Q: `StartTimeOffset` パラメータと `EndTimeOffset` パラメータとはどういうものですか? また、どのような場合に使用されますか?**

モデル品質などのモニタリングジョブに Amazon SageMaker Ground Truth が必要な場合は、モニタリングジョブで Ground Truth を利用できるデータのみを使用する必要があります。[EndpointInput](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html#sagemaker.model_monitor.model_monitoring.EndpointInput) の `start_time_offset` パラメータと `end_time_offset` パラメータを使用して、モニタリングジョブが使用するデータを選択できます。モニタリングジョブは、`start_time_offset` と `end_time_offset` で定義された時間枠内のデータを使用します。これらのパラメータは [ISO 8601 期間形式](https://en.wikipedia.org/wiki/ISO_8601#Durations)で指定する必要があります。次に例をいくつか示します。
+ 予測が行われてから 3 日後に Ground Truth の結果が届いた場合は、`start_time_offset="-P3D"` と `end_time_offset="-P1D"` (3 日と 1 日) を設定します。
+ Ground Truth の結果が予測から 6 時間後に到着し、1 時間ごとのスケジュールがある場合は、`start_time_offset="-PT6H"` と `end_time_offset="-PT1H"` (6 時間と 1 時間) を設定します。

**Q: 「オンデマンド」のモニタリングジョブを実行できますか?**

はい、SageMaker 処理ジョブを実行することで「オンデマンド」モニタリングジョブを実行できます。バッチ変換の場合、[Pipelines](https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-overview.html) には [MonitorBatchTransformStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.monitor_batch_transform_step.MonitorBatchTransformStep) があり、これを使用して、オンデマンドでモニタリングジョブを実行する SageMaker AI パイプラインを作成できます。SageMaker AI サンプルリポジトリには、[データ品質](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker_model_monitor/model_monitor_batch_transform/SageMaker-ModelMonitoring-Batch-Transform-Data-Quality-With-SageMaker-Pipelines-On-Demand.ipynb)と[モデル品質](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker_model_monitor/model_monitor_batch_transform/SageMaker-ModelMonitoring-Batch-Transform-Model-Quality-With-SageMaker-Pipelines-On-Demand.ipynb)のモニタリングジョブをオンデマンドで実行するためのコードサンプルがあります。

**Q: Model Monitor の設定方法を教えてください。**

Model Monitor は次の方法で設定できます。
+ **[Amazon SageMaker AI Python SDK](https://sagemaker.readthedocs.io/en/stable/index.html)** — ベースラインの提案、モニタリングスケジュールの作成などを支援するクラスと関数を含む [Model Monitor モジュール](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html)があります。SageMaker Python SDK を利用してモデルモニターを設定する詳細なノートブックについては、「[Amazon SageMaker Model Monitor ノートブックの例](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker_model_monitor)」を参照してください。
+ **[Pipelines](https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-overview.html)** – Pipelines は、[QualityCheck Step](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#step-type-quality-check) API と [ClarifyCheckStep](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#step-type-clarify-check) API を介して Model Monitor と統合されています。これらのステップを含む SageMaker AI パイプラインを作成して、パイプラインが実行される都度、モニタリングジョブをオンデマンドで実行できます。
+ **[Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio.html)** – デプロイされたモデルのエンドポイントのリストからエンドポイントを選択することで、データまたはモデルの品質モニタリングスケジュールと、モデルのバイアスおよび説明可能性スケジュールを UI から直接作成できます。UI の関連タブを選択することで、他のタイプのモニタリングのスケジュールを作成できます。
+ **[SageMaker モデルダッシュボード](https://docs.aws.amazon.com/sagemaker/latest/dg/model-dashboard.html)** — エンドポイントにデプロイされたモデルを選択することで、エンドポイントのモニタリングを有効にできます。次の SageMaker AI コンソールのスクリーンショットでは、**[モデルダッシュボード]** の **[モデル]** セクションから `group1` という名前のモデルが選択されています。このページでは、モニタリングスケジュールの作成や、既存のモニタリングスケジュールやアラートの編集、有効化、無効化ができます。アラートとモデルモニタースケジュールの表示方法の手順については、「[View Model Monitor schedules and alerts](https://docs.aws.amazon.com/sagemaker/latest/dg/model-dashboard-schedule.html)」を参照してください。

![\[モニタリングスケジュールを作成するオプションが表示されている [モデルダッシュボード] のスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/model-monitoring-faqs-screenshot.png)


**Q: Model Monitor は SageMaker モデルダッシュボードとどのように統合されますか?**

[SageMaker モデルダッシュボード](https://docs.aws.amazon.com/sagemaker/latest/dg/model-dashboard.html) では、予測される動作からの逸脱に関する自動アラートや、モデルを検査して時間の経過とともにモデルのパフォーマンスに影響を与える要因を分析するためのトラブルシューティングを提供することで、すべてのモデルを一元的にモニタリングできます。