

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 模型质量
<a name="model-monitor-model-quality"></a>

模型质量监控作业通过将模型所做的预测与模型尝试预测的实际 Ground Truth 标签进行比较来监控模型的性能。为此，模型质量监控会将从实时或批量推理中捕获的数据与存储在 Amazon S3 存储桶中的实际标签合并，然后将预测结果与实际标签进行比较。

为了衡量模型质量，Model Monitor 使用依赖于机器学习问题类型的指标。例如，如果您的模型用于解决回归问题，则评估的指标之一是均方误差 (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-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)
+ [输入地面实况标签并与预测结果合并](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 标签进行比较。通常，您使用训练数据集作为基准数据集。基准作业计算模型的指标，并建议用于监控模型质量偏移的约束。

要创建基准作业，您需要有一个数据集，其中包含模型的预测以及代表数据 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 会报告违规行为。要查看基准作业生成的约束，请调用基准作业的 `suggested_constraints` 方法。以下代码片段将二进制分类模型的约束加载到 Pandas 数据框中。

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

   我们建议您先查看生成的约束并根据需要对其进行修改，然后再使用它们进行监控。例如，如果某项约束过于激进，则您收到的违规警报可能会比预期的要多。

   如果您的约束包含以科学记数法表示的数字，则需要将其转换为浮点数。以下 Python [预处理脚本](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-pre-and-post-processing.html#model-monitor-pre-processing-script)示例显示了如何将科学记数法中的数字转换为浮点数。

   ```
   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)}
   ```

   您可以将预处理脚本作为 `record_preprocessor_script` 添加到基准或监控计划，如[模型监控](https://sagemaker.readthedocs.io/en/stable/api/inference/model_monitor.html)文档中所定义。

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()` 方法来计划每小时一次的模型质量监控。以下几节介绍如何为部署到实时端点的模型以及为批量转换作业创建模型质量监控。

**重要**  
创建监控计划时，您可以指定批量转换输入或端点输入，但不能同时指定两者。

与数据质量监控不同，如果要监控模型质量，则需要提供 Ground Truth 标签。但是，Ground Truth 标签可能会延迟。要解决这个问题，请在创建监控计划时指定偏移量。

## Model Monitor 偏移量
<a name="model-monitor-model-quality-schedule-offsets"></a>

模型质量作业包括 `StartTimeOffset` 和 `EndTimeOffset`，它们是 `create_model_quality_job_definition` 方法 `ModelQualityJobInput` 参数的字段，其工作方式如下：
+ `StartTimeOffset` - 如果已指定，则作业将从开始时间中减去此时间。
+ `EndTimeOffset` - 如果已指定，则作业将从结束时间中减去此时间。

例如，偏移量的格式为-PT7 H，其中 7H 为 7 小时。您可以使用 -PT\$1H 或 -P\$1D，其中 H 为小时数，D 为天数，M 为分钟数，\$1 为数字。此外，偏移量应采用 [ISO 8601 持续时间格式](https://en.wikipedia.org/wiki/ISO_8601#Durations)。

例如，如果您的 Ground Truth 在 1 天后开始出现，但在一周内没有完成，则将 `StartTimeOffset` 设置为 `-P8D`，将 `EndTimeOffset` 设置为 `-P1D`。然后，如果您计划在 `2020-01-09T13:00` 运行某项作业，则它会分析介于 `2020-01-01T13:00` 和 `2020-01-08T13:00` 之间的数据。

**重要**  
计划节奏应确保一次执行在下一次执行开始之前完成，这样就能完成执行中的 Ground Truth 合并作业和监控作业。一次执行的最大运行时间在两个作业之间分配，因此，对于每小时一次的模型质量监控作业，作为 `StoppingCondition` 一部分指定的 `MaxRuntimeInSeconds` 值不得大于 1800。

## 对部署到实时端点的模型进行模型质量监控
<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,
)
```

# 输入地面实况标签并与预测结果合并
<a name="model-monitor-model-quality-merge"></a>

模型质量监控将您的模型所做的预测与 Ground Truth 标签进行比较，以衡量模型的质量。为此，您需要定期为端点或批量转换作业捕获的数据添加标签，然后将其上传到 Amazon S3。

要将 Ground Truth 标签与捕获的预测数据进行匹配，数据集中的每条记录都必须有一个唯一的标识符。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 标签后，请在创建监控作业时将标签的位置作为参数包括在内。如果您正在使用 适用于 Python (Boto3) 的 AWS SDK，请在调用`create_model_quality_job_definition`方法时通过将 Ground Truth 标签的位置指定为`GroundTruthS3Input`参数`S3Uri`字段来执行此操作。如果您使用的是 SageMaker Python SDK，请在调用`ModelQualityMonitor`对象时将 Ground Truth 标签`create_monitoring_schedule`的位置指定为`ground_truth_input`参数。

# 模型质量指标和 Amazon CloudWatch 监控
<a name="model-monitor-model-quality-metrics"></a>

模型质量监控作业计算不同的指标，以评估机器学习模型的质量和性能。计算的具体指标取决于 ML 问题的类型：回归、二元分类或多分类器。监测这些指标对于检测模型随时间的漂移至关重要。以下各节介绍了每种问题类型的关键模型质量指标，以及如何使用设置自动监控和警报 CloudWatch 来持续跟踪模型的性能。

**注意**  
仅当至少有 200 个样本可用时，才会提供指标的标准差。模型监控器计算标准偏差的方法是，随机抽取 80% 的数据五次，计算指标值，然后求出这些结果的标准偏差。

## 回归指标
<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>

如果您在创建监控计划`True`时`enable_cloudwatch_metrics`将的值设置为，则模型质量监控任务会将所有指标发送到 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)报。