¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Validaciones del modelo de análisis del modelo de Tensorflow

Descripción general

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

Configuración

GenericValueThreshold

El umbral de valor es útil para controlar el modelo candidato comprobando si las métricas correspondientes son más grandes que un límite inferior y / o más pequeñas 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 está predeterminado en infinito negativo si no está configurado, y el límite superior está predeterminado en 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))

GenericChangeThreshold

Cambiar umbral es útil para controlar el modelo candidato comprobando si la métrica correspondiente es mayor / menor que la de un modelo de referencia. Hay dos formas de medir el cambio: cambio absoluto y cambio relativo. Un cambio de canal se calcula como la diferencia de valor entre las métricas del modelo candidato y de línea de base, a saber, v_c - v_b donde v_c denota el valor de la métrica del candidato y v_b indica el valor de línea de base. El valor relativo es la diferencia relativa entre la métrica del candidato y 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 los 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. 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)

Poniendo las cosas juntas

El siguiente ejemplo combina valores y umbrales de 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 controlar las métricas de tiempo de entrenamiento del modelo (ya sea EvalSavedModel o modelo guardado de Keras) y métricas posteriores al entrenamiento (definidas en la configuración de TFMA). Para las métricas de Training Time, 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 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 el "conteo_de_examen ponderado" no alcanza un umbral de valor (1,5 no es menor que 1,0, por lo tanto, 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 }
      }
    }
  }