Join us at DevFest for Ukraine June 14-15 Online Register now

Validaciones del modelo de análisis del modelo Tensorflow

Descripción general

TFMA soporta la validación de un modelo mediante el establecimiento de umbrales de valor y los umbrales de cambio en base a las métricas compatibles .

Configuración

Umbral de valor genérico

El umbral de valor es útil para seleccionar el modelo candidato comprobando si la métrica correspondiente es mayor que un límite inferior y/o menor que un límite superior. El usuario puede establecer uno o ambos valores de límite inferior y límite superior. El valor predeterminado de lower_bound es infinito negativo si no se establece, y el valor predeterminado de upper_bound es infinito si no se establece.

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 seleccionar el modelo candidato al verificar si la métrica correspondiente es más grande o más pequeña que la de un modelo de referencia. Hay dos formas de medir el cambio: el cambio absoluto y el cambio relativo. Aboslute cambio se calcula como el valor diference entre las métricas del modelo candidato y la línea de base, a saber, V_c - v_b donde V_c denota el valor de la métrica candidato y v_b denota el valor de referencia. Valor relativo es la diferencia relativa entre la métrica del candidato y de la línea de base, a saber, 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 (p. ej., AUC), establezca la dirección en HIGHER_IS_BETTER, para métricas con valores favorablemente más bajos (p. ej., 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. Ver Guía de introducción para 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())

El MetricThreshold se puede configurar para activar tanto las métricas de tiempo de entrenamiento del modelo (ya sea EvalSavedModel o el modelo guardado de Keras) como 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 adicional de "validaciones". El formato de carga útil es ValidationResult . La salida tendrá "validation_ok" establecido en True cuando no haya fallas. Cuando hay fallas, se proporciona información sobre las métricas asociadas, los umbrales y los valores de las métricas que se observaron. El siguiente es un ejemplo en el que "weighted_examle_count" está fallando en un umbral de valor (1.5 no es menor que 1.0, por lo tanto, la falla):

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