Treten Sie der SIG TFX-Addons-Community bei und helfen Sie mit, TFX noch besser zu machen! SIG TFX-Addons beitreten

Tensorflow-Modellanalyse Modellvalidierungen

Überblick

TFMA unterstützt die Validierung eines Modells durch Einrichten von Wertschwellenwerten und Ändern von Schwellenwerten basierend auf den unterstützten Metriken .

Aufbau

GenericValueThreshold

Der Werteschwellenwert ist nützlich, um das Kandidatenmodell zu steuern, indem geprüft wird, ob die entsprechenden Metriken größer als eine Untergrenze und / oder kleiner als eine Obergrenze sind. Der Benutzer kann entweder einen oder beide Werte für die untere und die obere Grenze festlegen. Die untere Grenze ist standardmäßig negativ unendlich, wenn sie nicht gesetzt ist, und die obere Grenze ist standardmäßig unendlich, wenn sie nicht gesetzt ist.

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

Das Ändern des Dreierwerts ist nützlich, um das Kandidatenmodell zu überprüfen, indem überprüft wird, ob die entsprechende Metrik größer / kleiner als die eines Basismodells ist. Es gibt zwei Möglichkeiten, wie die Änderung gemessen werden kann: absolute Änderung und relative Änderung. Die absolute Änderung wird als Wertdifferenz zwischen den Metriken des Kandidaten- und des Basismodells berechnet, nämlich v_c - v_b, wobei v_c den Metrikwert des Kandidaten und v_b den Basislinienwert bezeichnet. Der relative Wert ist die relative Differenz zwischen der Metrik des Kandidaten und der Basislinie, nämlich v_c / v_b . Der absolute und der relative Schwellenwert können nach beiden Kriterien neben dem Gate-Modell existieren. Neben dem Einrichten von Schwellenwerten muss der Benutzer auch die MetricDirection konfigurieren. Setzen Sie für Metriken mit günstigeren höheren Werten (z. B. AUC) die Richtung auf HIGHER_IS_BETTER, für Metriken mit günstigeren niedrigeren Werten (z. B. Verlust) die Richtung auf LOWER_IS_BETTER. Für Änderungsschwellenwerte muss ein Basismodell zusammen mit dem Kandidatenmodell bewertet werden. Ein Beispiel finden Sie im Handbuch Erste Schritte .

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)

Dinge zusammenfügen

Das folgende Beispiel kombiniert Wert- und Änderungsschwellenwerte:

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)

Es ist möglicherweise besser lesbar, die Konfiguration im Proto-Format aufzuschreiben:

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

Der MetricThreshold kann so eingestellt werden, dass er sowohl die Metriken für die Trainingszeit des Modells (entweder EvalSavedModel oder das von Keras gespeicherte Modell) als auch die Metriken für das Post-Training (in der TFMA-Konfiguration definiert) berücksichtigt. Für Trainingszeitmetriken werden die Schwellenwerte in der tfma.MetricsSpec angegeben:

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

Für Metriken nach dem Training werden Schwellenwerte direkt in der tfma.MetricConfig definiert:

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

Hier ist ein Beispiel zusammen mit den anderen Einstellungen in der 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)

Ausgabe

Zusätzlich zu der vom Evaluator ausgegebenen Metrikdatei wird bei Verwendung der Validierung auch eine zusätzliche "Validierungs" -Datei ausgegeben. Das Nutzdatenformat ist ValidationResult . Für die Ausgabe wird "validation_ok" auf True gesetzt, wenn keine Fehler vorliegen. Bei Fehlern werden Informationen zu den zugehörigen Metriken, den Schwellenwerten und den beobachteten Metrikwerten bereitgestellt. Das folgende Beispiel zeigt, dass der "weighted_examle_count" einen Werteschwellenwert nicht erfüllt (1,5 ist nicht kleiner als 1,0, daher der Fehler):

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