Validações do modelo de análise do modelo Tensorflow

Visão geral

O TFMA oferece suporte à validação de um modelo configurando limites de valor e limites de alteração com base nas métricas suportadas .

Configuração

Limite de valor genérico

O limite de valor é útil para delimitar o modelo candidato, verificando se a métrica correspondente é maior que um limite inferior e/ou menor que um limite superior. O usuário pode definir um ou ambos os valores de limite inferior e limite superior. O limite inferior é o padrão para infinito negativo se não for definido, e o limite superior é o padrão para infinito se não for 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))

Limite de mudança genérico

O limite de mudança é útil para delimitar o modelo candidato, verificando se a métrica correspondente é maior/menor que a de um modelo de linha de base. Existem duas maneiras de medir a mudança: mudança absoluta e mudança relativa. A mudança absoluta é calculada como a diferença de valor entre as métricas do candidato e do modelo de linha de base, ou seja, v_c - v_b onde v_c denota o valor da métrica candidata e v_b denota o valor da linha de base. O 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 relativo podem coexistir no modelo de portão por ambos os critérios. Além de configurar valores limite, o usuário também precisa configurar o MetricDirection. para métricas com valores favoravelmente mais altos (por exemplo, AUC), defina a direção como HIGHER_IS_BETTER; para métricas com valores favoravelmente mais baixos (por exemplo, perda), defina a direção como LOWER_IS_BETTER. Os limites de mudança exigem que um modelo de linha de base seja avaliado junto com o modelo candidato. Consulte o guia de primeiros passos para obter 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 alteração:

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 anotar a configuração em 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 controlar as métricas de tempo de treinamento do modelo (modelo salvo EvalSavedModel ou Keras) e métricas 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 adicional de "validações" também é gerado. O formato da carga útil é 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 }
     
}
   
}
 
}