Validaciones del modelo de análisis del modelo Tensorflow

Descripción general

TFMA admite la validación de un modelo mediante la configuración de umbrales de valor y umbrales de cambio basados ​​en las métricas admitidas .

Configuración

Umbral de valor genérico

El umbral de valor es útil para controlar el modelo candidato comprobando si las métricas correspondientes son mayores que un límite inferior y/o menores que un límite superior. El usuario puede establecer uno o ambos valores de límite inferior y límite superior. El límite inferior tiene por defecto infinito negativo si no está configurado, y el límite superior tiene por defecto infinito si no está configurado.

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0})
upper_bound = tfma.GenericValueThreshold(upper_bound={'value':1})
lower_upper_bound = tfma.GenericValueThreshold(lower_bound={'value':0},
                                               upper_bound={'value':1))

Umbral de cambio genérico

El umbral de cambio es útil para controlar el modelo candidato comprobando si la métrica correspondiente es mayor o menor que la de un modelo de referencia. Hay dos formas de medir el cambio: cambio absoluto y cambio relativo. El cambio absoluto se calcula como la diferencia de valor entre las métricas del modelo candidato y de referencia, es decir, v_c - v_b donde v_c denota el valor de la métrica candidata y v_b denota el valor de referencia. El valor relativo es la diferencia relativa entre la métrica del candidato y la línea base, es decir, v_c/v_b . El umbral absoluto y relativo pueden coexistir en el modelo de puerta según ambos criterios. Además de configurar valores de umbral, el usuario también debe configurar MetricDirection. para métricas con valores favorablemente más altos (por ejemplo, AUC), establezca la dirección en HIGHER_IS_BETTER, para métricas con valores favorablemente más bajos (por ejemplo, pérdida), establezca la dirección en LOWER_IS_BETTER. Los umbrales de cambio requieren que se evalúe un modelo de referencia junto con el modelo candidato. Consulte la guía de introducción para ver un ejemplo.

import tensorflow_model_analysis as tfma

absolute_higher_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
absolute_lower_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
relative_higher_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
relative_lower_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
absolute_and_relative = tfma.GenericChangeThreshold(relative={'value':1},
                                                    absolute={'value':0.2},
                                                    direction=tfma.MetricDirection.LOWER_IS_BETTER)

juntando cosas

El siguiente ejemplo combina umbrales de valor y cambio:

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0.7})
relative_higher_is_better =
    tfma.GenericChangeThreshold(relative={'value':1.01},
                                direction=tfma.MetricDirection.HIGHER_IS_BETTER)
auc_threshold = tfma.MetricThreshold(value_threshold=lower_bound,
                                     change_threshold=relative_higher_is_better)

Podría ser más legible escribir la configuración en formato proto:

from google.protobuf import text_format

auc_threshold = text_format.Parse("""
  value_threshold { lower_bound { value: 0.6 } }
  change_threshold { relative { value: 1.01 } }
""", tfma.MetricThreshold())

MetricThreshold se puede configurar para controlar las métricas de tiempo de entrenamiento del modelo (ya sea EvalSavedModel o el modelo guardado de Keras) y las métricas posteriores al entrenamiento (definidas en la configuración de TFMA). Para las métricas de Tiempo de entrenamiento, los umbrales se especifican en tfma.MetricsSpec:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

Para las métricas posteriores al entrenamiento, los umbrales se definen directamente en tfma.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

Aquí hay un ejemplo junto con las otras configuraciones en EvalConfig:

# Run in a Jupyter Notebook.
from google.protobuf import text_format

eval_config = text_format.Parse("""
  model_specs {
    # This assumes a serving model with a "serving_default" signature.
    label_key: "label"
    example_weight_key: "weight"
  }
  metrics_spec {
    # Training Time metric thresholds
    thresholds {
      key: "auc"
      value: {
        value_threshold {
          lower_bound { value: 0.7 }
        }
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    # Post Training metrics and their thesholds.
    metrics {
      # This assumes a binary classification model.
      class_name: "AUC"
      threshold {
        value_threshold {
          lower_bound { value: 0 }
        }
      }
    }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: ["age"]
  }
""", 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")

tfma.view.render_slicing_metrics(eval_result)
tfma.load_validation_result(output_path)

Producción

Además del archivo de métricas generado por el evaluador, cuando se utiliza la validación, también se genera un archivo de "validaciones" adicional. El formato de carga útil es ValidationResult . La salida tendrá "validation_ok" establecido en Verdadero cuando no haya fallas. Cuando hay fallas, se proporciona información sobre las métricas asociadas, los umbrales y los valores de métricas que se observaron. El siguiente es un ejemplo en el que "weighted_examle_count" no supera un umbral de valor (1,5 no es menor que 1,0, de ahí el error):

  validation_ok: False
  metric_validations_per_slice {
    failures {
      metric_key {
        name: "weighted_example_count"
        model_name: "candidate"
      }
      metric_threshold {
        value_threshold {
          upper_bound { value: 1.0 }
        }
      }
      metric_value {
        double_value { value: 1.5 }
      }
    }
  }