หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การตรวจสอบข้อมูล TensorFlow

ตัวอย่างส่วนประกอบหลักของ TensorFlow Extended

สมุดบันทึก colab ตัวอย่างนี้แสดงให้เห็นถึงวิธีการใช้ TensorFlow Data Validation (TFDV) เพื่อตรวจสอบและแสดงภาพชุดข้อมูลของคุณ ซึ่งรวมถึงการดูสถิติเชิงพรรณนาการอนุมานสคีมาการตรวจสอบและแก้ไขความผิดปกติและการตรวจสอบการเบี่ยงเบนและการเอียงในชุดข้อมูลของเรา สิ่งสำคัญคือต้องทำความเข้าใจลักษณะของชุดข้อมูลของคุณรวมถึงการเปลี่ยนแปลงที่อาจเปลี่ยนแปลงเมื่อเวลาผ่านไปในไปป์ไลน์การผลิตของคุณ สิ่งสำคัญคือต้องค้นหาความผิดปกติในข้อมูลของคุณและเปรียบเทียบการฝึกอบรมการประเมินและการให้บริการชุดข้อมูลเพื่อให้แน่ใจว่าสอดคล้องกัน

เราจะใช้ข้อมูลจาก ชุดข้อมูล Taxi Trips ที่ เผยแพร่โดย City of Chicago

อ่านเพิ่มเติม เกี่ยวกับชุดข้อมูลใน Google BigQuery สำรวจชุดข้อมูลทั้งหมดใน UI ของ BigQuery

คอลัมน์ในชุดข้อมูล ได้แก่

pickup_community_area ค่าโดยสาร trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude Pickup_longitude dropoff_latitude
dropoff_longitude trip_miles Pickup_census_tract
dropoff_census_tract payment_type บริษัท
trip_seconds dropoff_community_area เคล็ดลับ

อัพเกรด Pip

เพื่อหลีกเลี่ยงการอัปเกรด Pip ในระบบเมื่อทำงานในเครื่องให้ตรวจสอบให้แน่ใจว่าเรากำลังทำงานใน Colab แน่นอนว่าระบบท้องถิ่นสามารถอัพเกรดแยกกันได้

try:
  import colab
  !pip install --upgrade pip
except:
  pass

ติดตั้ง TensorFlow

pip install tensorflow==2.2.0
Collecting tensorflow==2.2.0
  Using cached tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl (516.2 MB)
Requirement already satisfied: gast==0.3.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.3.3)
Requirement already satisfied: wheel>=0.26; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.35.1)
Requirement already satisfied: astunparse==1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.6.3)
Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.3.0)
Requirement already satisfied: absl-py>=0.7.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.9.0)
Requirement already satisfied: protobuf>=3.8.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.13.0)
Collecting tensorflow-estimator<2.3.0,>=2.2.0
  Using cached tensorflow_estimator-2.2.0-py2.py3-none-any.whl (454 kB)
Requirement already satisfied: h5py<2.11.0,>=2.10.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (2.10.0)
Requirement already satisfied: google-pasta>=0.1.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.2.0)
Requirement already satisfied: wrapt>=1.11.1 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.12.1)
Requirement already satisfied: grpcio>=1.8.6 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.31.0)
Requirement already satisfied: numpy<2.0,>=1.16.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.18.5)
Requirement already satisfied: termcolor>=1.1.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.0)
Requirement already satisfied: scipy==1.4.1; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.4.1)
Collecting tensorboard<2.3.0,>=2.2.0
  Using cached tensorboard-2.2.2-py3-none-any.whl (3.0 MB)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.2)
Requirement already satisfied: six>=1.12.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.15.0)
Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from protobuf>=3.8.0->tensorflow==2.2.0) (49.6.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: werkzeug>=0.11.15 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.0.1)
Requirement already satisfied: google-auth<2,>=1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.20.1)
Requirement already satisfied: requests<3,>=2.21.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.24.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.1)
Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.2.2)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/lib/python3/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.2.1)
Requirement already satisfied: rsa<5,>=3.1.4; python_version >= "3.5" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.6)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.1.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/kbuilder/.local/lib/python3.6/site-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2020.6.20)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.6)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.22)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.3.0)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /home/kbuilder/.local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python3/dist-packages (from rsa<5,>=3.1.4; python_version >= "3.5"->google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.2)
Requirement already satisfied: oauthlib>=3.0.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Requirement already satisfied: zipp>=0.5 in /home/kbuilder/.local/lib/python3.6/site-packages (from importlib-metadata; python_version < "3.8"->markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Installing collected packages: tensorflow-estimator, tensorboard, tensorflow
  Attempting uninstall: tensorflow-estimator
    Found existing installation: tensorflow-estimator 2.3.0
    Uninstalling tensorflow-estimator-2.3.0:
      Successfully uninstalled tensorflow-estimator-2.3.0
  Attempting uninstall: tensorboard
    Found existing installation: tensorboard 2.3.0
    Uninstalling tensorboard-2.3.0:
      Successfully uninstalled tensorboard-2.3.0
  Attempting uninstall: tensorflow
    Found existing installation: tensorflow 2.3.0
    Uninstalling tensorflow-2.3.0:
      Successfully uninstalled tensorflow-2.3.0
Successfully installed tensorboard-2.2.2 tensorflow-2.2.0 tensorflow-estimator-2.2.0

ตรวจสอบเวอร์ชัน Python

import sys

# Confirm that we're using Python 3
assert sys.version_info.major is 3, 'Oops, not running Python 3. Use Runtime > Change runtime type'

ติดตั้ง TFDV

สิ่งนี้จะดึงการอ้างอิงทั้งหมดเข้ามาซึ่งจะใช้เวลาสักครู่ โปรดเพิกเฉยต่อคำเตือนหรือข้อผิดพลาดเกี่ยวกับเวอร์ชันอ้างอิงที่เข้ากันไม่ได้

import tensorflow as tf

print('Installing TensorFlow Data Validation')
!pip install -q tensorflow_data_validation[visualization]
Installing TensorFlow Data Validation

คุณรีสตาร์ทรันไทม์หรือไม่?

หากคุณใช้ Google Colab ในครั้งแรกที่คุณเรียกใช้เซลล์ด้านบนคุณต้องรีสตาร์ทรันไทม์ (Runtime> Restart runtime ... ) นี่เป็นเพราะวิธีที่ Colab โหลดแพ็คเกจ

โหลดไฟล์

เราจะดาวน์โหลดชุดข้อมูลของเราจาก Google Cloud Storage

import os
import tempfile, urllib, zipfile

# Set up some globals for our file paths
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, 'data')
OUTPUT_DIR = os.path.join(BASE_DIR, 'chicago_taxi_output')
TRAIN_DATA = os.path.join(DATA_DIR, 'train', 'data.csv')
EVAL_DATA = os.path.join(DATA_DIR, 'eval', 'data.csv')
SERVING_DATA = os.path.join(DATA_DIR, 'serving', 'data.csv')

# Download the zip file from GCP and unzip it
zip, headers = urllib.request.urlretrieve('https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/chicago_data.zip')
zipfile.ZipFile(zip).extractall(BASE_DIR)
zipfile.ZipFile(zip).close()

print("Here's what we downloaded:")
!ls -R {os.path.join(BASE_DIR, 'data')}
Here's what we downloaded:
/tmp/tmpgsqn6btn/data:
eval  serving  train

/tmp/tmpgsqn6btn/data/eval:
data.csv

/tmp/tmpgsqn6btn/data/serving:
data.csv

/tmp/tmpgsqn6btn/data/train:
data.csv

ตรวจสอบเวอร์ชัน

import tensorflow_data_validation as tfdv
print('TFDV version: {}'.format(tfdv.version.__version__))
TFDV version: 0.23.0

คำนวณและแสดงภาพสถิติ

อันดับแรกเราจะใช้ tfdv.generate_statistics_from_csv เพื่อคำนวณสถิติสำหรับข้อมูลการฝึกอบรมของเรา (ละเว้นคำเตือนเร็ว)

TFDV สามารถคำนวณ สถิติเชิง พรรณนาที่ให้ภาพรวมอย่างรวดเร็วของข้อมูลในแง่ของคุณสมบัติที่มีอยู่และรูปทรงของการแจกแจงค่า

ภายใน TFDV ใช้กรอบการประมวลผลข้อมูลแบบขนานของ Apache Beam เพื่อปรับขนาดการคำนวณสถิติผ่านชุดข้อมูลขนาดใหญ่ สำหรับแอปพลิเคชันที่ต้องการผสานรวมกับ TFDV อย่างลึกซึ้งยิ่งขึ้น (เช่นแนบการสร้างสถิติที่ส่วนท้ายของไปป์ไลน์การสร้างข้อมูล) API ยังแสดง Beam PTransform สำหรับการสร้างสถิติ

train_stats = tfdv.generate_statistics_from_csv(data_location=TRAIN_DATA)
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_data_validation/utils/stats_util.py:229: 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_data_validation/utils/stats_util.py:229: 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)`

ตอนนี้ให้ใช้ tfdv.visualize_statistics ซึ่งใช้ Facets เพื่อสร้างภาพข้อมูลการฝึกอบรมของเราอย่างสั้น

  • โปรดสังเกตว่าคุณลักษณะที่เป็นตัวเลขและคุณลักษณะด้านการจำแนกประเภทจะแสดงภาพแยกกันและแผนภูมิจะแสดงโดยแสดงการแจกแจงของแต่ละคุณลักษณะ
  • สังเกตว่าฟีเจอร์ที่มีค่าที่ขาดหายไปหรือเป็นศูนย์จะแสดงเปอร์เซ็นต์เป็นสีแดงเป็นตัวบ่งชี้ภาพว่าอาจมีปัญหากับตัวอย่างในฟีเจอร์เหล่านั้น เปอร์เซ็นต์คือเปอร์เซ็นต์ของตัวอย่างที่ไม่มีค่าหรือเป็นศูนย์สำหรับฟีเจอร์นั้น
  • สังเกตว่าไม่มีตัวอย่างที่มีค่าสำหรับ pickup_census_tract นี่คือโอกาสในการลดมิติ!
  • ลองคลิก "ขยาย" เหนือแผนภูมิเพื่อเปลี่ยนการแสดงผล
  • ลองวางเมาส์เหนือแท่งในแผนภูมิเพื่อแสดงช่วงที่เก็บข้อมูลและจำนวน
  • ลองเปลี่ยนระหว่างบันทึกและเครื่องชั่งน้ำหนักเชิงเส้นและแจ้งให้ทราบว่าขนาดล็อกเผยให้เห็นรายละเอียดมากขึ้นเกี่ยวกับ payment_type คุณลักษณะเด็ดขาด
  • ลองเลือก "quantile" จากเมนู "แผนภูมิที่จะแสดง" และวางเมาส์เหนือเครื่องหมายเพื่อแสดงเปอร์เซ็นต์เชิงปริมาณ
tfdv.visualize_statistics(train_stats)

อ้างอิงสคีมา

ตอนนี้ให้ใช้ tfdv.infer_schema เพื่อสร้างสคีมาสำหรับข้อมูลของเรา สคีมากำหนดข้อ จำกัด สำหรับข้อมูลที่เกี่ยวข้องกับ ML ตัวอย่างข้อ จำกัด ได้แก่ ประเภทข้อมูลของแต่ละคุณลักษณะไม่ว่าจะเป็นตัวเลขหรือหมวดหมู่หรือความถี่ของการปรากฏในข้อมูล สำหรับคุณสมบัติตามหมวดหมู่สคีมายังกำหนดโดเมน - รายการค่าที่ยอมรับได้ เนื่องจากการเขียนสคีมาอาจเป็นงานที่น่าเบื่อโดยเฉพาะอย่างยิ่งสำหรับชุดข้อมูลที่มีคุณสมบัติมากมาย TFDV จึงมีวิธีการสร้างสคีมาเวอร์ชันเริ่มต้นตามสถิติเชิงพรรณนา

การทำให้สคีมาถูกต้องเป็นสิ่งสำคัญเนื่องจากส่วนที่เหลือของไปป์ไลน์การผลิตของเราจะอาศัยสคีมาที่ TFDV สร้างขึ้นเพื่อให้ถูกต้อง สคีมายังจัดเตรียมเอกสารสำหรับข้อมูลและจะมีประโยชน์เมื่อนักพัฒนาหลายคนทำงานกับข้อมูลเดียวกัน ลองใช้ tfdv.display_schema เพื่อแสดงสคีมาที่อนุมานเพื่อให้เราตรวจสอบได้

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:138: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

ตรวจสอบข้อมูลการประเมินเพื่อหาข้อผิดพลาด

จนถึงตอนนี้เราดูเฉพาะข้อมูลการฝึกอบรมเท่านั้น สิ่งสำคัญคือข้อมูลการประเมินของเราจะต้องสอดคล้องกับข้อมูลการฝึกอบรมของเรารวมถึงข้อมูลนั้นใช้สคีมาเดียวกัน สิ่งสำคัญเช่นกันที่ข้อมูลการประเมินจะต้องมีตัวอย่างของช่วงค่าที่ใกล้เคียงกันสำหรับคุณลักษณะตัวเลขของเราเป็นข้อมูลการฝึกอบรมของเราเพื่อให้การครอบคลุมของพื้นผิวการสูญเสียระหว่างการประเมินนั้นใกล้เคียงกับระหว่างการฝึกอบรม เช่นเดียวกับคุณสมบัติที่เป็นหมวดหมู่ มิฉะนั้นเราอาจมีปัญหาการฝึกอบรมที่ไม่ได้ระบุไว้ในระหว่างการประเมินเนื่องจากเราไม่ได้ประเมินส่วนหนึ่งของพื้นผิวการสูญเสียของเรา

  • โปรดสังเกตว่าแต่ละฟีเจอร์มีสถิติสำหรับทั้งชุดข้อมูลการฝึกอบรมและการประเมินผล
  • สังเกตว่าตอนนี้แผนภูมิมีทั้งชุดข้อมูลการฝึกอบรมและการประเมินซ้อนทับอยู่ทำให้ง่ายต่อการเปรียบเทียบ
  • โปรดสังเกตว่าตอนนี้แผนภูมิมีมุมมองเปอร์เซ็นต์ซึ่งสามารถใช้ร่วมกับบันทึกหรือมาตราส่วนเชิงเส้นเริ่มต้นได้
  • สังเกตว่าค่าเฉลี่ยและค่ามัธยฐานสำหรับ trip_miles แตกต่างกันสำหรับการฝึกอบรมเทียบกับชุดข้อมูลการประเมิน จะทำให้เกิดปัญหาหรือไม่?
  • ว้าว tips สูงสุดแตกต่างกันมากสำหรับการฝึกอบรมเทียบกับชุดข้อมูลการประเมิน จะทำให้เกิดปัญหาหรือไม่?
  • คลิกขยายบนแผนภูมิคุณลักษณะตัวเลขและเลือกมาตราส่วนบันทึก ตรวจสอบคุณลักษณะ trip_seconds และสังเกตความแตกต่างของค่าสูงสุด การประเมินจะพลาดบางส่วนของพื้นผิวการสูญเสียหรือไม่?
# Compute stats for evaluation data
eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)

# Compare evaluation data with training data
tfdv.visualize_statistics(lhs_statistics=eval_stats, rhs_statistics=train_stats,
                          lhs_name='EVAL_DATASET', rhs_name='TRAIN_DATASET')

ตรวจสอบความผิดปกติในการประเมิน

ชุดข้อมูลการประเมินของเราตรงกับสคีมาจากชุดข้อมูลการฝึกอบรมของเราหรือไม่ สิ่งนี้มีความสำคัญอย่างยิ่งสำหรับคุณลักษณะตามหมวดหมู่ซึ่งเราต้องการระบุช่วงของค่าที่ยอมรับได้

# Check eval data for errors by validating the eval data stats using the previously inferred schema.
anomalies = tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

แก้ไขความผิดปกติของการประเมินในสคีมา

อ๊ะ! ดูเหมือนว่าเราจะมีคุณค่าใหม่ ๆ สำหรับ company ในข้อมูลการประเมินของเราซึ่งเราไม่มีในข้อมูลการฝึกอบรม เรายังมีค่าใหม่สำหรับ payment_type สิ่งเหล่านี้ควรถือเป็นความผิดปกติ แต่สิ่งที่เราตัดสินใจจะทำขึ้นอยู่กับความรู้โดเมนของเราเกี่ยวกับข้อมูล หากความผิดปกติบ่งบอกถึงข้อผิดพลาดของข้อมูลอย่างแท้จริงข้อมูลพื้นฐานควรได้รับการแก้ไข มิฉะนั้นเราสามารถอัปเดตสคีมาเพื่อรวมค่าในชุดข้อมูล eval ได้

หากเราไม่เปลี่ยนชุดข้อมูลการประเมินเราไม่สามารถแก้ไขทุกอย่างได้ แต่เราสามารถแก้ไขสิ่งต่างๆในสคีมาที่เรายินดียอมรับ ซึ่งรวมถึงการผ่อนคลายมุมมองของเราเกี่ยวกับสิ่งที่เป็นและสิ่งที่ไม่ใช่ความผิดปกติสำหรับคุณลักษณะเฉพาะเช่นเดียวกับการอัปเดตสคีมาของเราเพื่อรวมค่าที่ขาดหายไปสำหรับคุณลักษณะตามหมวดหมู่ TFDV ช่วยให้เราค้นพบสิ่งที่เราต้องแก้ไข

มาทำการแก้ไขกันตอนนี้แล้วทบทวนอีกครั้ง

# Relax the minimum fraction of values that must come from the domain for feature company.
company = tfdv.get_feature(schema, 'company')
company.distribution_constraints.min_domain_mass = 0.9

# Add new value to the domain of feature payment_type.
payment_type_domain = tfdv.get_domain(schema, 'payment_type')
payment_type_domain.value.append('Prcard')

# Validate eval stats after updating the schema 
updated_anomalies = tfdv.validate_statistics(eval_stats, schema)
tfdv.display_anomalies(updated_anomalies)

เฮ้ดูนั่นสิ! เราตรวจสอบแล้วว่าข้อมูลการฝึกอบรมและการประเมินผลตรงกัน! ขอบคุณ TFDV;)

สคีมาสภาพแวดล้อม

นอกจากนี้เรายังแยกชุดข้อมูล 'การแสดงผล' สำหรับตัวอย่างนี้ดังนั้นเราควรตรวจสอบด้วย โดยค่าเริ่มต้นชุดข้อมูลทั้งหมดในไปป์ไลน์ควรใช้สคีมาเดียวกัน แต่มักจะมีข้อยกเว้น ตัวอย่างเช่นในการเรียนรู้ภายใต้การดูแลเราจำเป็นต้องรวมป้ายกำกับไว้ในชุดข้อมูลของเรา แต่เมื่อเราแสดงแบบจำลองสำหรับการอนุมานจะไม่มีการรวมป้ายกำกับ ในบางกรณีจำเป็นต้องมีการแนะนำรูปแบบสคีมาเล็กน้อย

สภาพแวดล้อม สามารถใช้เพื่อแสดงข้อกำหนดดังกล่าวได้ โดยเฉพาะอย่างยิ่งคุณลักษณะในสคีมาสามารถเชื่อมโยงกับชุดของสภาพแวดล้อมโดยใช้ default_environment , in_environment และ not_in_environment

ตัวอย่างเช่นในชุดข้อมูลนี้คุณลักษณะ tips จะรวมอยู่ในป้ายกำกับสำหรับการฝึกอบรม แต่ไม่มีในข้อมูลการแสดงผล หากไม่มีการระบุสภาพแวดล้อมจะแสดงเป็นความผิดปกติ

serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

tfdv.display_anomalies(serving_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

เราจะจัดการกับคุณสมบัติ tips ด้านล่าง นอกจากนี้เรายังมีค่า INT ในวินาทีการเดินทางของเราซึ่งสคีมาของเราคาดว่าจะมี FLOAT การทำให้เราทราบถึงความแตกต่างนั้น TFDV ช่วยให้ค้นพบความไม่สอดคล้องกันในวิธีสร้างข้อมูลสำหรับการฝึกอบรมและการให้บริการ เป็นเรื่องง่ายมากที่จะไม่รู้ปัญหาเช่นนั้นจนกว่าประสิทธิภาพของโมเดลจะได้รับผลกระทบบางครั้งก็หายนะ อาจเป็นปัญหาสำคัญหรือไม่ก็ได้ แต่ไม่ว่าในกรณีใดสิ่งนี้ควรเป็นสาเหตุสำหรับการตรวจสอบเพิ่มเติม

ในกรณีนี้เราสามารถแปลงค่า INT เป็น FLOAT ได้อย่างปลอดภัยดังนั้นเราจึงต้องการบอกให้ TFDV ใช้สคีมาของเราเพื่ออนุมานประเภท มาทำตอนนี้

options = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)
serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA, stats_options=options)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

tfdv.display_anomalies(serving_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

ตอนนี้เรามีคุณสมบัติ tips (ซึ่งเป็นป้ายกำกับของเรา) ปรากฏขึ้นเป็นความผิดปกติ ('คอลัมน์ตกหล่น') แน่นอนว่าเราไม่คาดหวังว่าจะมีป้ายกำกับในข้อมูลการแสดงผลของเราดังนั้นขอบอก TFDV ให้เพิกเฉย

# All features are by default in both TRAINING and SERVING environments.
schema.default_environment.append('TRAINING')
schema.default_environment.append('SERVING')

# Specify that 'tips' feature is not in SERVING environment.
tfdv.get_feature(schema, 'tips').not_in_environment.append('SERVING')

serving_anomalies_with_env = tfdv.validate_statistics(
    serving_stats, schema, environment='SERVING')

tfdv.display_anomalies(serving_anomalies_with_env)

ตรวจสอบการลอยและเอียง

นอกเหนือจากการตรวจสอบว่าชุดข้อมูลเป็นไปตามความคาดหวังที่กำหนดไว้ในสคีมาแล้ว TFDV ยังมีฟังก์ชันในการตรวจจับการเบี่ยงเบนและการเอียง TFDV ดำเนินการตรวจสอบนี้โดยเปรียบเทียบสถิติของชุดข้อมูลที่แตกต่างกันตามตัวเปรียบเทียบดริฟท์ / เอียงที่ระบุในสคีมา

ดริฟท์

รองรับการตรวจจับดริฟท์สำหรับคุณสมบัติตามหมวดหมู่และระหว่างช่วงข้อมูลที่ต่อเนื่องกัน (เช่นระหว่างช่วง N และช่วง N + 1) เช่นระหว่างวันต่างๆของข้อมูลการฝึกอบรม เราแสดงการดริฟท์ในแง่ของระยะ L-infinity และคุณสามารถกำหนดระยะเกณฑ์เพื่อให้คุณได้รับคำเตือนเมื่อดริฟท์สูงกว่าที่ยอมรับได้ โดยทั่วไปการตั้งค่าระยะทางที่ถูกต้องเป็นกระบวนการซ้ำ ๆ ที่ต้องใช้ความรู้และการทดลองเกี่ยวกับโดเมน

ลาด

TFDV สามารถตรวจจับความเบ้ในข้อมูลของคุณได้สามประเภท ได้แก่ schema skew, feature skew และ distribution skew

Schema Skew

Schema skew เกิดขึ้นเมื่อข้อมูลการฝึกอบรมและการให้บริการไม่เป็นไปตามแบบแผนเดียวกัน ทั้งข้อมูลการฝึกอบรมและการให้บริการคาดว่าจะเป็นไปตามสคีมาเดียวกัน ควรระบุความเบี่ยงเบนที่คาดไว้ระหว่างทั้งสอง (เช่นคุณลักษณะป้ายกำกับที่มีอยู่ในข้อมูลการฝึกอบรมเท่านั้น แต่ไม่ได้แสดงอยู่) ควรระบุผ่านฟิลด์สภาพแวดล้อมในสคีมา

คุณสมบัติเอียง

คุณลักษณะเบ้เกิดขึ้นเมื่อค่าคุณลักษณะที่โมเดลฝึกอยู่แตกต่างจากค่าคุณลักษณะที่เห็นในเวลาแสดงผล ตัวอย่างเช่นอาจเกิดขึ้นเมื่อ:

  • แหล่งข้อมูลที่ให้ค่าคุณลักษณะบางอย่างถูกแก้ไขระหว่างการฝึกอบรมและเวลาให้บริการ
  • มีตรรกะที่แตกต่างกันในการสร้างคุณสมบัติระหว่างการฝึกอบรมและการเสิร์ฟ ตัวอย่างเช่นหากคุณใช้การแปลงบางอย่างในหนึ่งในสองเส้นทางรหัสเท่านั้น

กระจายเอียง

การกระจายเอียงเกิดขึ้นเมื่อการกระจายของชุดข้อมูลการฝึกอบรมแตกต่างจากการกระจายของชุดข้อมูลการแสดงผลอย่างมีนัยสำคัญ สาเหตุสำคัญประการหนึ่งของการกระจายเอียงคือการใช้รหัสที่แตกต่างกันหรือแหล่งข้อมูลที่แตกต่างกันเพื่อสร้างชุดข้อมูลการฝึกอบรม อีกสาเหตุหนึ่งคือกลไกการสุ่มตัวอย่างที่ผิดพลาดซึ่งเลือกตัวอย่างย่อยที่ไม่ใช่ตัวแทนของข้อมูลการแสดงผลเพื่อฝึกอบรม

# Add skew comparator for 'payment_type' feature.
payment_type = tfdv.get_feature(schema, 'payment_type')
payment_type.skew_comparator.infinity_norm.threshold = 0.01

# Add drift comparator for 'company' feature.
company=tfdv.get_feature(schema, 'company')
company.drift_comparator.infinity_norm.threshold = 0.001

skew_anomalies = tfdv.validate_statistics(train_stats, schema,
                                          previous_statistics=eval_stats,
                                          serving_statistics=serving_stats)

tfdv.display_anomalies(skew_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

ในตัวอย่างนี้เราเห็นการลอยตัว แต่ต่ำกว่าเกณฑ์ที่เราตั้งไว้

ตรึงสคีมา

ขณะนี้สคีมาได้รับการตรวจสอบและดูแลแล้วเราจะจัดเก็บสคีมาไว้ในไฟล์เพื่อแสดงสถานะ "หยุดนิ่ง"

from tensorflow.python.lib.io import file_io
from google.protobuf import text_format

file_io.recursive_create_dir(OUTPUT_DIR)
schema_file = os.path.join(OUTPUT_DIR, 'schema.pbtxt')
tfdv.write_schema_text(schema, schema_file)

!cat {schema_file}
feature {
  name: "pickup_community_area"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "fare"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_month"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_hour"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_day"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_timestamp"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_latitude"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_longitude"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "dropoff_latitude"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_count: 1
  }
}
feature {
  name: "dropoff_longitude"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_count: 1
  }
}
feature {
  name: "trip_miles"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_census_tract"
  type: BYTES
  presence {
    min_count: 0
  }
}
feature {
  name: "dropoff_census_tract"
  value_count {
    min: 1
    max: 1
  }
  type: INT
  presence {
    min_count: 1
  }
}
feature {
  name: "payment_type"
  type: BYTES
  domain: "payment_type"
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  skew_comparator {
    infinity_norm {
      threshold: 0.01
    }
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "company"
  value_count {
    min: 1
    max: 1
  }
  type: BYTES
  domain: "company"
  presence {
    min_count: 1
  }
  distribution_constraints {
    min_domain_mass: 0.9
  }
  drift_comparator {
    infinity_norm {
      threshold: 0.001
    }
  }
}
feature {
  name: "trip_seconds"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "dropoff_community_area"
  value_count {
    min: 1
    max: 1
  }
  type: INT
  presence {
    min_count: 1
  }
}
feature {
  name: "tips"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  not_in_environment: "SERVING"
  shape {
    dim {
      size: 1
    }
  }
}
string_domain {
  name: "payment_type"
  value: "Cash"
  value: "Credit Card"
  value: "Dispute"
  value: "No Charge"
  value: "Pcard"
  value: "Unknown"
  value: "Prcard"
}
string_domain {
  name: "company"
  value: "0118 - 42111 Godfrey S.Awir"
  value: "0694 - 59280 Chinesco Trans Inc"
  value: "1085 - 72312 N and W Cab Co"
  value: "2733 - 74600 Benny Jona"
  value: "2809 - 95474 C & D Cab Co Inc."
  value: "3011 - 66308 JBL Cab Inc."
  value: "3152 - 97284 Crystal Abernathy"
  value: "3201 - C&D Cab Co Inc"
  value: "3201 - CID Cab Co Inc"
  value: "3253 - 91138 Gaither Cab Co."
  value: "3385 - 23210 Eman Cab"
  value: "3623 - 72222 Arrington Enterprises"
  value: "3897 - Ilie Malec"
  value: "4053 - Adwar H. Nikola"
  value: "4197 - 41842 Royal Star"
  value: "4615 - 83503 Tyrone Henderson"
  value: "4615 - Tyrone Henderson"
  value: "4623 - Jay Kim"
  value: "5006 - 39261 Salifu Bawa"
  value: "5006 - Salifu Bawa"
  value: "5074 - 54002 Ahzmi Inc"
  value: "5074 - Ahzmi Inc"
  value: "5129 - 87128"
  value: "5129 - 98755 Mengisti Taxi"
  value: "5129 - Mengisti Taxi"
  value: "5724 - KYVI Cab Inc"
  value: "585 - Valley Cab Co"
  value: "5864 - 73614 Thomas Owusu"
  value: "5864 - Thomas Owusu"
  value: "5874 - 73628 Sergey Cab Corp."
  value: "5997 - 65283 AW Services Inc."
  value: "5997 - AW Services Inc."
  value: "6488 - 83287 Zuha Taxi"
  value: "6743 - Luhak Corp"
  value: "Blue Ribbon Taxi Association Inc."
  value: "C & D Cab Co Inc"
  value: "Chicago Elite Cab Corp."
  value: "Chicago Elite Cab Corp. (Chicago Carriag"
  value: "Chicago Medallion Leasing INC"
  value: "Chicago Medallion Management"
  value: "Choice Taxi Association"
  value: "Dispatch Taxi Affiliation"
  value: "KOAM Taxi Association"
  value: "Northwest Management LLC"
  value: "Taxi Affiliation Services"
  value: "Top Cab Affiliation"
}
default_environment: "TRAINING"
default_environment: "SERVING"

เมื่อใดควรใช้ TFDV

เป็นเรื่องง่ายที่จะคิดว่า TFDV ใช้กับจุดเริ่มต้นของขั้นตอนการฝึกอบรมของคุณเท่านั้นเช่นเดียวกับที่เราทำที่นี่ แต่ในความเป็นจริงมันมีประโยชน์มากมาย นี่คือข้อมูลเพิ่มเติมเล็กน้อย:

  • การตรวจสอบความถูกต้องของข้อมูลใหม่สำหรับการอนุมานเพื่อให้แน่ใจว่าเราไม่ได้เริ่มได้รับคุณลักษณะที่ไม่ดีในทันที
  • การตรวจสอบข้อมูลใหม่สำหรับการอนุมานเพื่อให้แน่ใจว่าโมเดลของเราได้รับการฝึกฝนในส่วนนั้นของพื้นผิวการตัดสินใจ
  • ตรวจสอบความถูกต้องของข้อมูลของเราหลังจากที่เราแปลงร่างและทำวิศวกรรมฟีเจอร์ (อาจใช้ TensorFlow Transform ) เพื่อให้แน่ใจว่าเราไม่ได้ทำอะไรผิดพลาด