ตัวอย่างส่วนประกอบหลักของ TensorFlow Extended
ตัวอย่างสมุดบันทึก colab นี้แสดงให้เห็นว่าสามารถใช้ TensorFlow Data Validation (TFDV) เพื่อตรวจสอบและแสดงภาพชุดข้อมูลของคุณได้อย่างไร ซึ่งรวมถึงการดูสถิติเชิงพรรณนา การอนุมานสคีมา การตรวจสอบและแก้ไขความผิดปกติ และการตรวจสอบการเบี่ยงเบนและความเบ้ในชุดข้อมูลของเรา สิ่งสำคัญคือต้องเข้าใจลักษณะของชุดข้อมูลของคุณ ซึ่งรวมถึงการเปลี่ยนแปลงเมื่อเวลาผ่านไปในไปป์ไลน์การผลิตของคุณ นอกจากนี้ คุณควรมองหาความผิดปกติในข้อมูลของคุณ และเปรียบเทียบชุดข้อมูลการฝึกอบรม การประเมิน และการให้บริการเพื่อให้แน่ใจว่ามีความสอดคล้องกัน
เราจะใช้ข้อมูลจาก ชุดข้อมูล Taxi Trips ที่ออกโดยเมืองชิคาโก
อ่านเพิ่มเติม เกี่ยวกับชุดข้อมูลใน Google BigQuery สำรวจชุดข้อมูลทั้งหมดใน BigQuery UI
คอลัมน์ในชุดข้อมูลคือ:
รถปิคอัพ_ชุมชน_พื้นที่ | ค่าโดยสาร | trip_start_month |
trip_start_hour | trip_start_day | trip_start_timestamp |
รถปิคอัพ_ละติจูด | รถกระบะ_ลองจิจูด | dropoff_latitude |
dropoff_longitude | trip_miles | pickup_census_tract |
dropoff_census_tract | ประเภทการชำระเงิน | บริษัท |
trip_seconds | dropoff_community_area | เคล็ดลับ |
ติดตั้งและนำเข้าแพ็คเกจ
ติดตั้งแพ็คเกจสำหรับการตรวจสอบความถูกต้องของข้อมูล TensorFlow
อัพเกรด Pip
เพื่อหลีกเลี่ยงการอัพเกรด Pip ในระบบเมื่อรันในเครื่อง ให้ตรวจสอบว่าเรากำลังทำงานใน Colab แน่นอนว่าระบบในพื้นที่สามารถอัพเกรดแยกกันได้
try:
import colab
!pip install --upgrade pip
except:
pass
ติดตั้งแพ็คเกจตรวจสอบข้อมูล
ติดตั้งแพ็คเกจ TensorFlow Data Validation และการอ้างอิง ซึ่งใช้เวลาสองสามนาที คุณอาจเห็นคำเตือนและข้อผิดพลาดเกี่ยวกับเวอร์ชันการขึ้นต่อกันที่เข้ากันไม่ได้ ซึ่งคุณจะแก้ไขในส่วนถัดไป
print('Installing TensorFlow Data Validation')
!pip install --upgrade 'tensorflow_data_validation[visualization]<2'
นำเข้า TensorFlow และโหลดแพ็คเกจที่อัปเดตใหม่
ขั้นตอนก่อนหน้าจะอัปเดตแพ็คเกจเริ่มต้นในสภาพแวดล้อม Gooogle Colab ดังนั้นคุณต้องโหลดทรัพยากรของแพ็คเกจซ้ำเพื่อแก้ไขการขึ้นต่อกันใหม่
import pkg_resources
import importlib
importlib.reload(pkg_resources)
<module 'pkg_resources' from '/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py'>
ตรวจสอบเวอร์ชันของ TensorFlow และ Data Validation ก่อนดำเนินการต่อ
import tensorflow as tf
import tensorflow_data_validation as tfdv
print('TF version:', tf.__version__)
print('TFDV version:', tfdv.version.__version__)
TF version: 2.7.0 TFDV version: 1.5.0
โหลดชุดข้อมูล
เราจะดาวน์โหลดชุดข้อมูลของเราจาก 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/tmp_waiqx43/data: eval serving train /tmp/tmp_waiqx43/data/eval: data.csv /tmp/tmp_waiqx43/data/serving: data.csv /tmp/tmp_waiqx43/data/train: data.csv
คำนวณและแสดงภาพสถิติ
อันดับแรก เราจะใช้ 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: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_data_validation/utils/stats_util.py:246: 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_data_validation/utils/stats_util.py:246: 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
ได้อย่างไร - ลองเลือก "ปริมาณ" จากเมนู "แผนภูมิที่จะแสดง" แล้ววางเมาส์เหนือเครื่องหมายเพื่อแสดงเปอร์เซ็นต์ของปริมาณ
# docs-infra: no-execute
tfdv.visualize_statistics(train_stats)
อนุมานสคีมา
ตอนนี้ ลองใช้ tfdv.infer_schema
เพื่อสร้างสคีมาสำหรับข้อมูลของเรา สคีมากำหนดข้อจำกัดสำหรับข้อมูลที่เกี่ยวข้องกับ ML ตัวอย่างข้อจำกัดรวมถึงชนิดข้อมูลของคุณลักษณะแต่ละอย่าง ไม่ว่าจะเป็นตัวเลขหรือหมวดหมู่ หรือความถี่ของการมีอยู่ของมันในข้อมูล สำหรับคุณสมบัติการจัดหมวดหมู่ สคีมายังกำหนดโดเมน - รายการค่าที่ยอมรับได้ เนื่องจากการเขียนสคีมาอาจเป็นงานที่น่าเบื่อ โดยเฉพาะสำหรับชุดข้อมูลที่มีคุณสมบัติมากมาย TFDV จึงมีวิธีการสร้างเวอร์ชันเริ่มต้นของสคีมาตามสถิติเชิงพรรณนา
การทำให้สคีมาถูกต้องเป็นสิ่งสำคัญ เนื่องจากไพพ์ไลน์การผลิตที่เหลือของเราจะขึ้นอยู่กับสคีมาที่ TFDV สร้างขึ้นเพื่อให้ถูกต้อง สคีมายังมีเอกสารประกอบสำหรับข้อมูล และดังนั้นจึงมีประโยชน์เมื่อนักพัฒนาที่แตกต่างกันทำงานบนข้อมูลเดียวกัน ลองใช้ tfdv.display_schema
เพื่อแสดง schema ที่อนุมาน เพื่อให้เราสามารถตรวจทานได้
schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)
ตรวจสอบข้อมูลการประเมินเพื่อหาข้อผิดพลาด
จนถึงตอนนี้เราเพิ่งดูข้อมูลการฝึกเท่านั้น ข้อมูลการประเมินของเราจะต้องสอดคล้องกับข้อมูลการฝึกอบรมของเรา ซึ่งรวมถึงข้อมูลที่ใช้สคีมาเดียวกันเป็นสิ่งสำคัญ ข้อมูลการประเมินจะต้องรวมตัวอย่างของช่วงค่าเดียวกันโดยประมาณสำหรับคุณลักษณะเชิงตัวเลขของเราเป็นข้อมูลการฝึกอบรม เพื่อให้ความครอบคลุมของพื้นผิวการสูญเสียระหว่างการประเมินจะเหมือนกับในระหว่างการฝึกอบรม เช่นเดียวกับคุณสมบัติหมวดหมู่ มิฉะนั้น เราอาจมีปัญหาด้านการฝึกอบรมที่ไม่ได้ระบุในระหว่างการประเมิน เนื่องจากเราไม่ได้ประเมินส่วนหนึ่งของการสูญเสียของเรา
- โปรดสังเกตว่าตอนนี้แต่ละฟีเจอร์มีสถิติสำหรับทั้งชุดข้อมูลการฝึกอบรมและการประเมิน
- โปรดสังเกตว่าตอนนี้แผนภูมิมีทั้งชุดข้อมูลการฝึกอบรมและการประเมินซ้อนทับ ทำให้ง่ายต่อการเปรียบเทียบ
- โปรดสังเกตว่าตอนนี้แผนภูมิมีมุมมองแบบเปอร์เซ็นต์ ซึ่งสามารถใช้ร่วมกับบันทึกหรือมาตราส่วนเชิงเส้นที่เป็นค่าเริ่มต้นได้
- โปรดสังเกตว่าค่าเฉลี่ยและค่ามัธยฐานสำหรับ
trip_miles
สำหรับการฝึกอบรมเทียบกับชุดข้อมูลการประเมินต่างกัน จะทำให้เกิดปัญหาหรือไม่? - ว้าว
tips
สูงสุดสำหรับการฝึกอบรมกับชุดข้อมูลการประเมินแตกต่างกันมาก จะทำให้เกิดปัญหาหรือไม่? - คลิกขยายบนแผนภูมิคุณสมบัติตัวเลข และเลือกมาตราส่วนบันทึก ตรวจสอบคุณสมบัติ
trip_seconds
และสังเกตเห็นความแตกต่างในค่าสูงสุด การประเมินจะพลาดชิ้นส่วนของพื้นผิวที่สูญเสียหรือไม่?
# Compute stats for evaluation data
eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
# docs-infra: no-execute
# 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)
แก้ไขความผิดปกติของการประเมินในสคีมา
อ๊ะ! ดูเหมือนว่าเรามีค่านิยมใหม่ๆ สำหรับ 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)
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
เราจะจัดการกับคุณลักษณะ 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)
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
ตอนนี้เราเพิ่งมีคุณลักษณะ 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-อินฟินิตี้ และคุณสามารถตั้งค่าระยะห่างเกณฑ์เพื่อให้คุณได้รับคำเตือนเมื่อดริฟท์สูงกว่าที่ยอมรับได้ การกำหนดระยะทางที่ถูกต้องมักจะเป็นกระบวนการที่ต้องทำซ้ำซึ่งต้องใช้ความรู้และการทดลองในโดเมน
ลาด
TFDV สามารถตรวจจับความเบ้ที่แตกต่างกันสามแบบในข้อมูลของคุณ - สคีมาเบ้ คุณสมบัติเบ้ และการกระจายแบบเบ้
สคีมา Skew
สคีมาเอียงเกิดขึ้นเมื่อข้อมูลการฝึกอบรมและการให้บริการไม่สอดคล้องกับสคีมาเดียวกัน ข้อมูลการฝึกอบรมและการให้บริการคาดว่าจะเป็นไปตามสคีมาเดียวกัน ควรระบุความเบี่ยงเบนที่คาดหวังระหว่างทั้งสอง (เช่น คุณลักษณะป้ายกำกับที่มีอยู่ในข้อมูลการฝึกอบรมเท่านั้น แต่ไม่อยู่ในการให้บริการ) ผ่านฟิลด์สภาพแวดล้อมในสคีมา
ฟีเจอร์ 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)
ในตัวอย่างนี้ เราเห็นการดริฟท์บางส่วน แต่อยู่ต่ำกว่าเกณฑ์ที่เรากำหนดไว้
ตรึงสคีมา
ตอนนี้ schema ได้รับการตรวจสอบและดูแล เราจะจัดเก็บไว้ในไฟล์เพื่อแสดงสถานะ "หยุดนิ่ง"
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 ) เพื่อให้แน่ใจว่าเราไม่ได้ทำอะไรผิด