הצטרף לקהילת SIG TFX-Addons ועזור לשפר את TFX!
דף זה תורגם על ידי Cloud Translation API.
Switch to English

התחל בעבודה עם אימות נתונים של Tensorflow

אימות נתונים של Tensorflow (TFDV) יכול לנתח את נתוני האימון וההגשה ל:

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

מחשוב סטטיסטיקה של נתונים תיאוריים

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

לדוגמא, נניח path מצביע על קובץ בתבנית TFRecord (המחזיקה רשומות מסוג tensorflow.Example . tensorflow.Example ). הקטע הבא ממחיש את חישוב הסטטיסטיקה באמצעות TFDV:

    stats = tfdv.generate_statistics_from_tfrecord(data_location=path)

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

    tfdv.visualize_statistics(stats)

צילום מסך של הדמיה סטטיסטית

הדוגמה הקודמת מניחה כי הנתונים נשמרים בקובץ TFRecord . TFDV תומך גם בפורמט קלט CSV, עם הרחבה לפורמטים נפוצים אחרים. תוכל למצוא את מפענחי הנתונים הזמינים כאן . בנוסף, TFDV מספק את פונקציית השירות tfdv.generate_statistics_from_dataframe למשתמשים עם נתוני זיכרון המיוצגים כ- DataFrame של פנדה.

בנוסף למחשוב סט ברירת מחדל של נתונים סטטיסטיים, TFDV יכול גם לחשב סטטיסטיקה עבור תחומים סמנטיים (למשל, תמונות, טקסט). כדי לאפשר חישוב של נתונים סטטיסטיים של תחום סמנטי, העבר אובייקט enable_semantic_domain_stats עם enable_semantic_domain_stats מוגדרת כ- True ל- tfdv.generate_statistics_from_tfrecord .

פועל ב- Google Cloud

באופן פנימי, TFDV משתמשת במסגרת העיבוד המקבילית של Apache Beam כדי להגדיל את חישוב הסטטיסטיקה על פני מערכי נתונים גדולים. עבור יישומים המעוניינים להשתלב עמוק יותר עם TFDV (למשל לצרף יצירת סטטיסטיקה בסוף צינור ייצור נתונים , ליצור נתונים סטטיסטיים עבור נתונים בפורמט מותאם אישית ), ה- API גם חושף Beam PTransform לייצור סטטיסטיקה.

כדי להריץ TFDV ב- Google Cloud, יש להוריד את קובץ הגלגל TFDV ולספק אותו לעובדי Dataflow. הורד את קובץ הגלגל לספריה הנוכחית באופן הבא:

pip download tensorflow_data_validation \
  --no-deps \
  --platform manylinux2010_x86_64 \
  --only-binary=:all:

הקטע הבא מציג דוגמה לשימוש ב- TFDV ב- Google Cloud:


import tensorflow_data_validation as tfdv
from apache_beam.options.pipeline_options import PipelineOptions, GoogleCloudOptions, StandardOptions, SetupOptions

PROJECT_ID = ''
JOB_NAME = ''
GCS_STAGING_LOCATION = ''
GCS_TMP_LOCATION = ''
GCS_DATA_LOCATION = ''
# GCS_STATS_OUTPUT_PATH is the file path to which to output the data statistics
# result.
GCS_STATS_OUTPUT_PATH = ''

PATH_TO_WHL_FILE = ''


# Create and set your PipelineOptions.
options = PipelineOptions()

# For Cloud execution, set the Cloud Platform project, job_name,
# staging location, temp_location and specify DataflowRunner.
google_cloud_options = options.view_as(GoogleCloudOptions)
google_cloud_options.project = PROJECT_ID
google_cloud_options.job_name = JOB_NAME
google_cloud_options.staging_location = GCS_STAGING_LOCATION
google_cloud_options.temp_location = GCS_TMP_LOCATION
options.view_as(StandardOptions).runner = 'DataflowRunner'

setup_options = options.view_as(SetupOptions)
# PATH_TO_WHL_FILE should point to the downloaded tfdv wheel file.
setup_options.extra_packages = [PATH_TO_WHL_FILE]

tfdv.generate_statistics_from_tfrecord(GCS_DATA_LOCATION,
                                       output_path=GCS_STATS_OUTPUT_PATH,
                                       pipeline_options=options)

במקרה זה, פרוטו הסטטיסטיקה שנוצר נשמר בקובץ TFRecord שנכתב ל- GCS_STATS_OUTPUT_PATH .

הערה בעת קריאה לאחת tfdv.generate_statistics_... (למשל, tfdv.generate_statistics_from_tfrecord ) ב- Google Cloud, עליך לספק נתיב output_path . ציון אף אחד עלול לגרום לשגיאה.

להסיק סכמה על הנתונים

הסכימה מתארת ​​את המאפיינים הצפויים של הנתונים. חלק ממאפיינים אלה הם:

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

בקיצור, הסכימה מתארת ​​את הציפיות לנתונים "נכונים" ובכך יכולה לשמש לאיתור שגיאות בנתונים (שתואר להלן). יתר על כן, באותה סכימה ניתן להשתמש כדי להגדיר טרנספורמציה של Tensorflow עבור טרנספורמציות נתונים. שים לב כי הסכימה צפויה להיות סטטית למדי, למשל, מספר מערכי נתונים יכולים להתאים לאותה סכימה, בעוד שהסטטיסטיקה (שתוארה לעיל) יכולה להשתנות לפי מערך נתונים.

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

    schema = tfdv.infer_schema(stats)

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

כברירת מחדל, tfdv.infer_schema מסיק את הצורה של כל תכונה נדרשת, אם value_count.min שווה ל- value_count.max עבור התכונה. הגדר את טיעון infer_feature_shape False כדי להשבית את הסקת הצורה.

הסכימה עצמה מאוחסנת כמאגר פרוטוקול Schema וכך ניתן לעדכן / לערוך אותה באמצעות ממשק ה- API של מאגר הפרוטוקולים הסטנדרטי. TFDV מספק גם כמה שיטות שירות כדי להקל על העדכונים הללו. לדוגמה, נניח payment_type מכילה את הבית הבא לתיאור תכונת מחרוזת נדרשת payment_type שלוקח ערך יחיד:

feature {
  name: "payment_type"
  value_count {
    min: 1
    max: 1
  }
  type: BYTES
  domain: "payment_type"
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}

כדי לסמן כי יש לאכלס את התכונה בלפחות 50% מהדוגמאות:

    tfdv.get_feature(schema, 'payment_type').presence.min_fraction = 0.5

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

צילום מסך של ויזואליזציה של הסכימה

בדיקת הנתונים לגבי שגיאות

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

התאמת הסטטיסטיקה של מערך הנתונים לסכמה

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

    # Assume that other_path points to another TFRecord file
    other_stats = tfdv.generate_statistics_from_tfrecord(data_location=other_path)
    anomalies = tfdv.validate_statistics(statistics=other_stats, schema=schema)

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

זה מייצר אנומליה

   payment_type  Unexpected string values  Examples contain values missing from the schema: Prcard (<1%).

המציין כי ערך נתונים מחוץ לתחום נמצא בסטטיסטיקה ב- <1% מערכי התכונות.

אם זה היה צפוי, ניתן לעדכן את הסכימה באופן הבא:

   tfdv.get_domain(schema, 'payment_type').value.append('Prcard')

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

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

המחברת לדוגמא מכילה הדמיה פשוטה של ​​החריגות כטבלה, המפרטת את התכונות בהן מתגלות שגיאות ותיאור קצר של כל שגיאה.

צילום מסך של חריגות

בודק אם קיימות שגיאות על פי דוגמה

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

   options = tfdv.StatsOptions(schema=schema)
   anomalous_example_stats = tfdv.validate_examples_in_tfrecord(
       data_location=input, stats_options=options)

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

סביבות סכמה

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

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

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

    serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
    serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

צילום מסך של חריגות הגשה

כדי לתקן זאת, עלינו להגדיר את סביבת ברירת המחדל שכל התכונות יהיו הן 'TRAINING' והן 'SERVING', ולהוציא את תכונת 'tips' מסביבת SERVING.

    # 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 מספק גם פונקציות לזיהוי:

  • להטות בין אימונים לנתוני הגשה
  • להיסחף בין ימים שונים של נתוני אימון

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

    # Assume we have already generated the statistics of training dataset, and
    # inferred a schema from it.
    serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
    # Add a skew comparator to schema for 'payment_type' and set the threshold
    # of L-infinity norm for triggering skew anomaly to be 0.01.
    tfdv.get_feature(schema, 'payment_type').skew_comparator.infinity_norm.threshold = 0.01
    skew_anomalies = tfdv.validate_statistics(
        statistics=train_stats, schema=schema, serving_statistics=serving_stats)

הערה כדי לזהות הטיה בתכונות מספריות, ציין סף jensen_shannon_divergence במקום סף infinity_norm skew_comparator .

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

   payment_type  High L-infinity distance between serving and training  The L-infinity distance between serving and training is 0.0435984 (up to six significant digits), above the threshold 0.01. The feature value with maximum difference is: Cash

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

המחברת לדוגמא מכילה דוגמה פשוטה לבדיקת חריגות מבוססות הטיה.

איתור סחיפה בין ימים שונים של נתוני אימונים יכול להיעשות באופן דומה

    # Assume we have already generated the statistics of training dataset for
    # day 2, and inferred a schema from it.
    train_day1_stats = tfdv.generate_statistics_from_tfrecord(data_location=train_day1_data_path)
    # Add a drift comparator to schema for 'payment_type' and set the threshold
    # of L-infinity norm for triggering drift anomaly to be 0.01.
    tfdv.get_feature(schema, 'payment_type').drift_comparator.infinity_norm.threshold = 0.01
    drift_anomalies = tfdv.validate_statistics(
        statistics=train_day2_stats, schema=schema, previous_statistics=train_day1_stats)

הערה כדי לזהות הטיה לתכונות מספריות, ציין סף jensen_shannon_divergence במקום סף infinity_norm drift_comparator .

כותב מחבר נתונים מותאם אישית

לצורך חישוב נתונים סטטיסטיים, TFDV מספק מספר שיטות נוחות לטיפול בנתוני קלט בפורמטים שונים (למשל TFRecord של TFRecord דוגמה , CSV וכו '). אם פורמט הנתונים שלך לא מופיע ברשימה זו, עליך לכתוב מחבר נתונים מותאם אישית לקריאת נתוני קלט ולחבר אותו ל- API הליבה של TFDV לצורך חישוב נתונים סטטיסטיים.

ממשק ה- API של TFDV לסטטיסטיקה של מחשוב נתונים הוא Beam PTransform אשר לוקח אוסף PC של קבוצות של דוגמאות קלט (אצווה של דוגמאות קלט מיוצג כ- Arrow RecordBatch), ומפיק PCollection המכיל מאגר פרוטוקול DatasetFeatureStatisticsList יחיד.

לאחר שהטמעתם את מחבר הנתונים המותאם אישית שמקבץ את דוגמאות הקלט שלכם ב- Arrow RecordBatch, עליכם לחבר אותו ל- API tfdv.GenerateStatistics לצורך חישוב הנתונים הסטטיסטיים. קח TFRecord של tf.train.Example . לדוגמא למשל. אנו מספקים את מחבר הנתונים מדגם DecodeTFE , ולהלן דוגמה כיצד לחבר אותו ל- API tfdv.GenerateStatistics .

import tensorflow_data_validation as tfdv
import apache_beam as beam
from tensorflow_metadata.proto.v0 import statistics_pb2

DATA_LOCATION = ''
OUTPUT_LOCATION = ''

with beam.Pipeline() as p:
    _ = (
    p
    # 1. Read out the examples from input files.
    | 'ReadData' >> beam.io.ReadFromTFRecord(file_pattern=DATA_LOCATION)
    # 2. Convert examples to Arrow RecordBatches, which represent example
    #    batches.
    | 'DecodeData' >> tf_example_decoder.DecodeTFExample()
    # 3. Invoke TFDV `GenerateStatistics` API to compute the data statistics.
    | 'GenerateStatistics' >> tfdv.GenerateStatistics()
    # 4. Materialize the generated data statistics.
    | 'WriteStatsOutput' >> WriteStatisticsToTFRecord(OUTPUT_LOCATION))

מחשבים סטטיסטיים על פני פרוסות נתונים

ניתן להגדיר את TFDV לחישוב נתונים סטטיסטיים על פני פרוסות נתונים. ניתן לאפשר חיתוך על ידי מתן פונקציות חיתוך שלוקחות חץ RecordBatch רצף של צמרות צורה (slice key, record batch) . TFDV מספק דרך קלה לייצר פונקציות חיתוך מבוססות על ערך תכונות שניתן לספק כחלק מ- tfdv.StatsOptions בעת מחשוב סטטיסטי.

כאשר חיתוך מופעל, הפלט DatasetFeatureStatisticsList פרוטו מכיל מספר תמונות DatasetFeatureStatistics , אחת לכל פרוסה. כל פרוסה מזוהה על ידי שם ייחודי אשר מוגדר כשם מערך הנתונים בפרוטו DatasetFeatureStatistics . כברירת מחדל TFDV מחשבת נתונים סטטיסטיים עבור מערך הנתונים הכללי בנוסף לפרוסות שהוגדרו.

import tensorflow_data_validation as tfdv
from tensorflow_data_validation.utils import slicing_util

# Slice on country feature (i.e., every unique value of the feature).
slice_fn1 = slicing_util.get_feature_value_slicer(features={'country': None})

# Slice on the cross of country and state feature (i.e., every unique pair of
# values of the cross).
slice_fn2 = slicing_util.get_feature_value_slicer(
    features={'country': None, 'state': None})

# Slice on specific values of a feature.
slice_fn3 = slicing_util.get_feature_value_slicer(
    features={'age': [10, 50, 70]})

stats_options = tfdv.StatsOptions(
    slice_functions=[slice_fn1, slice_fn2, slice_fn3])