Visão geral
TFMA suporta validação de um modelo através da criação de valores máximos e limiares de mudança com base nas métricas compatíveis .
Configuração
GenericValueThreshold
O limite de valor é útil para bloquear o modelo candidato, verificando se as métricas correspondentes são maiores que um limite inferior e / ou menores que um limite superior. O usuário pode definir um ou ambos os valores lower_bound e upper_bound. O limite inferior é o padrão para infinito negativo se não definido, e o limite superior é o infinito se não definido.
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
Alterar o limite é útil para bloquear o modelo candidato, verificando se a métrica correspondente é maior / menor do que a de um modelo de linha de base. Existem duas maneiras de medir a mudança: mudança absoluta e mudança relativa. Aboslute mudança é calculado como o valor de diferença entre as métricas do modelo candidato e de linha de base, ou seja, V_C - v_b onde V_C indica o valor da métrica candidato e v_b indica o valor da linha de base. Valor relativo é a diferença relativa entre a métrica do candidato e a linha de base, ou seja, V_C / v_b. O limite absoluto e o relativo podem coexistir para o modelo de porta por ambos os critérios. Além de definir os valores de limite, o usuário também precisa configurar MetricDirection. para métricas com valores favoravelmente mais altos (por exemplo, AUC), defina a direção para HIGHER_IS_BETTER, para métricas com valores favoravelmente mais baixos (por exemplo, perda), defina a direção para LOWER_IS_BETTER. Os limites de mudança requerem que um modelo de linha de base seja avaliado junto com o modelo candidato. Veja Guia de Primeiros Passos para um exemplo.
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 as coisas
O exemplo a seguir combina valores e limites de mudança:
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)
Pode ser mais legível escrever a configuração no 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())
O MetricThreshold pode ser definido para funcionar nas métricas de Tempo de treinamento do modelo (modelo salvo EvalSavedModel ou Keras) e nas métricas de pós-treinamento (definidas na configuração do TFMA). Para métricas de tempo de treinamento, os limites são especificados no tfma.MetricsSpec:
metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})
Para métricas pós-treinamento, os limites são definidos diretamente no tfma.MetricConfig:
metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
threshold=lower_bound)
Aqui está um exemplo junto com as outras configurações no 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)
Saída
Além da saída do arquivo de métricas pelo avaliador, quando a validação é usada, um arquivo de "validações" adicional também é gerado. A carga útil formato é ValidationResult . A saída terá "validation_ok" definido como True quando não houver falhas. Quando há falhas, são fornecidas informações sobre as métricas associadas, os limites e os valores das métricas que foram observados. A seguir está um exemplo em que "weighted_examle_count" está falhando em um limite de valor (1,5 não é menor que 1,0, portanto, a falha):
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 }
}
}
}