Ajuda a proteger a Grande Barreira de Corais com TensorFlow em Kaggle Junte Desafio

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

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