Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Метрики анализа модели Tensorflow

Обзор

TFMA поддерживает следующие метрики:

  • Стандартные метрики keras ( tf.keras.metrics.* )
    • Обратите внимание, что для использования показателей keras вам не нужна модель keras. Метрики вычисляются вне графика в луче с использованием классов метрик напрямую.
  • Стандартные метрики TFMA ( tfma.metrics.* )
  • Пользовательские метрики keras (метрики, полученные из tf.keras.metrics.Metric )
  • Пользовательские метрики TFMA (метрики, полученные из tfma.metrics.Metric с использованием настраиваемых сумматоров лучей, или метрики, полученные из других метрик).

TFMA также предоставляет встроенную поддержку преобразования метрик двоичной классификации для использования с задачами с несколькими классами и метками:

  • Бинаризация на основе идентификатора класса, вершины K и т. Д.
  • Агрегированные показатели на основе микро усреднения, макро усреднения и т. Д.

TFMA также предоставляет встроенную поддержку метрик на основе запросов / ранжирования, где примеры автоматически группируются по ключу запроса в конвейере.

В совокупности доступно более 50+ стандартных показателей и графиков для различных задач, включая регрессию, двоичную классификацию, классификацию по нескольким классам / меткам, ранжирование и т. Д.

Конфигурация

Существует два способа настройки метрик в TFMA: (1) с помощью протокола MetricsSpec или (2) путем создания экземпляров tf.keras.metrics.* И / или tfma.metrics.* В python и с использованием tfma.metrics.specs_from_metrics чтобы преобразовать их в MetricsSpecs.

В следующих разделах описаны примеры конфигураций для различных типов задач машинного обучения.

Метрики регрессии

Ниже приведен пример настройки конфигурации для проблемы регрессии. Обратитесь к 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: "WeightedExampleCount" }
    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'),
    tfma.metrics.WeightedExampleCount(name='weighted_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: "WeightedExampleCount" }
    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'),
    tfma.metrics.WeightedExampleCount(name='weighted_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: "WeightedExampleCount" }
    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'),
    tfma.metrics.WeightedExampleCount(name='weighted_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 .

Бинаризованные метрики с несколькими классами и метками

Метрики с несколькими классами / метками могут быть преобразованы в двоичную форму для создания показателей по классам, по top_k и т. Д. С помощью tfma.BinarizationOptions . Например:

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

Мультиклассовые / многокомпонентные агрегированные показатели

Метрики с несколькими классами и метками можно агрегировать для получения единого агрегированного значения для метрики двоичной классификации.

Микро-средний

Микро-усреднение может выполняться независимо или как часть бинаризации показателей с помощью параметра micro_average в tfma.AggregationOptions . Например:

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

Макро / взвешенное макро-среднее

Усреднение макросов должно выполняться как часть бинаризации метрик в сочетании с параметрами maro_average или weighted_macro_average в tfma.AggregationOptions . Например:

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] } }
    aggregate: { macro_average: true }
    // Metrics to both binarize and aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

Эту же настройку можно создать с помощью следующего кода Python:

metrics = [
    // Metrics to both binarize and aggregate
    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]}),
    aggregate=tfma.AggregationOptions(macro_average=True))

Показатели на основе запросов / ранжирования

Метрики на основе запросов / ранжирования включаются путем указания опции query_key в спецификациях метрик. Например:

from google.protobuf import text_format

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

Эту же настройку можно создать с помощью следующего кода Python:

metrics = [
    tfma.metrics.NDCG(name='ndcg', gain_key='gain'),
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, query_key='doc_id', binarize=tfma.BinarizationOptions(
        top_k_list={'values': [1,2]}))

metrics = [
    tfma.metrics.MinLabelPosition(name='min_label_position')
]
metrics_specs.extend(
    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

Если метрики необходимо вычислить для подмножества моделей, установите model_names в metric_specs . Например:

from google.protobuf import text_format

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

API specs_from_metrics также поддерживает передачу имен моделей:

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

Метрики сравнения моделей

TFMA поддерживает оценку метрик сравнения модели-кандидата с базовой моделью. Простой способ настроить пару кандидата и базовой модели - передать eval_shared_model с соответствующими именами модели (tfma.BASELINE_KEY и tfma.CANDIDATE_KEY):


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/candiate/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 поддерживает оценку метрик на моделях с разными выходными данными. Модели с несколькими выходами хранят свои прогнозы выходных данных в форме словаря с ключом по имени выхода. Когда используются модели с несколькими выходами, имена выходов, связанных с набором метрик, должны быть указаны в разделе output_names в MetricsSpec. Например:

from google.protobuf import text_format

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

API specs_from_metrics также поддерживает передачу имен вывода:

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

Настройка параметров метрики

TFMA позволяет настраивать параметры, которые используются с разными показателями. Например, вы можете изменить имя, установить пороговые значения и т. Д. Это делается путем добавления раздела config в конфигурацию метрики. Конфигурация указывается с использованием строковой версии параметров JSON, которые будут передаваться методу метрик __init__ (для удобства использования ведущие и конечные скобки '{' и '}' могут быть опущены). Например:

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)

Выходы

Результатом оценки метрики является серия ключей / значений показателей и / или ключей / значений графика в зависимости от используемой конфигурации.

Метрические ключи

MetricKeys определяются с использованием типа структурированного ключа. Этот ключ однозначно определяет каждый из следующих аспектов метрики:

  • Название показателя ( auc , mean_label и т. Д.)
  • Название модели (используется только при оценке нескольких моделей)
  • Имя выхода (используется только при оценке моделей с несколькими выходами)
  • Подключа (например, идентификатор класса, если модель с несколькими классами бинаризована)

Значение показателя

MetricValues определяются с использованием прототипа, который инкапсулирует различные типы значений, поддерживаемые разными метриками (например, double , ConfusionMatrixAtThresholds и т. Д.).

Ниже перечислены поддерживаемые типы значений показателей:

  • double_value - обертка для типа double.
  • bytes_value - значение в байтах.
  • bounded_value - представляет реальное значение, которое может быть точечной оценкой, необязательно с некоторыми приблизительными границами. Имеет свойства value , lower_bound и upper_bound .
  • value_at_cutoffs - значение при отсечках (например, точность @ K, отзыв @ K). Имеет values свойств, каждое из которых имеет свойство cutoff и value .
  • confusion_matrix_at_thresholds - Матрица неточностей на порогах. Имеет matrices свойств, каждая из которых имеет свойства для threshold матрицы threshold , precision , recall и недоразумения, например false_negatives .
  • array_value - для показателей, возвращающих массив значений.

Ключи сюжета

PlotKeys похожи на метрические ключи, за исключением того, что по историческим причинам все значения графиков хранятся в одном прототипе, поэтому ключ графика не имеет имени.

Стоимость графика

Все поддерживаемые графики хранятся в едином протоколе под названием PlotData .

EvalResult

Результатом оценочного прогона является EvalResult . Эта запись содержит slicing_metrics который кодирует ключ метрики как многоуровневый dict, где уровни соответствуют выходному имени, идентификатору класса, имени метрики и значению метрики соответственно. Это предназначено для использования для отображения пользовательского интерфейса в записной книжке Jupiter. Если необходим доступ к базовым данным, вместо него следует использовать файл результатов metrics (см. Metrics_for_slice.proto ).

Настройка

В дополнение к настраиваемым метрикам, которые добавляются как часть сохраненных керасов (или устаревшей модели 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:

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.MetricComputation и tfma.metrics.DerivedMetricComputation , которые описаны в разделах ниже. В функцию, которая создает эти вычисления, будут переданы следующие параметры в качестве входных:

  • eval_config: tfam.EvalConfig
    • Конфигурация eval, переданная оценщику (полезна для поиска параметров спецификации модели, таких как ключ прогнозирования и т. Д.).
  • model_names: List[Text]
    • Список названий моделей, для которых рассчитываются метрики (нет, если модель является одной)
  • output_names: List[Text] .
    • Список имен выходных данных для вычисления метрик (нет, если для одной модели)
  • sub_keys: List[tfma.SubKey] .
    • Список подключей (идентификатор класса, верхний K и т. Д.) Для вычисления метрик (или нет)
  • class_weights: Dict[int, float] .
    • Веса классов, которые следует использовать при вычислении показателя агрегирования.
  • query_key: Text
    • Ключ запроса, используемый при вычислении метрики на основе запроса / ранжирования.

Если метрика не связана с одной или несколькими из этих настроек, она может не включать эти параметры в определение сигнатуры.

Если метрика вычисляется одинаково для каждой модели, выходных данных и tfma.metrics.merge_per_key_computations можно использовать утилиту tfma.metrics.merge_per_key_computations для выполнения одинаковых вычислений для каждого из этих входных данных отдельно.

Метрические вычисления

MetricComputation состоит из комбинации preprocessor и combiner . preprocessor - это beam.DoFn который принимает извлечения в качестве входных данных и выводит начальное состояние, которое будет использоваться объединителем (см. Архитектуру для получения дополнительной информации о том, что такое извлечения). Если preprocessor не определен, то объединителю будут переданы StandardMetricInputs (стандартные входные метрики содержат метки, прогнозы и example_weights). combiner является beam.CombineFn , который принимает кортеж (ключ среза, выходной Препроцессор) в качестве входных данных и выводит кортеж (slice_key, метрические результаты Dict) в качестве результата.

Обратите внимание, что нарезка происходит между preprocessor и combiner .

Обратите внимание, что если при вычислении метрики требуется использовать оба стандартных входных параметра метрики, но дополнить его некоторыми функциями из экстрактов features , то можно использовать специальный FeaturePreprocessor , который объединит запрошенные функции из нескольких комбайнеров в один общее значение StandardMetricsInputs, которое передается всем комбайнерам (комбайнеры отвечают за считывание интересующих их функций и игнорирование остальных).

пример

Ниже приводится очень простой пример определения метрики TFMA для вычисления ExampleCount:

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],
          preprocessor=_ExampleCountPreprocessor(),
          combiner=_ExampleCountCombiner(key))
  ]


class _ExampleCountPreprocessor(beam.DoFn):

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


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: List[int]) -> int:
    result = 0
    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

DerivedMetricComputation состоит из функции результата, которая используется для вычисления значений метрики на основе выходных данных других вычислений метрики. Функция результата принимает в качестве входных данных список вычисленных значений и выводит список дополнительных результатов метрики.

Обратите внимание, что допустимо (рекомендуется) включать вычисления, от которых зависит производное вычисление, в список вычислений, созданных метрикой. Это позволяет избежать предварительного создания и передачи вычислений, которые совместно используются несколькими метриками. Оценщик автоматически устранит дублирование вычислений с одинаковым определением, поэтому фактически выполняется только одно вычисление.

пример

Показатели TJUR представляют собой хороший пример производных показателей.