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

TensorFlow-Modellanalyse

Ein Beispiel für eine Schlüsselkomponente von TensorFlow Extended (TFX)

TensorFlow Model Analysis (TFMA) ist eine Bibliothek zur Durchführung der Modellbewertung über verschiedene Datenscheiben hinweg. TFMA führt seine Berechnungen mit Apache Beam verteilt über große Datenmengen durch.

Dieses beispielhafte Colab-Notebook veranschaulicht, wie TFMA verwendet werden kann, um die Leistung eines Modells in Bezug auf die Merkmale des Datensatzes zu untersuchen und zu visualisieren. Wir verwenden ein Modell, das wir zuvor trainiert haben, und jetzt können Sie mit den Ergebnissen spielen! Das von uns trainierte Modell war für das Chicago Taxi Example , das das von der Stadt Chicago veröffentlichte Dataset Taxi Trips verwendet. Erkunden Sie das vollständige Dataset in der BigQuery-Benutzeroberfläche .

Denken Sie als Modellierer und Entwickler darüber nach, wie diese Daten verwendet werden und welche Vorteile und Schäden die Vorhersagen eines Modells verursachen können. Ein solches Modell könnte gesellschaftliche Vorurteile und Disparitäten verstärken. Ist ein Feature relevant für das Problem, das Sie lösen möchten, oder führt es zu Verzerrungen? Weitere Informationen finden Sie unter ML-Fairness .

Die Spalten im Datensatz sind:

pickup_community_area Fahrpreis trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
Pickup_Latitude Pickup_Längengrad dropoff_latitude
dropoff_longitude trip_miles pickup_census_tract
dropoff_census_tract Zahlungsart Unternehmen
trip_seconds dropoff_community_area Tipps

Jupyter-Erweiterungen installieren

jupyter nbextension enable --py widgetsnbextension --sys-prefix 
jupyter nbextension install --py --symlink tensorflow_model_analysis --sys-prefix 
jupyter nbextension enable --py tensorflow_model_analysis --sys-prefix 

TensorFlow-Modellanalyse (TFMA) installieren

Dies zieht alle Abhängigkeiten ein und dauert eine Minute.

# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis

Jetzt müssen Sie die Laufzeit neu starten, bevor Sie die folgenden Zellen ausführen.

# This setup was tested with TF 2.5 and TFMA 0.31 (using colab), but it should
# also work with the latest release.
import sys

# Confirm that we're using Python 3
assert sys.version_info.major==3, 'This notebook must be run using Python 3.'

import tensorflow as tf
print('TF version: {}'.format(tf.__version__))
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
TF version: 2.5.0
Beam version: 2.29.0
TFMA version: 0.31.0

Laden Sie die Dateien

Wir laden eine tar-Datei herunter, die alles enthält, was wir brauchen. Das beinhaltet:

  • Trainings- und Bewertungsdatensätze
  • Datenschema
  • Gespeicherte Modelle (Keras und Schätzer) trainieren und bereitstellen und gespeicherte Modelle (Schätzer) bewerten.
# Download the tar file from GCP and extract it
import io, os, tempfile
TAR_NAME = 'saved_models-2.2'
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, TAR_NAME, 'data')
MODELS_DIR = os.path.join(BASE_DIR, TAR_NAME, 'models')
SCHEMA = os.path.join(BASE_DIR, TAR_NAME, 'schema.pbtxt')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')

!curl -O https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/{TAR_NAME}.tar
!tar xf {TAR_NAME}.tar
!mv {TAR_NAME} {BASE_DIR}
!rm {TAR_NAME}.tar

print("Here's what we downloaded:")
!ls -R {BASE_DIR}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6800k  100 6800k    0     0  25.0M      0 --:--:-- --:--:-- --:--:-- 25.0M
Here's what we downloaded:
/tmp/tmpsu298d8g:
saved_models-2.2

/tmp/tmpsu298d8g/saved_models-2.2:
data  models  schema.pbtxt

/tmp/tmpsu298d8g/saved_models-2.2/data:
eval  train

/tmp/tmpsu298d8g/saved_models-2.2/data/eval:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/data/train:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/models:
estimator  keras

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator:
eval_model_dir  serving_model_dir

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir:
1591221811

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811:
saved_model.pb  tmp.pbtxt  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir:
checkpoint
eval_chicago-taxi-eval
events.out.tfevents.1591221780.my-pipeline-b57vp-237544850
export
graph.pbtxt
model.ckpt-100.data-00000-of-00001
model.ckpt-100.index
model.ckpt-100.meta

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export:
chicago-taxi

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi:
1591221801

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras:
0  1  2

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2/variables:
variables.data-00000-of-00001  variables.index

Parsen des Schemas

Unter anderem haben wir ein Schema für unsere Daten heruntergeladen, das von TensorFlow Data Validation erstellt wurde . Lassen Sie uns das jetzt analysieren, damit wir es mit TFMA verwenden können.

import tensorflow as tf
from google.protobuf import text_format
from tensorflow.python.lib.io import file_io
from tensorflow_metadata.proto.v0 import schema_pb2
from tensorflow.core.example import example_pb2

schema = schema_pb2.Schema()
contents = file_io.read_file_to_string(SCHEMA)
schema = text_format.Parse(contents, schema)

Verwenden Sie das Schema, um TFRecords zu erstellen

Wir müssen TFMA Zugriff auf unseren Datensatz gewähren, also erstellen wir eine TFRecords-Datei. Wir können unser Schema verwenden, um es zu erstellen, da es uns den richtigen Typ für jedes Feature gibt.

import csv

datafile = os.path.join(DATA_DIR, 'eval', 'data.csv')
reader = csv.DictReader(open(datafile, 'r'))
examples = []
for line in reader:
  example = example_pb2.Example()
  for feature in schema.feature:
    key = feature.name
    if feature.type == schema_pb2.FLOAT:
      example.features.feature[key].float_list.value[:] = (
          [float(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.INT:
      example.features.feature[key].int64_list.value[:] = (
          [int(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.BYTES:
      example.features.feature[key].bytes_list.value[:] = (
          [line[key].encode('utf8')] if len(line[key]) > 0 else [])
  # Add a new column 'big_tipper' that indicates if tips was > 20% of the fare. 
  # TODO(b/157064428): Remove after label transformation is supported for Keras.
  big_tipper = float(line['tips']) > float(line['fare']) * 0.2
  example.features.feature['big_tipper'].float_list.value[:] = [big_tipper]
  examples.append(example)

tfrecord_file = os.path.join(BASE_DIR, 'train_data.rio')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
  for example in examples:
    writer.write(example.SerializeToString())

!ls {tfrecord_file}
/tmp/tmpsu298d8g/train_data.rio

TFMA einrichten und ausführen

TFMA unterstützt eine Reihe verschiedener Modelltypen, darunter TF-Keras-Modelle, Modelle, die auf generischen TF2-Signatur-APIs basieren, sowie TF-Schätzer-basierte Modelle. Das Handbuch get_started enthält die vollständige Liste der unterstützten Modelltypen und alle Einschränkungen. In diesem Beispiel zeigen wir, wie ein kerasbasiertes Modell sowie ein als EvalSavedModel gespeichertes EvalSavedModel basiertes Modell EvalSavedModel . Beispiele für andere Konfigurationen finden Sie in den FAQ .

TFMA bietet Unterstützung für die Berechnung von Metriken, die während des Trainings verwendet wurden (dh integrierte Metriken) sowie Metriken, die nach dem Speichern des Modells als Teil der TFMA-Konfigurationseinstellungen definiert wurden. Für unser Keras- Setup zeigen wir, wie Sie unsere Metriken und Plots manuell als Teil unserer Konfiguration hinzufügen (Informationen zu den unterstützten Metriken und Plots finden Sie im Metriken- Leitfaden). Für die Einrichtung des Schätzers verwenden wir die integrierten Metriken, die mit dem Modell gespeichert wurden. Unsere Setups beinhalten auch eine Reihe von Slicing-Spezifikationen, die in den folgenden Abschnitten genauer beschrieben werden.

Nachdem wir tfma.EvalConfig und tfma.EvalSharedModel haben, können wir TFMA mit tfma.run_model_analysis . Dadurch wird ein tfma.EvalResult das wir später zum Rendern unserer Metriken und Diagramme verwenden können.

Keras

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
keras_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # For keras (and serving models) we need to add a `label_key`.
    label_key: "big_tipper"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our keras model.
keras_model_path = os.path.join(MODELS_DIR, 'keras', '2')
keras_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=keras_model_path,
    eval_config=keras_eval_config)

keras_output_path = os.path.join(OUTPUT_DIR, 'keras')

# Run TFMA
keras_eval_result = tfma.run_model_analysis(
    eval_shared_model=keras_eval_shared_model,
    eval_config=keras_eval_config,
    data_location=tfrecord_file,
    output_path=keras_output_path)
​​
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

Schätzer

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
estimator_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # To use EvalSavedModel set `signature_name` to "eval".
    signature_name: "eval"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our eval saved model.
estimator_base_model_path = os.path.join(
    MODELS_DIR, 'estimator', 'eval_model_dir')
estimator_model_path = os.path.join(
    estimator_base_model_path, os.listdir(estimator_base_model_path)[0])
estimator_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=estimator_model_path,
    eval_config=estimator_eval_config)

estimator_output_path = os.path.join(OUTPUT_DIR, 'estimator')

# Run TFMA
estimator_eval_result = tfma.run_model_analysis(
    eval_shared_model=estimator_eval_shared_model,
    eval_config=estimator_eval_config,
    data_location=tfrecord_file,
    output_path=estimator_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.

Visualisierung von Metriken und Diagrammen

Nachdem wir nun die Auswertung durchgeführt haben, werfen wir einen Blick auf unsere Visualisierungen mit TFMA. Für die folgenden Beispiele visualisieren wir die Ergebnisse der Auswertung am Keras-Modell. Um das auf Schätzung basierende Modell eval_result , aktualisieren Sie eval_result , dass es auf unsere Variable estimator_eval_result .

eval_result = keras_eval_result
# eval_result = estimator_eval_result

Rendering-Metriken

Um Metriken tfma.view.render_slicing_metrics Sie tfma.view.render_slicing_metrics

Standardmäßig zeigen die Ansichten das Overall Slice an. Um ein bestimmtes Slice anzuzeigen, können Sie entweder den Namen der Spalte verwenden (indem Sie slicing_column ) oder eine tfma.SlicingSpec .

Die Metrik-Visualisierung unterstützt die folgenden Interaktionen:

  • Klicken und ziehen, um zu schwenken
  • Zum Zoomen scrollen
  • Rechtsklick um die Ansicht zurückzusetzen
  • Bewegen Sie den Mauszeiger über den gewünschten Datenpunkt, um weitere Details anzuzeigen.
  • Wählen Sie mithilfe der Auswahlmöglichkeiten unten aus vier verschiedenen Ansichtstypen aus.

Zum Beispiel werden wir slicing_column so einstellen, slicing_column die Funktion trip_start_hour aus unseren vorherigen slicing_specs .

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_hour')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_hour:2', …

Slices-Übersicht

Die Standardvisualisierung ist die Slices-Übersicht, wenn die Anzahl der Slices gering ist. Es zeigt die Werte der Metriken für jedes Segment an. Da wir oben trip_start_hour ausgewählt trip_start_hour , werden Metriken wie Genauigkeit und AUC für jede Stunde trip_start_hour , trip_start_hour wir nach Problemen suchen können, die für einige Stunden spezifisch sind und für andere nicht.

In der obigen Visualisierung:

  • Versuchen Sie, die Feature-Spalte, die unsere trip_start_hours Funktion ist, zu trip_start_hours , indem Sie auf die Spaltenüberschrift klicken
  • Versuchen Sie, nach Genauigkeit zu sortieren, und beachten Sie, dass die Genauigkeit für einige Stunden mit Beispielen 0 beträgt, was auf ein Problem hinweisen kann

Das Diagramm ermöglicht es uns auch, verschiedene Metriken in unseren Slices auszuwählen und anzuzeigen.

  • Versuchen Sie, verschiedene Metriken aus dem Menü "Anzeigen" auszuwählen
  • Versuchen Sie, Rückruf im Menü " Anzeigen " auszuwählen, und beachten Sie, dass der Rückruf für einige der Stunden mit Beispielen 0 ist, was auf ein Problem hinweisen kann

Es ist auch möglich, einen Schwellenwert festzulegen, um Slices mit einer geringeren Anzahl von Beispielen oder "Gewichtungen" herauszufiltern. Sie können eine Mindestanzahl von Beispielen eingeben oder den Schieberegler verwenden.

Metrik-Histogramm

Diese Ansicht unterstützt auch ein Metrikhistogramm als alternative Visualisierung, die auch die Standardansicht ist, wenn die Anzahl der Schichten groß ist. Die Ergebnisse werden in Buckets aufgeteilt und die Anzahl der Scheiben / Gesamtgewichte / beides kann visualisiert werden. Spalten können durch Klicken auf die Spaltenüberschrift sortiert werden. Slices mit kleinen Gewichten können durch Einstellen des Schwellenwerts herausgefiltert werden. Eine weitere Filterung kann durch Ziehen des grauen Bandes vorgenommen werden. Um den Bereich zurückzusetzen, doppelklicken Sie auf das Band. Durch Filtern können auch Ausreißer in der Visualisierung und den Metriktabellen entfernt werden. Klicken Sie auf das Zahnradsymbol, um zu einer logarithmischen Skala anstelle einer linearen Skala zu wechseln.

  • Versuchen Sie, im Visualisierungsmenü "Metrik-Histogramm" auszuwählen

Mehr Scheiben

Unsere anfängliche tfma.EvalConfig hat eine ganze Liste von slicing_specs , die wir visualisieren können, indem wir die an tfma.view.render_slicing_metrics Slice-Informationen tfma.view.render_slicing_metrics . Hier wählen wir das trip_start_day (Wochentage). Versuchen Sie, trip_start_day in trip_start_day zu trip_start_month und erneut zu rendern, um verschiedene Slices zu untersuchen.

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…

TFMA unterstützt auch das Erstellen von Merkmalskreuzen, um Kombinationen von Merkmalen zu analysieren. Unsere ursprünglichen Einstellungen haben eine trip_start_hour und trip_start_day :

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_hour', 'trip_start_day']))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

Durch das Kreuzen der beiden Säulen entstehen viele Kombinationen! Lassen Sie uns unser Kreuz eingrenzen, um nur Fahrten zu betrachten, die mittags beginnen . binary_accuracy wir dann binary_accuracy aus der Visualisierung aus:

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_day'], feature_values={'trip_start_hour': '12'}))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

Darstellungen rendern Plot

Alle Diagramme, die der tfma.EvalConfig als tfma.EvalConfig nach dem Training metric_specs können mit tfma.view.render_plot angezeigt werden.

Wie bei Metriken können Diagramme nach Slice angezeigt werden. Im Gegensatz zu Metriken können nur Diagramme für einen bestimmten Slice-Wert angezeigt werden, sodass tfma.SlicingSpec verwendet werden muss und sowohl ein Slice-Feature-Name als auch ein Wert angegeben werden müssen. Wenn kein Slice bereitgestellt wird, werden die Plots für den Overall Slice verwendet.

Im folgenden Beispiel zeigen wir die CalibrationPlot und ConfusionMatrixPlot Plots an, die für die trip_start_hour:1 berechnet wurden.

tfma.view.render_plot(
    eval_result,
    tfma.SlicingSpec(feature_values={'trip_start_hour': '1'}))
PlotViewer(config={'sliceName': 'trip_start_hour:1', 'metricKeys': {'calibrationPlot': {'metricName': 'calibra…

Nachverfolgung der Modellleistung im Zeitverlauf

Ihr Trainings-Dataset wird zum Trainieren Ihres Modells verwendet und ist hoffentlich repräsentativ für Ihr Test-Dataset und die Daten, die in der Produktion an Ihr Modell gesendet werden. Obwohl die Daten in Inferenzanfragen mit Ihren Trainingsdaten identisch bleiben können, ändern sie sich in vielen Fällen jedoch so weit, dass sich die Leistung Ihres Modells ändert.

Das bedeutet, dass Sie die Leistung Ihres Modells kontinuierlich überwachen und messen müssen, damit Sie Änderungen erkennen und darauf reagieren können. Schauen wir uns an, wie TFMA helfen kann.

Lassen Sie uns 3 verschiedene Modellläufe laden und TFMA verwenden, um zu sehen, wie sie mit render_time_series verglichen werden.

# Note this re-uses the EvalConfig from the keras setup.

# Run eval on each saved model
output_paths = []
for i in range(3):
  # Create a tfma.EvalSharedModel that points at our saved model.
  eval_shared_model = tfma.default_eval_shared_model(
      eval_saved_model_path=os.path.join(MODELS_DIR, 'keras', str(i)),
      eval_config=keras_eval_config)

  output_path = os.path.join(OUTPUT_DIR, 'time_series', str(i))
  output_paths.append(output_path)

  # Run TFMA
  tfma.run_model_analysis(eval_shared_model=eval_shared_model,
                          eval_config=keras_eval_config,
                          data_location=tfrecord_file,
                          output_path=output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Zuerst stellen wir uns vor, dass wir unser Modell gestern trainiert und bereitgestellt haben, und nun wollen wir sehen, wie es mit den neuen Daten abschneidet, die heute eintreffen. Die Visualisierung beginnt mit der Anzeige von AUC. Über die Benutzeroberfläche können Sie:

  • Fügen Sie weitere Messwerte über das Menü "Messwertreihen hinzufügen" hinzu.
  • Schließen Sie unerwünschte Grafiken, indem Sie auf x klicken
  • Bewegen Sie den Mauszeiger über Datenpunkte (die Enden von Liniensegmenten im Diagramm), um weitere Details zu erhalten
eval_results_from_disk = tfma.load_eval_results(output_paths[:2])

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Jetzt stellen wir uns vor, dass ein weiterer Tag vergangen ist, und wir möchten sehen, wie es mit den neuen Daten, die heute eingehen, im Vergleich zu den beiden vorherigen Tagen abschneidet:

eval_results_from_disk = tfma.load_eval_results(output_paths)

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Modell Bestätigung

TFMA kann so konfiguriert werden, dass mehrere Modelle gleichzeitig bewertet werden. In der Regel wird dies durchgeführt, um ein neues Modell mit einer Baseline (wie dem aktuell bereitgestellten Modell) zu vergleichen, um die Leistungsunterschiede in den Metriken (z. B. AUC usw.) relativ zur Baseline zu bestimmen. Wenn Schwellenwerte konfiguriert sind, erstellt TFMA einen tfma.ValidationResult Datensatz, der angibt, ob die Leistung den Erwartungen entspricht.

Lassen Sie uns unsere Keras-Bewertung neu konfigurieren, um zwei Modelle zu vergleichen: einen Kandidaten und eine Baseline. Außerdem validieren wir die Leistung des Kandidaten anhand der Baseline, indem tmfa.MetricThreshold einen tmfa.MetricThreshold für die AUC-Metrik tmfa.MetricThreshold .

# Setup tfma.EvalConfig setting
eval_config_with_thresholds = text_format.Parse("""
  ## Model information
  model_specs {
    name: "candidate"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
  }
  model_specs {
    name: "baseline"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
    is_baseline: true
  }

  ## Post training metric information
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics {
      class_name: "AUC"
      threshold {
        # Ensure that AUC is always > 0.9
        value_threshold {
          lower_bound { value: 0.9 }
        }
        # Ensure that AUC does not drop by more than a small epsilon
        # e.g. (candidate - baseline) > -1e-10 or candidate > baseline - 1e-10
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_keys: ["trip_start_month"]
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create tfma.EvalSharedModels that point at our keras models.
candidate_model_path = os.path.join(MODELS_DIR, 'keras', '2')
baseline_model_path = os.path.join(MODELS_DIR, 'keras', '1')
eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path=candidate_model_path,
      eval_config=eval_config_with_thresholds),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path=baseline_model_path,
      eval_config=eval_config_with_thresholds),
]

validation_output_path = os.path.join(OUTPUT_DIR, 'validation')

# Run TFMA
eval_result_with_validation = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config_with_thresholds,
    data_location=tfrecord_file,
    output_path=validation_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

Wenn Evaluierungen mit einem oder mehreren Modellen gegen eine Baseline ausgeführt werden, fügt TFMA automatisch Differenzmetriken für alle während der Evaluierung berechneten Metriken hinzu. Diese Metriken werden nach der entsprechenden Metrik benannt, wobei jedoch _diff an den _diff angehängt wird.

Werfen wir einen Blick auf die Metriken unseres Laufs:

tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

Sehen wir uns nun die Ausgabe unserer Validierungsprüfungen an. Um die Validierungsergebnissetfma.load_validator_result wirtfma.load_validator_result . In unserem Beispiel schlägt die Validierung fehl, weil die AUC unter dem Schwellenwert liegt.

validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False