Un esempio di un componente chiave di TensorFlow Extended (TFX)
Tensorflow modello di analisi (TFMA) è una libreria per l'esecuzione di valutazione del modello tra le diverse fette di dati. TFMA svolge la sua calcoli in modo distribuito su grandi quantità di dati utilizzando Apache fascio .
Questo esempio di colab notebook illustra come utilizzare TFMA per indagare e visualizzare le prestazioni di un modello rispetto alle caratteristiche del set di dati. Useremo un modello che abbiamo addestrato in precedenza, e ora puoi giocare con i risultati! Il modello ci siamo allenati fosse per il Chicago taxi esempio , che utilizza il taxi Trips set di dati rilasciato dal Comune di Chicago. Esplora la piena set di dati in BigQuery UI .
In qualità di modellatore e sviluppatore, pensa a come vengono utilizzati questi dati e ai potenziali benefici e danni che le previsioni di un modello possono causare. Un modello come questo potrebbe rafforzare i pregiudizi e le disparità della società. Una caratteristica è rilevante per il problema che vuoi risolvere o introdurrà pregiudizi? Per ulteriori informazioni, leggere su ML correttezza .
Le colonne nel set di dati sono:
pick-up_community_area | tariffa | trip_start_month |
trip_start_hour | trip_start_day | trip_start_timestamp |
pickup_latitude | pickup_longitudine | dropoff_latitude |
dropoff_longitude | viaggio_miglia | pickup_census_tract |
dropoff_census_tract | modalità di pagamento | società |
trip_seconds | dropoff_community_area | Consigli |
Installa le estensioni Jupyter
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
Installa TensorFlow Model Analysis (TFMA)
Questo estrarrà tutte le dipendenze e richiederà un minuto.
# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis
Ora devi riavviare il runtime prima di eseguire le celle sottostanti.
# 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.4.4 Beam version: 2.34.0 TFMA version: 0.29.0
Carica i file
Scaricheremo un file tar che ha tutto ciò di cui abbiamo bisogno. Quello include:
- Dataset di formazione e valutazione
- Schema dei dati
- Addestrare e servire i modelli salvati (keras e estimator) e valutare i modelli salvati (estimator).
# 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 28.2M 0 --:--:-- --:--:-- --:--:-- 28.2M Here's what we downloaded: /tmp/tmp_at9q62d: saved_models-2.2 /tmp/tmp_at9q62d/saved_models-2.2: data models schema.pbtxt /tmp/tmp_at9q62d/saved_models-2.2/data: eval train /tmp/tmp_at9q62d/saved_models-2.2/data/eval: data.csv /tmp/tmp_at9q62d/saved_models-2.2/data/train: data.csv /tmp/tmp_at9q62d/saved_models-2.2/models: estimator keras /tmp/tmp_at9q62d/saved_models-2.2/models/estimator: eval_model_dir serving_model_dir /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir: 1591221811 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811: saved_model.pb tmp.pbtxt variables /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/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/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval: events.out.tfevents.1591221799.my-pipeline-b57vp-237544850 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export: chicago-taxi /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi: 1591221801 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras: 0 1 2 /tmp/tmp_at9q62d/saved_models-2.2/models/keras/0: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/0/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras/1: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/1/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras/2: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/2/variables: variables.data-00000-of-00001 variables.index
Analizza lo schema
Tra le cose che abbiamo scaricato era uno schema per i nostri dati che è stato creato da tensorflow Data Validation . Analizziamolo ora in modo da poterlo utilizzare con TFMA.
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)
Usa lo schema per creare TFRecords
Dobbiamo concedere a TFMA l'accesso al nostro set di dati, quindi creiamo un file TFRecords. Possiamo usare il nostro schema per crearlo, poiché ci fornisce il tipo corretto per ogni caratteristica.
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/tmp_at9q62d/train_data.rio
Configura ed esegui TFMA
TFMA supporta una serie di diversi tipi di modello, inclusi modelli TF Keras, modelli basati su API di firma TF2 generiche e modelli basati su stimatori TF. La get_started guida ha l'elenco completo dei tipi di modelli supportati e limitazioni. Per questo esempio stiamo per mostrare come configurare un modello basato keras così come un modello basato stimatore che è stato salvato come un EvalSavedModel
. Vedere la FAQ per gli esempi di altre configurazioni.
TFMA fornisce supporto per il calcolo delle metriche utilizzate al momento dell'addestramento (ovvero le metriche integrate) e delle metriche definite dopo che il modello è stato salvato come parte delle impostazioni di configurazione di TFMA. Per il nostro keras configurazione dimostreremo aggiungendo le nostre metriche e le trame manualmente come parte della nostra configurazione (vedi metriche guida per informazioni sulle metriche e le trame che sono supportati). Per l'impostazione dello stimatore utilizzeremo le metriche integrate che sono state salvate con il modello. Le nostre configurazioni includono anche una serie di specifiche di slicing che sono discusse in maggior dettaglio nelle sezioni seguenti.
Dopo aver creato un tfma.EvalConfig
e tfma.EvalSharedModel
possiamo quindi eseguire TFMA utilizzando tfma.run_model_analysis
. Questo creerà un tfma.EvalResult
cui possiamo utilizzare in seguito per il rendering nostre metriche e le trame.
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)
2021-12-04 10:18:15.463173: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory 2021-12-04 10:18:15.464249: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1757] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. Skipping registering GPU devices... WARNING:absl:Tensorflow version (2.4.4) 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:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. 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)`
Estimatore
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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. 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/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables INFO:tensorflow:Restoring parameters from /tmp/tmp_at9q62d/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.
Visualizzazione di metriche e grafici
Ora che abbiamo eseguito la valutazione, diamo un'occhiata alle nostre visualizzazioni utilizzando TFMA. Per i seguenti esempi, visualizzeremo i risultati dell'esecuzione della valutazione sul modello Keras. Per visualizzare l'aggiornamento del modello stimatore basato eval_result
a punto presso il nostro estimator_eval_result
variabile.
eval_result = keras_eval_result
# eval_result = estimator_eval_result
Metriche di rendering
Per visualizzare le metriche utilizzate tfma.view.render_slicing_metrics
Per impostazione predefinita, il punto di vista visualizzeranno il Overall
fetta. Per visualizzare una particolare fetta è possibile utilizzare il nome della colonna (per impostazione slicing_column
) o fornire una tfma.SlicingSpec
.
La visualizzazione delle metriche supporta le seguenti interazioni:
- Fare clic e trascinare per eseguire la panoramica
- Scorri per ingrandire
- Fare clic con il tasto destro per ripristinare la visualizzazione
- Passa il mouse sopra il punto dati desiderato per vedere maggiori dettagli.
- Seleziona da quattro diversi tipi di visualizzazioni utilizzando le selezioni in basso.
Ad esempio, saremo allestendo slicing_column
a guardare il trip_start_hour
funzione dalle nostre precedenti 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', …
Panoramica delle fette
La visualizzazione di default è il Fette Panoramica quando il numero di fette è piccolo. Mostra i valori delle metriche per ogni sezione. Dal momento che abbiamo selezionato trip_start_hour
sopra, ci sta mostrando metriche come la precisione e l'AUC per ogni ora, che ci permette di cercare i problemi che sono specifici per alcune ore e non altri.
Nella visualizzazione sopra:
- Provate l'ordinamento della colonna funzione, che è il nostro
trip_start_hours
presentano, facendo clic sul titolo della colonna - Prova l'ordinamento per la precisione, e notare che la precisione di alcune delle ore con esempi è 0, che può indicare un problema
Il grafico ci consente inoltre di selezionare e visualizzare diverse metriche nelle nostre sezioni.
- Prova a selezionare metriche diverse dal menu "Mostra"
- Prova selezionando richiamo nel menu "Visualizza", e notare che il richiamo di alcune delle ore con esempi è 0, che può indicare un problema
È anche possibile impostare una soglia per filtrare le sezioni con un numero inferiore di esempi o "pesi". Puoi digitare un numero minimo di esempi o utilizzare il dispositivo di scorrimento.
Istogramma delle metriche
Questa vista supporta anche un istogramma metriche come visualizzazione alternativa, che è anche la visualizzazione predefinita quando il numero di fette è grande. I risultati verranno suddivisi in bucket e sarà possibile visualizzare il numero di fette / pesi totali / entrambi. Le colonne possono essere ordinate facendo clic sull'intestazione della colonna. Le fette con pesi piccoli possono essere filtrate impostando la soglia. È possibile applicare ulteriori filtri trascinando la banda grigia. Per ripristinare l'intervallo, fare doppio clic sulla banda. Il filtro può essere utilizzato anche per rimuovere i valori anomali nella visualizzazione e nelle tabelle delle metriche. Fare clic sull'icona a forma di ingranaggio per passare a una scala logaritmica anziché a una scala lineare.
- Prova a selezionare "Istogramma metriche" nel menu Visualizzazione
Più fette
La nostra iniziale tfma.EvalConfig
ha creato tutta una serie di slicing_specs
, che possiamo visualizzare da informazioni fetta aggiornamento passato a tfma.view.render_slicing_metrics
. Qui selezioniamo il trip_start_day
fetta (giorni della settimana). Provare a cambiare il trip_start_day
per trip_start_month
e rendere di nuovo per esaminare diverse sezioni.
tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…
TFMA supporta anche la creazione di incroci di funzioni per analizzare combinazioni di funzioni. Le nostre impostazioni originali creati una croce trip_start_hour
e 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…
Incrociare le due colonne crea un sacco di combinazioni! Diamo restringere la nostra croce al solo sguardo ai viaggi che iniziano a mezzogiorno. Quindi cerchiamo di selezionare binary_accuracy
dalla visualizzazione:
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…
Rendering grafici
Eventuali trame che sono stati aggiunti al tfma.EvalConfig
come formazione post metric_specs
possono essere visualizzate utilizzando tfma.view.render_plot
.
Come per le metriche, i grafici possono essere visualizzati per sezione. A differenza di metriche, solo lotti per un valore particolare fetta possono essere visualizzati in modo che il tfma.SlicingSpec
deve essere utilizzato e deve specificare sia un nome di funzione fetta e valore. Se nessun fetta è previsto anche per le trame del Overall
fetta viene utilizzato.
Nell'esempio riportato di seguito vi mostriamo le CalibrationPlot
e ConfusionMatrixPlot
trame che sono stati calcolati per il trip_start_hour:1
fetta.
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…
Monitoraggio delle prestazioni del modello nel tempo
Il set di dati di addestramento verrà utilizzato per l'addestramento del modello e, si spera, sarà rappresentativo del set di dati di test e dei dati che verranno inviati al modello in produzione. Tuttavia, sebbene i dati nelle richieste di inferenza possano rimanere gli stessi dei dati di addestramento, in molti casi inizieranno a cambiare abbastanza da modificare le prestazioni del modello.
Ciò significa che è necessario monitorare e misurare costantemente le prestazioni del modello, in modo da essere consapevoli e reagire ai cambiamenti. Diamo un'occhiata a come TFMA può aiutare.
Facciamo carico 3 diverse piste modello e l'uso TFMA per vedere come si confronta con render_time_series
.
# 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
Innanzitutto, immaginiamo di aver addestrato e distribuito il nostro modello ieri, e ora vogliamo vedere come va sui nuovi dati in arrivo oggi. La visualizzazione inizierà visualizzando AUC. Dall'interfaccia utente è possibile:
- Aggiungi altre metriche utilizzando il menu "Aggiungi serie di metriche".
- Chiudi i grafici indesiderati facendo clic su x
- Passa il mouse sui punti dati (le estremità dei segmenti di linea nel grafico) per ottenere maggiori dettagli
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…
Adesso immaginiamo che sia passato un altro giorno e vogliamo vedere come va sui nuovi dati in arrivo oggi, rispetto ai due giorni precedenti:
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…
Convalida del modello
TFMA può essere configurato per valutare più modelli contemporaneamente. In genere questo viene fatto per confrontare un nuovo modello con una linea di base (come il modello attualmente in uso) per determinare quali sono le differenze di prestazioni nelle metriche (ad es. AUC, ecc.) Quando le soglie sono configurati, TFMA produrrà un tfma.ValidationResult
disco che indica se la prestazione sia adatto alle nostre aspettative.
Riconfiguriamo la nostra valutazione Keras per confrontare due modelli: un candidato e una linea di base. Ci sarà anche convalidare le prestazioni del candidato contro la linea di base impostando un tmfa.MetricThreshold
sulla metrica AUC.
# 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
Quando si eseguono valutazioni con uno o più modelli rispetto a una linea di base, TFMA aggiunge automaticamente metriche diff per tutte le metriche calcolate durante la valutazione. Queste metriche sono chiamati dopo la corrispondente metrica ma con _diff
aggiunto al nome metrica.
Diamo un'occhiata alle metriche prodotte dalla nostra corsa:
tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…
Ora diamo un'occhiata all'output dei nostri controlli di convalida. Per visualizzare i risultati della convalida che usiamo tfma.load_validator_result
. Per il nostro esempio, la convalida non riesce perché l'AUC è al di sotto della soglia.
validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False