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