Tensorflow 모델 분석 측정항목 및 플롯

개요

TFMA는 다음 측정항목과 도표를 지원합니다.

  • 표준 keras 지표( tf.keras.metrics.* )
    • keras 메트릭을 사용하기 위해 keras 모델이 필요하지는 않습니다. 측정항목은 측정항목 클래스를 직접 사용하여 빔의 그래프 외부에서 계산됩니다.
  • 표준 TFMA 측정항목 및 도표( tfma.metrics.* )

  • 사용자 정의 keras 메트릭( tf.keras.metrics.Metric 에서 파생된 메트릭)

  • 맞춤형 빔 결합기 또는 다른 지표에서 파생된 지표를 사용하는 맞춤형 TFMA 지표( tfma.metrics.Metric 에서 파생된 지표).

TFMA는 또한 다중 클래스/다중 레이블 문제에 사용하기 위해 이진 분류 지표를 변환하기 위한 기본 지원을 제공합니다.

  • 클래스 ID, 상위 K 등을 기반으로 한 이진화
  • 마이크로 평균화, 매크로 평균화 등을 기반으로 집계된 측정항목

TFMA는 또한 예제가 파이프라인에서 자동으로 쿼리 키로 그룹화되는 쿼리/순위 기반 측정항목에 대한 기본 지원을 제공합니다.

회귀, 이진 분류, 다중 클래스/다중 레이블 분류, 순위 등을 포함한 다양한 문제에 사용할 수 있는 50개 이상의 표준 측정항목과 도표가 결합되어 있습니다.

구성

TFMA에서 메트릭을 구성하는 방법에는 두 가지가 있습니다. (1) tfma.MetricsSpec 을 사용하거나 (2) Python에서 tf.keras.metrics.* 및/또는 tfma.metrics.* 클래스의 인스턴스를 생성하고 tfma.metrics.specs_from_metrics 하여 tfma.MetricsSpec 목록으로 변환합니다.

다음 섹션에서는 다양한 유형의 기계 학습 문제에 대한 구성 예를 설명합니다.

회귀 측정항목

다음은 회귀 문제에 대한 구성 설정의 예입니다. 지원되는 가능한 추가 측정항목은 tf.keras.metrics.*tfma.metrics.* 모듈을 참조하세요.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "MeanSquaredError" }
    metrics { class_name: "Accuracy" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics {
      class_name: "CalibrationPlot"
      config: '"min_value": 0, "max_value": 10'
    }
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.MeanSquaredError(name='mse'),
    tf.keras.metrics.Accuracy(name='accuracy'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.CalibrationPlot(
        name='calibration', min_value=0, max_value=10)
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

이 설정은 tfma.metrics.default_regression_specs 호출하여 사용할 수도 있습니다.

이진 분류 측정항목

다음은 이진 분류 문제에 대한 구성 설정의 예입니다. 지원되는 가능한 추가 측정항목은 tf.keras.metrics.*tfma.metrics.* 모듈을 참조하세요.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "ConfusionMatrixPlot" }
    metrics { class_name: "CalibrationPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.BinaryCrossentropy(name='binary_crossentropy'),
    tf.keras.metrics.BinaryAccuracy(name='accuracy'),
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    tf.keras.metrics.AUC(
        name='auc_precision_recall', curve='PR', num_thresholds=10000),
    tf.keras.metrics.Precision(name='precision'),
    tf.keras.metrics.Recall(name='recall'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.ConfusionMatrixPlot(name='confusion_matrix_plot'),
    tfma.metrics.CalibrationPlot(name='calibration_plot')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

이 설정은 tfma.metrics.default_binary_classification_specs 호출하여 사용할 수도 있습니다.

다중 클래스/다중 라벨 분류 측정항목

다음은 다중 클래스 분류 문제에 대한 구성 설정의 예입니다. 지원되는 가능한 추가 측정항목은 tf.keras.metrics.*tfma.metrics.* 모듈을 참조하세요.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "SparseCategoricalCrossentropy" }
    metrics { class_name: "SparseCategoricalAccuracy" }
    metrics { class_name: "Precision" config: '"top_k": 1' }
    metrics { class_name: "Precision" config: '"top_k": 3' }
    metrics { class_name: "Recall" config: '"top_k": 1' }
    metrics { class_name: "Recall" config: '"top_k": 3' }
    metrics { class_name: "MultiClassConfusionMatrixPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.SparseCategoricalCrossentropy(
        name='sparse_categorical_crossentropy'),
    tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'),
    tf.keras.metrics.Precision(name='precision', top_k=1),
    tf.keras.metrics.Precision(name='precision', top_k=3),
    tf.keras.metrics.Recall(name='recall', top_k=1),
    tf.keras.metrics.Recall(name='recall', top_k=3),
    tfma.metrics.MultiClassConfusionMatrixPlot(
        name='multi_class_confusion_matrix_plot'),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

이 설정은 tfma.metrics.default_multi_class_classification_specs 호출하여 사용할 수도 있습니다.

다중 클래스/다중 레이블 이진화 측정항목

다중 클래스/다중 레이블 측정항목은 tfma.BinarizationOptions 사용하여 클래스당, top_k당 등의 측정항목을 생성하도록 이진화될 수 있습니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    binarize: { class_ids: { values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } }
    // Metrics to binarize
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    // Metrics to binarize
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, binarize=tfma.BinarizationOptions(
        class_ids={'values': [0,1,2,3,4,5,6,7,8,9]}))

다중 클래스/다중 레이블 집계 측정항목

tfma.AggregationOptions 사용하면 다중 클래스/다중 레이블 측정항목을 집계하여 이진 분류 측정항목에 대한 단일 집계 값을 생성할 수 있습니다.

집계 설정은 이진화 설정과 독립적이므로 tfma.AggregationOptionstfma.BinarizationOptions 동시에 사용할 수 있습니다.

마이크로 평균

마이크로 평균화는 tfma.AggregationOptions 내의 micro_average 옵션을 사용하여 수행할 수 있습니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: { micro_average: true }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, aggregate=tfma.AggregationOptions(micro_average=True))

마이크로 평균화는 계산에 상위 k 값만 사용되는 top_k 설정도 지원합니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      micro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(micro_average=True,
                                      top_k_list={'values': [1, 3]}))

매크로/가중 매크로 평균

매크로 평균화는 tfma.AggregationOptions 내에서 macro_average 또는 weighted_macro_average 옵션을 사용하여 수행할 수 있습니다. top_k 설정을 사용하지 않는 한, 매크로는 평균을 계산할 클래스를 알기 위해 class_weights 설정해야 합니다. class_weight 가 제공되지 않으면 0.0이 가정됩니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      class_weights: { key: 0 value: 1.0 }
      class_weights: { key: 1 value: 1.0 }
      class_weights: { key: 2 value: 1.0 }
      class_weights: { key: 3 value: 1.0 }
      class_weights: { key: 4 value: 1.0 }
      class_weights: { key: 5 value: 1.0 }
      class_weights: { key: 6 value: 1.0 }
      class_weights: { key: 7 value: 1.0 }
      class_weights: { key: 8 value: 1.0 }
      class_weights: { key: 9 value: 1.0 }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(
        macro_average=True, class_weights={i: 1.0 for i in range(10)}))

마이크로 평균화와 마찬가지로 매크로 평균화도 계산에 상위 k 값만 사용되는 top_k 설정을 지원합니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(macro_average=True,
                                      top_k_list={'values': [1, 3]}))

쿼리/순위 기반 측정항목

쿼리/순위 기반 메트릭은 메트릭 사양에서 query_key 옵션을 지정하여 활성화됩니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    query_key: "doc_id"
    metrics {
      class_name: "NDCG"
      config: '"gain_key": "gain", "top_k_list": [1, 2]'
    }
    metrics { class_name: "MinLabelPosition" }
  }
""", tfma.EvalConfig()).metrics_specs

다음 Python 코드를 사용하여 이와 동일한 설정을 만들 수 있습니다.

metrics = [
    tfma.metrics.NDCG(name='ndcg', gain_key='gain', top_k_list=[1, 2]),
    tfma.metrics.MinLabelPosition(name='min_label_position')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics, query_key='doc_id')

다중 모델 평가 지표

TFMA는 동시에 여러 모델 평가를 지원합니다. 다중 모델 평가를 수행하면 각 모델에 대한 지표가 계산됩니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    # no model_names means all models
    ...
  }
""", tfma.EvalConfig()).metrics_specs

모델의 하위 집합에 대해 측정항목을 계산해야 하는 경우 metric_specsmodel_names 설정하세요. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    model_names: ["my-model1"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

specs_from_metrics API는 모델 이름 전달도 지원합니다.

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, model_names=['my-model1'])

모델 비교 지표

TFMA는 기준 모델에 대한 후보 모델의 비교 측정항목 평가를 지원합니다. 후보 모델과 기준 모델 쌍을 설정하는 간단한 방법은 적절한 모델 이름(tfma.BASELINE_KEY 및 tfma.CANDIDATE_KEY)과 함께 eval_shared_model을 전달하는 것입니다.


eval_config = text_format.Parse("""
  model_specs {
    # ... model_spec without names ...
  }
  metrics_spec {
    # ... metrics ...
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candidate/model',
      eval_config=eval_config),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path='/path/to/saved/baseline/model',
      eval_config=eval_config),
]

eval_result = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/output")

비교 측정항목은 비교 가능한 모든 측정항목(현재는 정확도 및 AUC와 같은 스칼라 값 측정항목만)에 대해 자동으로 계산됩니다.

다중 출력 모델 지표

TFMA는 다양한 출력을 갖는 모델에 대한 측정항목 평가를 지원합니다. 다중 출력 모델은 출력 이름을 기준으로 한 사전 형식으로 출력 예측을 저장합니다. 다중 출력 모델을 사용하는 경우 측정항목 집합과 연결된 출력 이름을 MetricsSpec의 output_names 섹션에 지정해야 합니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    output_names: ["my-output"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

specs_from_metrics API는 출력 이름 전달도 지원합니다.

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, output_names=['my-output'])

측정항목 설정 사용자 정의

TFMA를 사용하면 다양한 측정항목과 함께 사용되는 설정을 사용자 지정할 수 있습니다. 예를 들어 이름을 변경하고 임계값을 설정하는 등의 작업을 수행할 수 있습니다. 이는 측정항목 구성에 config 섹션을 추가하여 수행됩니다. 구성은 메트릭 __init__ 메소드에 전달될 매개변수의 JSON 문자열 버전을 사용하여 지정됩니다(사용 편의성을 위해 앞뒤 '{' 및 '}' 대괄호는 생략될 수 있음). 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics {
      class_name: "ConfusionMatrixAtThresholds"
      config: '"thresholds": [0.3, 0.5, 0.8]'
    }
  }
""", tfma.MetricsSpec()).metrics_specs

물론 이 사용자 정의도 직접 지원됩니다.

metrics = [
   tfma.metrics.ConfusionMatrixAtThresholds(thresholds=[0.3, 0.5, 0.8]),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

출력

메트릭 평가의 출력은 사용된 구성을 기반으로 하는 일련의 메트릭 키/값 및/또는 플롯 키/값입니다.

측정항목 키

MetricKey는 구조화된 키 유형을 사용하여 정의됩니다. 이 키는 측정항목의 다음 측면을 각각 고유하게 식별합니다.

  • 측정항목 이름( auc , mean_label 등)
  • 모델 이름(다중 모델 평가인 경우에만 사용됨)
  • 출력 이름(다중 출력 모델을 평가하는 경우에만 사용됨)
  • 하위 키(예: 다중 클래스 모델이 이진화된 경우 클래스 ID)

측정항목 값

MetricValues는 다양한 측정항목(예: double , ConfusionMatrixAtThresholds 등)에서 지원하는 다양한 값 유형을 캡슐화하는 proto를 사용하여 정의됩니다.

지원되는 측정항목 값 유형은 다음과 같습니다.

  • double_value - double 유형의 래퍼입니다.
  • bytes_value - 바이트 값입니다.
  • bounded_value - 선택적으로 일종의 대략적인 경계를 사용하여 점별 추정이 될 수 있는 실제 값을 나타냅니다. value , lower_boundupper_bound 속성이 있습니다.
  • value_at_cutoffs - 컷오프 값(예: 정밀도@K, 재현율@K). 속성 values 있으며, 각 속성에는 cutoffvalue 속성이 있습니다.
  • confusion_matrix_at_thresholds - 임계값의 혼동 행렬입니다. 속성 matrices 있으며 각 속성에는 threshold , precision , recallfalse_negatives 와 같은 혼동 행렬 값에 대한 속성이 있습니다.
  • array_value - 값 배열을 반환하는 측정항목용입니다.

플롯 키

PlotKey는 기록상의 이유로 모든 플롯 값이 단일 proto에 저장되므로 플롯 키에 이름이 없다는 점을 제외하면 측정항목 키와 유사합니다.

플롯 값

지원되는 모든 플롯은 PlotData 라는 단일 proto에 저장됩니다.

평가 결과

평가 실행의 반환은 tfma.EvalResult 입니다. 이 레코드에는 메트릭 키를 다중 레벨 사전으로 인코딩하는 slicing_metrics 포함되어 있습니다. 여기서 레벨은 각각 출력 이름, 클래스 ID, 메트릭 이름 및 메트릭 값에 해당합니다. 이는 Jupiter 노트북의 UI 표시에 사용하기 위한 것입니다. 기본 데이터에 대한 액세스가 필요한 경우 metrics 결과 파일을 대신 사용해야 합니다( metrics_for_slice.proto 참조).

맞춤화

저장된 keras(또는 레거시 EvalSavedModel)의 일부로 추가되는 사용자 정의 측정항목에 추가됩니다. TFMA 사후 저장에서 메트릭을 사용자 정의하는 방법에는 두 가지가 있습니다. (1) 사용자 정의 keras 메트릭 클래스를 정의하는 방법과 (2) 빔 결합기가 지원하는 사용자 정의 TFMA 메트릭 클래스를 정의하는 것입니다.

두 경우 모두 메트릭 클래스 및 관련 모듈의 이름을 지정하여 메트릭을 구성합니다. 예를 들어:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "MyMetric" module: "my.module"}
  }
""", tfma.EvalConfig()).metrics_specs

사용자 정의 Keras 측정항목

사용자 정의 keras 메트릭을 생성하려면 사용자는 구현을 통해 tf.keras.metrics.Metric 확장한 다음 평가 시 메트릭 모듈을 사용할 수 있는지 확인해야 합니다.

사후 모델 저장에 추가된 측정항목의 경우 TFMA는 레이블(예: y_true), 예측(y_pred) 및 예제 가중치(sample_weight)를 update_state 메서드에 대한 매개변수로 사용하는 측정항목만 지원합니다.

Keras 측정항목의 예

다음은 사용자 정의 keras 측정항목의 예입니다.

class MyMetric(tf.keras.metrics.Mean):

  def __init__(self, name='my_metric', dtype=None):
    super(MyMetric, self).__init__(name=name, dtype=dtype)

  def update_state(self, y_true, y_pred, sample_weight=None):
    return super(MyMetric, self).update_state(
        y_pred, sample_weight=sample_weight)

맞춤형 TFMA 지표

사용자 정의 TFMA 측정항목을 생성하려면 사용자는 구현을 통해 tfma.metrics.Metric 확장한 다음 평가 시 측정항목 모듈을 사용할 수 있는지 확인해야 합니다.

미터법

tfma.metrics.Metric 구현은 메트릭 값을 계산하는 데 필요한 계산(여러 개 가능)을 생성하기 위한 함수와 함께 메트릭 구성을 정의하는 kwargs 집합으로 구성됩니다. 사용할 수 있는 두 가지 주요 계산 유형은 tfma.metrics.MetricComputationtfma.metrics.DerivedMetricComputation 이며 아래 섹션에서 설명합니다. 이러한 계산을 생성하는 함수에는 다음 매개변수가 입력으로 전달됩니다.

  • eval_config: tfam.EvalConfig
    • 평가자에게 전달된 평가 구성(사용할 예측 키 등 모델 사양 설정을 조회하는 데 유용함)
  • model_names: List[Text]
    • 측정항목을 계산할 모델 이름 목록(단일 모델인 경우 없음)
  • output_names: List[Text] .
    • 측정항목을 계산할 출력 이름 목록(단일 모델인 경우 없음)
  • sub_keys: List[tfma.SubKey] .
    • 측정항목을 계산할 하위 키(클래스 ID, 상위 K 등) 목록(또는 없음)
  • aggregation_type: tfma.AggregationType
    • 집계 측정항목을 계산하는 경우 집계 유형입니다.
  • class_weights: Dict[int, float] .
    • 집계 측정항목을 계산하는 경우 사용할 클래스 가중치입니다.
  • query_key: Text
    • 쿼리/순위 기반 측정항목을 계산하는 경우 사용되는 쿼리 키입니다.

메트릭이 하나 이상의 이러한 설정과 연결되어 있지 않으면 해당 매개 변수가 시그니처 정의에서 제외될 수 있습니다.

메트릭이 각 모델, 출력 및 하위 키에 대해 동일한 방식으로 계산되면 유틸리티 tfma.metrics.merge_per_key_computations 사용하여 이러한 각 입력에 대해 동일한 계산을 개별적으로 수행할 수 있습니다.

메트릭 계산

MetricComputation preprocessors combiner 의 조합으로 구성됩니다. preprocessors 추출을 입력으로 사용하고 결합기가 사용할 초기 상태를 출력하는 beam.DoFnpreprocessor 의 목록입니다(추출이 무엇인지에 대한 자세한 내용은 아키텍처 참조). 모든 전처리기는 목록의 순서대로 순차적으로 실행됩니다. preprocessors 비어 있으면 결합기에 StandardMetricInputs 가 전달됩니다(표준 측정항목 입력에는 레이블, 예측 및 example_weights가 포함됨). combiner (슬라이스 키, 전처리기 출력) 튜플을 입력으로 사용하고 (slice_key, 메트릭 결과 dict) 튜플을 결과로 출력하는 beam.CombineFn 입니다.

슬라이싱은 preprocessors combiner 사이에서 발생합니다.

메트릭 계산이 표준 메트릭 입력을 모두 사용하지만 features 추출의 일부 기능으로 이를 강화하려는 경우 여러 결합기에서 요청된 기능을 단일로 병합하는 특수 FeaturePreprocessor를 사용할 수 있습니다. 모든 결합자에게 전달되는 공유 StandardMetricsInputs 값(결합자는 관심 있는 기능을 읽고 나머지는 무시할 책임이 있음)

다음은 exampleCount를 계산하기 위한 TFMA 측정항목 정의의 매우 간단한 예입니다.

class ExampleCount(tfma.metrics.Metric):

  def __init__(self, name: Text = 'example_count'):
    super(ExampleCount, self).__init__(_example_count, name=name)


def _example_count(
    name: Text = 'example_count') -> tfma.metrics.MetricComputations:
  key = tfma.metrics.MetricKey(name=name)
  return [
      tfma.metrics.MetricComputation(
          keys=[key],
          preprocessors=[_ExampleCountPreprocessor()],
          combiner=_ExampleCountCombiner(key))
  ]


class ExampleCountTest(tfma.test.testutil.TensorflowModelAnalysisTest):

  def testExampleCount(self):
    metric = ExampleCount()
    computations = metric.computations(example_weighted=False)
    computation = computations[0]

    with beam.Pipeline() as pipeline:
      result = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'PreProcess' >> beam.ParDo(computation.preprocessors[0])
          | 'Process' >> beam.Map(tfma.metrics.to_standard_metric_inputs)
          | 'AddSlice' >> beam.Map(lambda x: ((), x))
          | 'ComputeMetric' >> beam.CombinePerKey(computation.combiner)
      )

      def check_result(got):
        try:
          self.assertLen(got, 1)
          got_slice_key, got_metrics = got[0]
          self.assertEqual(got_slice_key, ())
          key = computation.keys[0]
          self.assertIn(key, got_metrics)
          self.assertAlmostEqual(got_metrics[key], expected_value, places=5)
        except AssertionError as err:
          raise util.BeamAssertException(err)

      util.assert_that(result, check_result, label='result')

class _ExampleCountPreprocessor(beam.DoFn):

  def process(self, extracts: tfma.Extracts) -> Iterable[int]:
    yield 1


class _ExampleCountPreprocessorTest(unittest.TestCase):

  def testExampleCountPreprocessor(self):
    ...  # Init the test case here
    with beam.Pipeline() as pipeline:
      updated_pcoll = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'Preprocess'
          >> beam.ParDo(
              _ExampleCountPreprocessor()
          )
      )

      beam_testing_util.assert_that(
          updated_pcoll,
          lambda result: ...,  # Assert the test case
      )


class _ExampleCountCombiner(beam.CombineFn):

  def __init__(self, metric_key: tfma.metrics.MetricKey):
    self._metric_key = metric_key

  def create_accumulator(self) -> int:
    return 0

  def add_input(self, accumulator: int, state: int) -> int:
    return accumulator + state

  def merge_accumulators(self, accumulators: Iterable[int]) -> int:
    accumulators = iter(accumulators)
    result = next(accumulator)
    for accumulator in accumulators:
      result += accumulator
    return result

  def extract_output(self,
                     accumulator: int) -> Dict[tfma.metrics.MetricKey, int]:
    return {self._metric_key: accumulator}

파생메트릭계산

DerivedMetricComputation 은 다른 메트릭 계산의 출력을 기반으로 메트릭 값을 계산하는 데 사용되는 결과 함수로 구성됩니다. 결과 함수는 계산된 값의 사전을 입력으로 사용하고 추가 측정항목 결과의 사전을 출력합니다.

파생 계산이 의존하는 계산을 메트릭에 의해 생성된 계산 목록에 포함하는 것이 허용됩니다(권장). 이렇게 하면 여러 측정항목 간에 공유되는 계산을 미리 생성하고 전달할 필요가 없습니다. 평가자는 동일한 정의를 갖는 계산을 자동으로 중복 제거하므로 실제로는 하나의 계산만 실행됩니다.

TJUR 메트릭은 파생 메트릭의 좋은 예를 제공합니다.