

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

# モデルの質
<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)」を参照してください。