Analisis Model TensorFlow

Contoh Komponen Utama TensorFlow Extended (TFX)

Analisis Model TensorFlow (TFMA) adalah library untuk melakukan evaluasi model yang di iris data yang berbeda. TFMA melakukan perhitungan dalam cara yang didistribusikan melalui sejumlah besar data menggunakan Apache Beam .

Contoh notebook colab ini menggambarkan bagaimana TFMA dapat digunakan untuk menyelidiki dan memvisualisasikan kinerja model sehubungan dengan karakteristik kumpulan data. Kami akan menggunakan model yang kami latih sebelumnya, dan sekarang Anda bisa bermain dengan hasilnya! Model kita dilatih adalah untuk Chicago Taxi Contoh , yang menggunakan Taxi Trips dataset yang dirilis oleh City of Chicago. Jelajahi dataset penuh di BigQuery UI .

Sebagai pemodel dan pengembang, pikirkan tentang bagaimana data ini digunakan dan potensi keuntungan dan kerugian yang dapat ditimbulkan oleh prediksi model. Model seperti ini bisa memperkuat bias dan disparitas masyarakat. Apakah fitur relevan dengan masalah yang ingin Anda pecahkan atau akan menimbulkan bias? Untuk informasi lebih lanjut, membaca tentang ML keadilan .

Kolom dalam kumpulan data adalah:

pickup_community_area tarif trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude trip_miles pickup_sensus_trak
dropoff_sensus_trak tipe pembayaran perusahaan
perjalanan_detik dropoff_community_area tips

Instal Ekstensi 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 

Instal Analisis Model TensorFlow (TFMA)

Ini akan menarik semua dependensi, dan akan memakan waktu satu menit.

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

Sekarang Anda harus me-restart runtime sebelum menjalankan sel di bawah ini.

# 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

Muat File

Kami akan mengunduh file tar yang memiliki semua yang kami butuhkan. Itu termasuk:

  • Dataset pelatihan dan evaluasi
  • Skema data
  • Melatih dan melayani model yang disimpan (keras dan estimator) dan mengevaluasi model yang disimpan (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

Mengurai Skema

Di antara hal yang kita download adalah skema untuk data kami yang telah dibuat oleh TensorFlow Validasi data . Mari kita urai sekarang sehingga kita dapat menggunakannya dengan 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)

Gunakan Skema untuk Membuat TFRecords

Kita perlu memberikan TFMA akses ke dataset kita, jadi mari kita buat file TFRecords. Kami dapat menggunakan skema kami untuk membuatnya, karena memberi kami jenis yang benar untuk setiap fitur.

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

Siapkan dan Jalankan TFMA

TFMA mendukung sejumlah tipe model yang berbeda termasuk model TF keras, model berdasarkan API tanda tangan TF2 generik, serta model berbasis TF estimator. The get_started panduan memiliki daftar lengkap dari jenis model yang didukung dan larangan. Untuk contoh ini kita akan menunjukkan bagaimana mengkonfigurasi keras model berbasis serta model berdasarkan estimator yang disimpan sebagai EvalSavedModel . Lihat FAQ untuk contoh konfigurasi lainnya.

TFMA menyediakan dukungan untuk menghitung metrik yang digunakan pada waktu pelatihan (yaitu metrik bawaan) serta metrik yang ditentukan setelah model disimpan sebagai bagian dari pengaturan konfigurasi TFMA. Untuk kami keras pemasangan kami akan menunjukkan menambahkan metrik dan plot kami secara manual sebagai bagian dari konfigurasi kita (lihat metrik panduan untuk informasi tentang metrik dan plot yang didukung). Untuk penyiapan estimator, kami akan menggunakan metrik bawaan yang disimpan dengan model. Setup kami juga mencakup sejumlah spesifikasi slicing yang dibahas secara lebih rinci di bagian berikut.

Setelah membuat tfma.EvalConfig dan tfma.EvalSharedModel kita kemudian dapat menjalankan TFMA menggunakan tfma.run_model_analysis . Ini akan membuat tfma.EvalResult yang dapat kita gunakan nanti untuk rendering metrik dan plot kami.

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

Penaksir

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.

Memvisualisasikan Metrik dan Plot

Sekarang setelah kita menjalankan evaluasi, mari kita lihat visualisasi kita menggunakan TFMA. Untuk contoh berikut, kami akan memvisualisasikan hasil dari menjalankan evaluasi pada model keras. Untuk melihat update model berbasis estimator eval_result ke titik di kami estimator_eval_result variabel.

eval_result = keras_eval_result
# eval_result = estimator_eval_result

Metrik Rendering

Untuk tampilan metrik Anda menggunakan tfma.view.render_slicing_metrics

Secara default pandangan akan menampilkan Overall slice. Untuk melihat sepotong tertentu Anda bisa menggunakan nama kolom (oleh pengaturan slicing_column ) atau memberikan tfma.SlicingSpec .

Visualisasi metrik mendukung interaksi berikut:

  • Klik dan seret untuk menggeser
  • Gulir untuk memperbesar
  • Klik kanan untuk mengatur ulang tampilan
  • Arahkan kursor ke titik data yang diinginkan untuk melihat detail selengkapnya.
  • Pilih dari empat jenis tampilan yang berbeda menggunakan pilihan di bagian bawah.

Sebagai contoh, kita akan menetapkan slicing_column untuk melihat trip_start_hour fitur dari kami sebelumnya 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', …

Ikhtisar Irisan

Visualisasi default adalah Ikhtisar Slice ketika jumlah irisan kecil. Ini menunjukkan nilai metrik untuk setiap irisan. Karena kita telah memilih trip_start_hour di atas, itu menunjukkan kami metrik seperti akurasi dan AUC untuk setiap jam, yang memungkinkan kita untuk mencari isu-isu yang spesifik untuk beberapa jam dan bukan orang lain.

Dalam visualisasi di atas:

  • Coba menyortir kolom fitur, yang kami trip_start_hours fitur, dengan mengklik pada header kolom
  • Coba menyortir oleh presisi, dan pemberitahuan bahwa presisi untuk beberapa jam dengan contoh-contoh adalah 0, yang mungkin menunjukkan masalah

Bagan juga memungkinkan kita untuk memilih dan menampilkan metrik yang berbeda dalam irisan kita.

  • Coba pilih metrik yang berbeda dari menu "Tampilkan"
  • Cobalah memilih recall di menu "Show", dan pemberitahuan bahwa recall untuk beberapa jam dengan contoh-contoh adalah 0, yang mungkin menunjukkan masalah

Dimungkinkan juga untuk menetapkan ambang batas untuk memfilter irisan dengan jumlah contoh yang lebih kecil, atau "bobot". Anda dapat mengetikkan contoh dalam jumlah minimum, atau menggunakan penggeser.

Metrik Histogram

Pandangan ini juga mendukung Metrik Histogram sebagai visualisasi alternatif, yang juga merupakan tampilan default ketika jumlah irisan besar. Hasilnya akan dibagi ke dalam ember dan jumlah irisan / bobot total / keduanya dapat divisualisasikan. Kolom dapat diurutkan dengan mengklik header kolom. Irisan dengan bobot kecil dapat disaring dengan menetapkan ambang batas. Pemfilteran lebih lanjut dapat diterapkan dengan menyeret pita abu-abu. Untuk mengatur ulang rentang, klik dua kali pita. Pemfilteran juga dapat digunakan untuk menghapus outlier dalam tabel visualisasi dan metrik. Klik ikon roda gigi untuk beralih ke skala logaritmik, bukan skala linier.

  • Coba pilih "Metrics Histogram" di menu Visualisasi

Lebih Banyak Irisan

Awal kami tfma.EvalConfig menciptakan daftar seluruh slicing_specs , yang kita dapat memvisualisasikan dengan informasi memperbarui slice diteruskan ke tfma.view.render_slicing_metrics . Di sini kita akan memilih trip_start_day slice (hari dalam seminggu). Cobalah mengubah trip_start_day untuk trip_start_month dan rendering lagi untuk memeriksa potongan yang berbeda.

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

TFMA juga mendukung pembuatan persilangan fitur untuk menganalisis kombinasi fitur. Pengaturan awal kami menciptakan sebuah salib trip_start_hour dan 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…

Melintasi dua kolom menciptakan banyak kombinasi! Mari kita mempersempit salib kita hanya melihat perjalanan yang dimulai pada siang hari. Kemudian mari kita pilih binary_accuracy dari visualisasi:

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…

Plot Rendering

Setiap plot yang ditambahkan ke tfma.EvalConfig pelatihan pasca metric_specs dapat ditampilkan menggunakan tfma.view.render_plot .

Seperti halnya metrik, plot dapat dilihat dengan irisan. Tidak seperti metrik, hanya plot untuk nilai slice tertentu dapat ditampilkan sehingga tfma.SlicingSpec harus digunakan dan harus menentukan baik nama fitur slice dan nilai. Jika tidak ada sepotong disediakan maka plot untuk Overall slice digunakan.

Dalam contoh di bawah kita menampilkan CalibrationPlot dan ConfusionMatrixPlot plot yang dihitung untuk trip_start_hour:1 slice.

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…

Melacak Kinerja Model Seiring Waktu

Set data pelatihan Anda akan digunakan untuk melatih model Anda, dan diharapkan akan mewakili set data pengujian Anda dan data yang akan dikirim ke model Anda dalam produksi. Namun, meskipun data dalam permintaan inferensi mungkin tetap sama dengan data pelatihan Anda, dalam banyak kasus data tersebut akan mulai cukup berubah sehingga kinerja model Anda akan berubah.

Itu berarti Anda perlu memantau dan mengukur kinerja model Anda secara berkelanjutan, sehingga Anda dapat menyadari dan bereaksi terhadap perubahan. Mari kita lihat bagaimana TFMA dapat membantu.

Mari beban 3 yang berbeda Model berjalan dan penggunaan TFMA untuk melihat bagaimana mereka membandingkan dengan 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.

Pertama, kami akan membayangkan bahwa kami telah melatih dan menerapkan model kami kemarin, dan sekarang kami ingin melihat bagaimana kinerjanya pada data baru yang masuk hari ini. Visualisasi akan dimulai dengan menampilkan AUC. Dari UI Anda dapat:

  • Tambahkan metrik lain menggunakan menu "Tambahkan rangkaian metrik".
  • Tutup grafik yang tidak diinginkan dengan mengklik x
  • Arahkan kursor ke titik data (ujung segmen garis dalam grafik) untuk mendapatkan detail lebih lanjut
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…

Sekarang kita akan membayangkan bahwa hari lain telah berlalu dan kita ingin melihat bagaimana kinerjanya pada data baru yang masuk hari ini, dibandingkan dengan dua hari sebelumnya:

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…

Validasi Model

TFMA dapat dikonfigurasi untuk mengevaluasi beberapa model secara bersamaan. Biasanya ini dilakukan untuk membandingkan model baru dengan baseline (seperti model yang sedang ditayangkan) untuk menentukan perbedaan kinerja dalam metrik (misalnya AUC, dll) yang relatif terhadap baseline. Ketika ambang dikonfigurasi, TFMA akan menghasilkan tfma.ValidationResult record yang menunjukkan apakah kinerja cocok expecations.

Mari kita konfigurasi ulang evaluasi keras kita untuk membandingkan dua model: sebuah kandidat dan sebuah baseline. Kami juga akan memvalidasi kinerja kandidat terhadap baseline dengan menetapkan tmfa.MetricThreshold pada metrik 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.

Saat menjalankan evaluasi dengan satu atau beberapa model terhadap baseline, TFMA secara otomatis menambahkan metrik yang berbeda untuk semua metrik yang dihitung selama evaluasi. Metrik ini dinamai sesuai metrik tetapi dengan _diff ditambahkan ke nama metrik.

Mari kita lihat metrik yang dihasilkan oleh lari kami:

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

Sekarang mari kita lihat output dari pemeriksaan validasi kita. Untuk melihat hasil validasi yang kita gunakan tfma.load_validator_result . Untuk contoh kami, validasi gagal karena AUC di bawah ambang batas.

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