Validations du modèle d'analyse du modèle Tensorflow

Aperçu

TFMA prend en charge la validation d'un modèle en définissant des seuils de valeur et des seuils de modification en fonction des métriques prises en charge .

Configuration

Seuil de valeur générique

Le seuil de valeur est utile pour contrôler le modèle candidat en vérifiant si la métrique correspondante est supérieure à une limite inférieure et/ou inférieure à une limite supérieure. L'utilisateur peut définir l'une ou les deux valeurs lower_bound et upper_bound. Le lower_bound est par défaut à l'infini négatif s'il n'est pas défini, et le upper_bound est par défaut à l'infini s'il n'est pas défini.

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

Seuil de changement générique

Le seuil de changement est utile pour contrôler le modèle candidat en vérifiant si la métrique correspondante est plus grande/plus petite que celle d'un modèle de référence. Il existe deux manières de mesurer le changement : le changement absolu et le changement relatif. Le changement absolu est calculé comme la différence de valeur entre les métriques du modèle candidat et du modèle de base, à savoir v_c - v_bv_c désigne la valeur métrique candidate et v_b désigne la valeur de base. La valeur relative est la différence relative entre la métrique du candidat et la ligne de base, à savoir v_c/v_b . Les seuils absolu et relatif peuvent coexister pour déclencher le modèle selon les deux critères. Outre la configuration des valeurs de seuil, l'utilisateur doit également configurer MetricDirection. pour les métriques avec des valeurs favorablement plus élevées (par exemple, AUC), définissez la direction sur HIGHER_IS_BETTER, pour les métriques avec des valeurs favorablement inférieures (par exemple, perte), définissez la direction sur LOWER_IS_BETTER. Les seuils de changement nécessitent qu'un modèle de base soit évalué avec le modèle candidat. Voir le guide de démarrage pour un exemple.

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)

Mettre les choses ensemble

L'exemple suivant combine des seuils de valeur et de modification :

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)

Il serait peut-être plus lisible d'écrire la configuration au format 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())

Le MetricThreshold peut être défini pour s'appliquer aux métriques de temps de formation du modèle (soit le modèle enregistré EvalSavedModel ou Keras) et aux métriques post-formation (définies dans la configuration TFMA). Pour les métriques Training Time, les seuils sont spécifiés dans tfma.MetricsSpec :

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

Pour les métriques post-formation, les seuils sont définis directement dans tfma.MetricConfig :

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

Voici un exemple avec les autres paramètres dans 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)

Sortir

En plus du fichier de métriques généré par l'évaluateur, lorsque la validation est utilisée, un fichier de « validations » supplémentaire est également généré. Le format de charge utile est ValidationResult . La sortie aura "validation_ok" défini sur True lorsqu'il n'y aura aucun échec. En cas d'échecs, des informations sont fournies sur les métriques associées, les seuils et les valeurs de métriques observées. Voici un exemple dans lequel « weighted_examle_count » échoue à un seuil de valeur (1,5 n'est pas inférieur à 1,0, d'où l'échec) :

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