Convalide del modello di analisi del modello Tensorflow

Panoramica

TFMA supporta la convalida di un modello impostando soglie di valore e soglie di modifica in base alle metriche supportate .

Configurazione

SogliaValoreGenerico

La soglia del valore è utile per delimitare il modello candidato controllando se i parametri corrispondenti sono maggiori di un limite inferiore e/o minori di un limite superiore. L'utente può impostare uno o entrambi i valori lower_bound e upper_bound. Il lower_bound è predefinito su infinito negativo se non impostato e il limite superiore è predefinito su infinito se non impostato.

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

Soglia di modifica generica

La soglia di modifica è utile per delimitare il modello candidato controllando se la metrica corrispondente è maggiore/minore di quella di un modello di base. Esistono due modi in cui è possibile misurare il cambiamento: cambiamento assoluto e cambiamento relativo. La variazione assoluta viene calcolata come differenza di valore tra le metriche del modello candidato e quello di base, vale a dire v_c - v_b dove v_c denota il valore della metrica candidata e v_b indica il valore della linea di base. Il valore relativo è la differenza relativa tra la metrica del candidato e la linea di base, ovvero v_c/v_b . La soglia assoluta e quella relativa possono coesistere nel modello a cancello secondo entrambi i criteri. Oltre a impostare i valori di soglia, l'utente deve anche configurare MetricDirection. per parametri con valori favorevolmente più alti (ad esempio, AUC), impostare la direzione su HIGHER_IS_BETTER, per parametri con valori favorevolmente più bassi (ad esempio, perdita), impostare la direzione su LOWER_IS_BETTER. Le soglie di modifica richiedono la valutazione di un modello di base insieme al modello candidato. Consulta la guida introduttiva per un esempio.

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)

Mettere insieme le cose

L'esempio seguente combina le soglie di valore e di modifica:

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)

Potrebbe essere più leggibile scrivere la configurazione in 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())

È possibile impostare MetricThreshold per eseguire il gate su entrambi i parametri del tempo di formazione del modello (modello salvato EvalSavedModel o Keras) e sui parametri di post-formazione (definiti nella configurazione TFMA). Per le metriche Training Time, le soglie sono specificate in tfma.MetricsSpec:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

Per le metriche post-addestramento, le soglie sono definite direttamente in tfma.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

Ecco un esempio insieme alle altre impostazioni in 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)

Produzione

Oltre al file di parametri generato dal valutatore, quando viene utilizzata la convalida, viene generato anche un ulteriore file di "convalide". Il formato del payload è ValidationResult . L'output avrà "validation_ok" impostato su True quando non si verificano errori. In caso di errori, vengono fornite informazioni sui parametri associati, sulle soglie e sui valori dei parametri osservati. Di seguito è riportato un esempio in cui "weighted_examle_count" non supera una soglia di valore (1,5 non è inferiore a 1,0, quindi l'errore):

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

Panoramica

TFMA supporta la convalida di un modello impostando soglie di valore e soglie di modifica in base alle metriche supportate .

Configurazione

SogliaValoreGenerico

La soglia del valore è utile per delimitare il modello candidato controllando se i parametri corrispondenti sono maggiori di un limite inferiore e/o minori di un limite superiore. L'utente può impostare uno o entrambi i valori lower_bound e upper_bound. Il lower_bound è predefinito su infinito negativo se non impostato e il limite superiore è predefinito su infinito se non impostato.

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

Soglia di modifica generica

La soglia di modifica è utile per delimitare il modello candidato controllando se la metrica corrispondente è maggiore/minore di quella di un modello di base. Esistono due modi in cui è possibile misurare il cambiamento: cambiamento assoluto e cambiamento relativo. La variazione assoluta viene calcolata come differenza di valore tra le metriche del modello candidato e quello di base, vale a dire v_c - v_b dove v_c denota il valore della metrica candidata e v_b indica il valore della linea di base. Il valore relativo è la differenza relativa tra la metrica del candidato e la linea di base, ovvero v_c/v_b . La soglia assoluta e quella relativa possono coesistere nel modello a cancello secondo entrambi i criteri. Oltre a impostare i valori di soglia, l'utente deve anche configurare MetricDirection. per parametri con valori favorevolmente più alti (ad esempio, AUC), impostare la direzione su HIGHER_IS_BETTER, per parametri con valori favorevolmente più bassi (ad esempio, perdita), impostare la direzione su LOWER_IS_BETTER. Le soglie di modifica richiedono la valutazione di un modello di base insieme al modello candidato. Consulta la guida introduttiva per un esempio.

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)

Mettere insieme le cose

L'esempio seguente combina le soglie di valore e di modifica:

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)

Potrebbe essere più leggibile scrivere la configurazione in 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())

È possibile impostare MetricThreshold per eseguire il gate su entrambi i parametri del tempo di formazione del modello (modello salvato EvalSavedModel o Keras) e sui parametri di post-formazione (definiti nella configurazione TFMA). Per le metriche Training Time, le soglie sono specificate in tfma.MetricsSpec:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

Per le metriche post-addestramento, le soglie sono definite direttamente in tfma.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

Ecco un esempio insieme alle altre impostazioni in 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)

Produzione

Oltre al file di parametri generato dal valutatore, quando viene utilizzata la convalida, viene generato anche un ulteriore file di "convalide". Il formato del payload è ValidationResult . L'output avrà "validation_ok" impostato su True quando non si verificano errori. In caso di errori, vengono fornite informazioni sui parametri associati, sulle soglie e sui valori dei parametri osservati. Di seguito è riportato un esempio in cui "weighted_examle_count" non supera una soglia di valore (1,5 non è inferiore a 1,0, quindi l'errore):

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