Phân tích mô hình TensorFlow

Ví dụ về thành phần chính của TensorFlow Extended (TFX)

TensorFlow mẫu phân tích (TFMA) là một thư viện để thực hiện đánh giá mô hình trên lát dữ liệu khác nhau. TFMA thực hiện phép tính của mình một cách phân phối trên một lượng lớn dữ liệu sử dụng Apache chùm .

Sổ tay chuyên mục ví dụ này minh họa cách TFMA có thể được sử dụng để điều tra và hình dung hiệu suất của một mô hình liên quan đến các đặc điểm của tập dữ liệu. Chúng tôi sẽ sử dụng một mô hình mà chúng tôi đã đào tạo trước đây và bây giờ bạn có thể chơi với kết quả! Mô hình đào tạo chúng tôi đã cho Chicago Taxi Ví dụ , trong đó sử dụng Taxi Trips bộ dữ liệu phát hành bởi các thành phố Chicago. Khám phá bộ dữ liệu đầy đủ trong UI BigQuery .

Với tư cách là người lập mô hình và nhà phát triển, hãy nghĩ về cách dữ liệu này được sử dụng và những lợi ích cũng như tác hại tiềm ẩn mà các dự đoán của mô hình có thể gây ra. Một mô hình như thế này có thể củng cố những thành kiến ​​và chênh lệch xã hội. Một tính năng có liên quan đến vấn đề bạn muốn giải quyết hay nó sẽ tạo ra sự thiên vị? Để biết thêm thông tin, đọc về ML công bằng .

Các cột trong tập dữ liệu là:

pickup_community_area giá vé trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude trip_miles Pick_census_tract
dropoff_census_tract hình thức thanh toán Công ty
trip_seconds dropoff_community_area lời khuyên

Cài đặt Tiện ích mở rộng 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 

Cài đặt Phân tích mô hình TensorFlow (TFMA)

Thao tác này sẽ kéo theo tất cả các phần phụ thuộc và sẽ mất một phút.

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

Bây giờ bạn phải khởi động lại thời gian chạy trước khi chạy các ô bên dưới.

# 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

Tải tệp

Chúng tôi sẽ tải xuống một tệp tar có mọi thứ chúng tôi cần. Điều đó bao gồm:

  • Tập dữ liệu đào tạo và đánh giá
  • Lược đồ dữ liệu
  • Đào tạo và phục vụ các mô hình đã lưu (keras và công cụ ước lượng) và đánh giá các mô hình đã lưu (công cụ ước lượng).
# 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

Phân tích cú pháp lược đồ

Trong số những điều chúng ta đã tải về là một schema cho dữ liệu của chúng tôi được tạo ra bởi TensorFlow Data Validation . Bây giờ hãy phân tích cú pháp đó để chúng ta có thể sử dụng nó với 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)

Sử dụng lược đồ để tạo TFRecords

Chúng tôi cần cấp cho TFMA quyền truy cập vào tập dữ liệu của mình, vì vậy hãy tạo tệp TFRecords. Chúng tôi có thể sử dụng lược đồ của mình để tạo nó, vì nó cung cấp cho chúng tôi loại chính xác cho từng đối tượng địa lý.

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

Thiết lập và chạy TFMA

TFMA hỗ trợ một số loại mô hình khác nhau bao gồm mô hình TF keras, mô hình dựa trên API chữ ký TF2 chung, cũng như mô hình dựa trên công cụ ước tính TF. Các get_started hướng dẫn có đầy đủ danh sách các loại mô hình được hỗ trợ và bất kỳ hạn chế. Trong ví dụ này chúng ta sẽ thấy làm thế nào để cấu hình một mô hình dựa keras cũng như một mô hình dựa trên ước lượng được lưu lại dưới dạng một EvalSavedModel . Xem các câu hỏi thường gặp cho ví dụ về các cấu hình khác.

TFMA cung cấp hỗ trợ để tính toán các chỉ số được sử dụng tại thời điểm đào tạo (tức là các chỉ số tích hợp sẵn) cũng như các chỉ số được xác định sau khi mô hình được lưu như một phần của cài đặt cấu hình TFMA. Đối với keras của chúng tôi thiết lập chúng tôi sẽ chứng minh thêm số liệu và âm mưu của chúng tôi bằng tay như một phần của cấu hình của chúng tôi (xem số liệu hướng dẫn để biết thông tin về các số liệu và các lô được hỗ trợ). Để thiết lập công cụ ước tính, chúng tôi sẽ sử dụng các chỉ số tích hợp đã được lưu cùng với mô hình. Các thiết lập của chúng tôi cũng bao gồm một số thông số kỹ thuật cắt được thảo luận chi tiết hơn trong các phần sau.

Sau khi tạo một tfma.EvalConfigtfma.EvalSharedModel sau đó chúng ta có thể chạy TFMA sử dụng tfma.run_model_analysis . Điều này sẽ tạo ra một tfma.EvalResult mà chúng ta có thể sử dụng sau này cho rendering số liệu và âm mưu của chúng tôi.

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

Công cụ ước tính

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.

Hình dung các số liệu và lô

Bây giờ chúng tôi đã chạy đánh giá, hãy xem các hình ảnh trực quan của chúng tôi bằng cách sử dụng TFMA. Đối với các ví dụ sau, chúng ta sẽ hình dung kết quả từ việc chạy đánh giá trên mô hình keras. Để xem ước lượng dựa trên mô hình cập nhật các eval_result đến điểm mà tại chúng tôi estimator_eval_result biến.

eval_result = keras_eval_result
# eval_result = estimator_eval_result

Số liệu kết xuất

Để xem số liệu mà bạn sử dụng tfma.view.render_slicing_metrics

Theo mặc định quan điểm sẽ hiển thị Overall lát. Để xem một lát đặc biệt bạn có thể sử dụng tên của cột (bằng cách thiết lập slicing_column ) hoặc cung cấp một tfma.SlicingSpec .

Hình ảnh hóa số liệu hỗ trợ các tương tác sau:

  • Nhấp và kéo để xoay
  • Cuộn để thu phóng
  • Nhấp chuột phải để đặt lại chế độ xem
  • Di chuột qua điểm dữ liệu mong muốn để xem thêm chi tiết.
  • Chọn từ bốn loại chế độ xem khác nhau bằng cách sử dụng các lựa chọn ở dưới cùng.

Ví dụ, chúng tôi sẽ thiết lập slicing_column nhìn vào trip_start_hour tính năng từ trước của chúng tôi 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', …

Tổng quan về Slices

Các hình dung mặc định là Tổng quan Slices khi số lượng các lát nhỏ. Nó hiển thị các giá trị của số liệu cho mỗi lát. Vì chúng ta đã chọn trip_start_hour trên, nó cho chúng ta thấy số liệu như độ chính xác và AUC cho mỗi giờ, cho phép chúng ta tìm kiếm các vấn đề cụ thể cho một vài giờ và không phải người khác.

Trong hình ảnh bên trên:

  • Hãy thử sắp xếp cột tính năng, đó là chúng tôi trip_start_hours tính năng, bằng cách nhấp vào tiêu đề cột
  • Cố gắng sắp xếp theo độ chính xác, và thông báo rằng độ chính xác cho một số các giờ với các ví dụ là 0, mà có thể chỉ ra một vấn đề

Biểu đồ cũng cho phép chúng tôi chọn và hiển thị các số liệu khác nhau trong các lát của chúng tôi.

  • Thử chọn các chỉ số khác nhau từ menu "Hiển thị"
  • Hãy thử chọn thu hồi trong "Show" trình đơn, và thông báo rằng việc thu hồi đối với một số giờ với các ví dụ là 0, mà có thể chỉ ra một vấn đề

Cũng có thể đặt ngưỡng để lọc ra các lát có số lượng ví dụ nhỏ hơn hoặc "trọng số". Bạn có thể nhập số lượng ví dụ tối thiểu hoặc sử dụng thanh trượt.

Biểu đồ số liệu

Quan điểm này cũng hỗ trợ một Metrics Histogram như một hình dung khác, đó cũng là giao diện mặc định khi số lượng lát là lớn. Kết quả sẽ được chia thành các nhóm và có thể hình dung số lượng lát / tổng trọng lượng / cả hai. Các cột có thể được sắp xếp bằng cách nhấp vào tiêu đề cột. Các lát có trọng lượng nhỏ có thể được lọc ra bằng cách đặt ngưỡng. Lọc thêm có thể được áp dụng bằng cách kéo dải màu xám. Để đặt lại dải, hãy nhấp đúp vào dải. Lọc cũng có thể được sử dụng để loại bỏ các ngoại lệ trong trực quan hóa và các bảng chỉ số. Nhấp vào biểu tượng bánh răng để chuyển sang thang đo logarit thay vì thang đo tuyến tính.

  • Thử chọn "Biểu đồ số liệu" trong menu Hình ảnh hóa

Nhiều lát

Ban đầu của chúng tôi tfma.EvalConfig tạo ra một danh sách toàn bộ slicing_specs , mà chúng tôi có thể hình dung bởi thông tin cập nhật lát truyền cho tfma.view.render_slicing_metrics . Ở đây chúng ta sẽ chọn trip_start_day lát (các ngày trong tuần). Hãy thử thay đổi trip_start_day để trip_start_month và render một lần nữa để kiểm tra lát khác nhau.

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

TFMA cũng hỗ trợ tạo các giao diện tính năng để phân tích sự kết hợp của các tính năng. Cài đặt gốc của chúng tôi đã tạo ra một chéo trip_start_hourtrip_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…

Việc vượt qua hai cột tạo ra rất nhiều sự kết hợp! Hãy thu hẹp chéo của chúng tôi chỉ nhìn vào các chuyến đi bắt đầu vào buổi trưa. Sau đó, hãy chọn của binary_accuracy từ trực quan:

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…

Kết xuất các lô

Bất kỳ lô đã được bổ sung vào tfma.EvalConfig như đào tạo sau metric_specs có thể được hiển thị bằng tfma.view.render_plot .

Cũng như các chỉ số, các biểu đồ có thể được xem theo phần. Không giống như các số liệu, chỉ có âm mưu cho một giá trị lát đặc biệt có thể được hiển thị để các tfma.SlicingSpec phải được sử dụng và nó phải ghi rõ cả tên tính năng lát và giá trị. Nếu không có miếng được cung cấp sau đó lô cho Overall lát được sử dụng.

Trong ví dụ dưới đây, chúng tôi đang hiển thị các CalibrationPlotConfusionMatrixPlot lô đã được tính toán cho trip_start_hour:1 lát.

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…

Theo dõi hiệu suất mô hình theo thời gian

Tập dữ liệu đào tạo của bạn sẽ được sử dụng để đào tạo mô hình của bạn và hy vọng sẽ là đại diện cho tập dữ liệu thử nghiệm của bạn và dữ liệu sẽ được gửi đến mô hình của bạn trong quá trình sản xuất. Tuy nhiên, trong khi dữ liệu trong các yêu cầu suy luận có thể vẫn giống như dữ liệu huấn luyện của bạn, trong nhiều trường hợp, nó sẽ bắt đầu thay đổi đủ để hiệu suất của mô hình của bạn sẽ thay đổi.

Điều đó có nghĩa là bạn cần theo dõi và đo lường hiệu suất mô hình của mình liên tục, để bạn có thể nhận thức và phản ứng với các thay đổi. Hãy xem TFMA có thể trợ giúp như thế nào.

Hãy tải 3 model chạy khác nhau và sử dụng TFMA để xem cách họ so sánh sử dụng 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.

Đầu tiên, chúng ta hãy tưởng tượng rằng chúng ta đã đào tạo và triển khai mô hình của mình ngày hôm qua, và bây giờ chúng ta muốn xem nó hoạt động như thế nào trên dữ liệu mới có trong ngày hôm nay. Quá trình hiển thị sẽ bắt đầu bằng cách hiển thị AUC. Từ giao diện người dùng, bạn có thể:

  • Thêm các chỉ số khác bằng menu "Thêm chuỗi số liệu".
  • Đóng các biểu đồ không mong muốn bằng cách nhấp vào x
  • Di chuột qua các điểm dữ liệu (cuối các đoạn thẳng trong biểu đồ) để biết thêm chi tiết
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…

Bây giờ chúng ta sẽ tưởng tượng rằng một ngày nữa đã trôi qua và chúng ta muốn xem nó hoạt động như thế nào trên dữ liệu mới có trong ngày hôm nay, so với hai ngày trước:

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…

Mẫu chính thức

TFMA có thể được cấu hình để đánh giá nhiều mô hình cùng một lúc. Thông thường, điều này được thực hiện để so sánh một mô hình mới với đường cơ sở (chẳng hạn như mô hình hiện đang phân phối) để xác định sự khác biệt về hiệu suất trong các chỉ số (ví dụ: AUC, v.v.) so với đường cơ sở. Khi ngưỡng được cấu hình, TFMA sẽ sản xuất một tfma.ValidationResult kỷ lục nêu rõ việc thực hiện phù hợp với expecations.

Hãy cấu hình lại đánh giá keras của chúng tôi để so sánh hai mô hình: một ứng cử viên và một đường cơ sở. Chúng tôi cũng sẽ xác nhận hoạt động của ứng cử viên chống lại đường cơ sở bằng cách thiết lập một tmfa.MetricThreshold trên số liệu 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.

Khi chạy đánh giá với một hoặc nhiều mô hình so với đường cơ sở, TFMA sẽ tự động thêm các chỉ số khác nhau cho tất cả các chỉ số được tính toán trong quá trình đánh giá. Những số liệu được đặt tên theo số liệu nhưng với tương ứng _diff nối vào tên metric.

Hãy xem xét các chỉ số do quá trình chạy của chúng tôi tạo ra:

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

Bây giờ chúng ta hãy xem xét đầu ra từ các kiểm tra xác thực của chúng tôi. Để xem kết quả xác nhận chúng tôi sử dụng tfma.load_validator_result . Ví dụ của chúng tôi, xác thực không thành công vì AUC dưới ngưỡng.

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