דף זה תורגם על ידי Cloud Translation API.
Switch to English

ניתוח מודל TensorFlow

דוגמה לרכיב מרכזי של TensorFlow מורחב (TFX)

ניתוח מודל TensorFlow (TFMA) הוא ספריה לביצוע הערכת מודלים על פני פרוסות נתונים שונות. TFMA מבצעת את חישוביה באופן מבוזר על פני כמויות גדולות של נתונים באמצעות Apache Beam .

מחברת colab לדוגמא זו ממחישה כיצד ניתן להשתמש ב- TFMA לחקירה והמחשה של ביצועי מודל ביחס למאפייני מערך הנתונים. נשתמש במודל שאימנו בעבר, ועכשיו אתה יכול לשחק עם התוצאות! המודל שאימנו היה עבור דוגמת המוניות בשיקגו , המשתמשת במערך המוניות נסיעות שהוציאה העיר שיקגו. חקור את מערך הנתונים המלא בממשק המשתמש של BigQuery .

כמודל ומפתח, חשוב כיצד משתמשים בנתונים אלה והיתרונות הפוטנציאליים והפגיעה בהם תחזיות המודל יכולים לגרום. מודל כזה יכול לחזק הטיות ופערים חברתיים. האם תכונה רלוונטית לבעיה שתרצה לפתור או שהיא תציג הטיה? למידע נוסף, קרא על הוגנות ML .

העמודות במערך הנתונים הן:

pickup_community_area דמי נסיעה trip_start_month
trip_start_hour טיול_התחלה_יום חותמת trip_start_tim
איסוף_מרוחק איסוף_אורך ירידה_מרוחק
ירידה באורך נסיעה_מיילים pickup_census_tract
ירידה_מפקד_מסמך סוג תשלום חֶברָה
נסיעה_שניות ירידה_קהילה_אזור טיפים

התקן תוספות 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 

התקן ניתוח מודלים של TensorFlow (TFMA)

זה יכניס את כל התלות, וזה ייקח דקה.

הערה כדי להבטיח שכל התלות מותקנת כהלכה, ייתכן שיהיה עליך להפעיל מחדש את שלב ההתקנה מספר פעמים לפני שלא יהיו שגיאות.

# This setup was tested with TF 2.3 and TFMA 0.24 (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.'

print('Installing TensorFlow')
import tensorflow as tf
print('TF version: {}'.format(tf.__version__))

print('Installing Tensorflow Model Analysis and Dependencies')
!pip install -q tensorflow_model_analysis
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
Installing TensorFlow
TF version: 2.3.1
Installing Tensorflow Model Analysis and Dependencies
ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.

google-api-python-client 1.12.3 requires httplib2<1dev,>=0.15.0, but you'll have httplib2 0.9.2 which is incompatible.
Beam version: 2.24.0
TFMA version: 0.24.3

טען את הקבצים

אנו מורידים קובץ זפת המכיל את כל מה שאנחנו צריכים. זה כולל:

  • מערכי נתונים להכשרה והערכה
  • סכמת נתונים
  • הכשרה והגשה של מודלים שמורים (קרס ואומדן) ומודלים שמורים של eval (אומדן).
# 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.4M      0 --:--:-- --:--:-- --:--:-- 25.3M
Here's what we downloaded:
/tmp/tmpj6t03cp6:
saved_models-2.2

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

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

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

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

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

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

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

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

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

/tmp/tmpj6t03cp6/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/tmpj6t03cp6/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

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

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

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

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

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

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

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

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

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

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

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

לנתח את הסכימה

בין הדברים שהורדנו הייתה סכמה לנתונים שלנו שנוצרה על ידי אימות נתונים של TensorFlow . בואו ננתח את זה עכשיו כדי שנוכל להשתמש בזה עם 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)

השתמש בסכמה כדי ליצור TFRecords

עלינו לתת ל- TFMA גישה למערך הנתונים שלנו, אז בואו ניצור קובץ TFRecords. אנו יכולים להשתמש בסכמה שלנו כדי ליצור אותה, מכיוון שהיא נותנת לנו את הסוג הנכון עבור כל תכונה.

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/tmpj6t03cp6/train_data.rio

הגדר והפעל את TFMA

TFMA תומך במספר סוגים שונים של דגמים, כולל דגמי TF keras, מודלים המבוססים על ממשקי API חתימת TF2 כלליים וכן מודלים מבוססי אומדן TF. המדריך get_started כולל את הרשימה המלאה של סוגי הדגמים הנתמכים וכל מגבלה. לדוגמא זו אנו הולכים להראות כיצד להגדיר מודל מבוסס קרס וכן מודל מבוסס אומדן שנשמר כ- EvalSavedModel . עיין בשאלות הנפוצות לקבלת דוגמאות לתצורות אחרות.

TFMA מספק תמיכה בחישוב מדדים ששימשו בזמן האימון (כלומר מדדים מובנים) וכן מדדים שהוגדרו לאחר שמירת המודל כחלק מהגדרות התצורה של TFMA. לצורך הגדרת keras שלנו נדגים הוספת המדדים והעלילות שלנו באופן ידני כחלק מהתצורה שלנו (עיין במדריך המדדים למידע על המדדים והעלילות הנתמכים). לצורך הגדרת האומדן נשתמש בערכים המובנים שנשמרו בדגם. ההתקנות שלנו כוללות גם מספר מפרט חיתוך שנדון בפירוט רב יותר בסעיפים הבאים.

לאחר יצירת tfma.EvalConfig ו- tfma.EvalSharedModel נוכל להריץ TFMA באמצעות tfma.run_model_analysis . זה ייצור tfma.EvalResult שבו נוכל להשתמש מאוחר יותר לצורך ביצוע המדדים והעלילות שלנו.

קרס

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:absl:Tensorflow version (2.3.1) 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:70: 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:70: 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)`

אומדן

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.3.1) found. Note that TFMA support for TF 2.0 is currently in beta

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/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.6/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/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables

INFO:tensorflow:Restoring parameters from /tmp/tmpj6t03cp6/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/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.6/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.

הדמיה של מדדים ועלילות

כעת, לאחר שביצענו את ההערכה, בואו נסתכל על ההדמיות שלנו באמצעות TFMA. עבור הדוגמאות הבאות, נראה את התוצאות מהפעלת ההערכה על מודל keras. כדי להציג את המודל מבוסס האומדן, עדכן את eval_result כך שיצביע על המשתנה estimator_eval_result .

eval_result = keras_eval_result
# eval_result = estimator_eval_result

מדדי טיוח

כדי להציג מדדים אתה משתמש ב- tfma.view.render_slicing_metrics

כברירת מחדל התצוגות יציגו את הנתח Overall . כדי להציג נתח מסוים תוכלו להשתמש בשם העמודה (על ידי הגדרת slicing_column ) או לספק tfma.SlicingSpec .

הדמיה של המדדים תומכת באינטראקציות הבאות:

  • לחץ וגרור כדי לעבור
  • גלול כדי להתקרב
  • לחץ לחיצה ימנית כדי לאפס את התצוגה
  • העבר את העכבר מעל נקודת הנתונים הרצויה כדי לראות פרטים נוספים.
  • בחר מתוך ארבעה סוגים שונים של תצוגות באמצעות הבחירות בתחתית.

לדוגמא, נגדיר את slicing_column כך שנראה את התכונה trip_start_hour מ- 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', …

סקירות פרוסות

ההדמיה המוגדרת כברירת מחדל היא סקירה כללית של הפרוסות כאשר מספר הפרוסות קטן. הוא מציג את ערכי המדדים עבור כל פרוסה. מכיוון שבחרנו את trip_start_hour לעיל, הוא מראה לנו מדדים כמו דיוק ו- AUC לכל שעה, מה שמאפשר לנו לחפש בעיות ספציפיות לשעות מסוימות ולא לאחרות.

בהדמיה לעיל:

  • נסה למיין את עמודת התכונות, שהיא התכונה trip_start_hours שלנו, על ידי לחיצה על כותרת העמודה
  • נסה למיין לפי דיוק, ושים לב שהדיוק בחלק מהשעות עם דוגמאות הוא 0, מה שעשוי להצביע על בעיה

התרשים גם מאפשר לנו לבחור ולהציג מדדים שונים בפרוסות שלנו.

  • נסה לבחור מדדים שונים מתפריט "הצג"
  • נסה לבחור לזכור בתפריט "הצג", ושים לב שהזכירה בחלק מהשעות עם דוגמאות היא 0, מה שעשוי להצביע על בעיה

אפשר גם להגדיר סף לסינון פרוסות עם מספר קטן יותר של דוגמאות, או "משקולות". באפשרותך להקליד מספר מינימלי של דוגמאות, או להשתמש במחוון.

היסטוגרמה של מדדים

תצוגה זו תומכת גם בהיסטוגרמה של מדדים כהדמיה חלופית, שהיא גם תצוגת ברירת המחדל כאשר מספר הפרוסות גדול. התוצאות יחולקו לדליים וניתן יהיה לדמיין את מספר הפרוסות / סך המשקולות / שתיהן. ניתן למיין עמודות על ידי לחיצה על כותרת העמודה. ניתן לסנן פרוסות עם משקולות קטנות על ידי הגדרת הסף. ניתן ליישם סינון נוסף על ידי גרירת הפס האפור. כדי לאפס את הטווח, לחץ פעמיים על הלהקה. סינון יכול לשמש גם כדי להסיר חריגים בטבלת ההדמיה ובמדדים. לחץ על סמל גלגל השיניים כדי לעבור לסולם לוגריתמי במקום לסולם ליניארי.

  • נסה לבחור באפשרות "מדדי היסטוגרמה" בתפריט ויזואליזציה

עוד פרוסות

ה- tfma.EvalConfig הראשונית שלנו יצרה רשימה שלמה של slicing_specs , שאותה אנו יכולים לדמיין על ידי עדכון מידע הפרוסה המועבר ל- tfma.view.render_slicing_metrics . כאן נבחר את הנתח trip_start_day (ימי השבוע). נסה לשנות את trip_start_day ל- trip_start_month ולעשות שוב כדי לבחון פרוסות שונות.

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

TFMA תומך גם ביצירת צלבים של תכונות לניתוח שילובים של תכונות. ההגדרות המקוריות שלנו יצרו נסיעה trip_start_hour ושל 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…

חציית שתי העמודות יוצרת הרבה שילובים! בואו לצמצם את הצלב שלנו כדי להסתכל רק על טיולים שמתחילים בצהריים . אז בואו לבחור binary_accuracy מתוך ההדמיה:

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…

טיוח מגרשים

כל חלקות כי נוספו tfma.EvalConfig כמו הכשרה פוסט metric_specs ניתן להציג באמצעות tfma.view.render_plot .

כמו במדדים, ניתן לראות עלילות לפי פרוסה. שלא כמו מדדים, ניתן להציג רק עלילות עבור ערך פרוסה מסוים, כך שיש להשתמש ב- tfma.SlicingSpec ועליו לציין גם שם של תכונת פרוסה וגם ערך. אם לא ניתנת פרוסה, נעשה שימוש במגרשים עבור הפרוסה Overall .

בדוגמה שלהלן אנו מציגים את עלילות CalibrationPlot ו- ConfusionMatrixPlot שחושבו עבור trip_start_hour:1 .

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…

מעקב אחר ביצועי המודל לאורך זמן

מערך האימונים שלך ישמש לאימון המודל שלך, ונקווה להיות מייצג את מערך הבדיקה שלך ואת הנתונים שיישלחו למודל שלך בייצור. עם זאת, בעוד שהנתונים בבקשות ההיסק עשויים להישאר זהים לנתוני האימון שלך, במקרים רבים הם יתחילו להשתנות מספיק כך שביצועי המודל שלך ישתנו.

המשמעות היא שעליך לעקוב ולמדוד את ביצועי המודל שלך באופן שוטף, כך שתוכל להיות מודע לשינויים ולהגיב עליהם. בואו נסתכל כיצד TFMA יכולה לעזור.

בואו נטען 3 ריצות מודל שונות ונשתמש ב- TFMA כדי לראות כיצד הן משוות באמצעות 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.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:absl:Tensorflow version (2.3.1) found. Note that TFMA support for TF 2.0 is currently in beta

ראשית, נדמיין שהכשרנו ופרסנו את המודל שלנו אתמול, ועכשיו אנחנו רוצים לראות איך זה מסתדר על הנתונים החדשים שמגיעים היום. ההדמיה תתחיל בהצגת AUC. מממשק המשתמש תוכלו:

  • הוסף מדדים אחרים באמצעות התפריט "הוסף סדרות מדדים".
  • סגור גרפים לא רצויים על ידי לחיצה על x
  • העבר את העכבר מעל נקודות נתונים (קצות פלחי השורה בגרף) כדי לקבל פרטים נוספים
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': {'': {'': {'calibration': {'doubleValue': …

עכשיו נדמיין שעבר יום נוסף ואנחנו רוצים לראות איך זה מסתדר בנתונים החדשים שמגיעים היום, בהשוואה ליומיים הקודמים:

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': {'': {'': {'calibration': {'doubleValue': …

אימות מודל

ניתן להגדיר את TFMA להעריך מספר דגמים בו זמנית. בדרך כלל זה נעשה כדי להשוות מודל חדש מול קו בסיס (כגון המודל המשרת כיום) כדי לקבוע מה הבדלי הביצועים במדדים (למשל AUC וכו ') ביחס לקו הבסיס. כאשר מוגדרים סף , TFMA יפיק רשומת tfma.ValidationResult המציינת אם הביצועים תואמים לצפיות.

בואו להגדיר מחדש את הערכת keras שלנו להשוואה בין שני מודלים: מועמד וקו בסיס. אנו tmfa.MetricThreshold גם את ביצועי המועמד מול קו הבסיס על ידי הגדרת tmfa.MetricThreshold על המדד 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.3.1) found. Note that TFMA support for TF 2.0 is currently in beta
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/evaluators/metrics_validator.py:66: RuntimeWarning: invalid value encountered in true_divide
  ratio = diff / metrics[key.make_baseline_key(baseline_model_name)]

כאשר מריצים הערכות עם מודל אחד או יותר על בסיס בסיס, TFMA מוסיפה באופן אוטומטי מדדי הבדל עבור כל המדדים שחושבו במהלך ההערכה. מדדים אלה נקראים על שם הערך המתאים אך עם _diff צורף לשם המדד.

בואו נסתכל על המדדים שמפיקים הריצה שלנו:

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

עכשיו בואו נסתכל על הפלט מבדיקות האימות שלנו. כדי להציג את תוצאות האימות אנו משתמשים ב-tfma.load_validator_result . לדוגמא שלנו, האימות נכשל מכיוון ש- AUC נמצא מתחת לסף.

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