הצטרף ל-TensorFlow ב-Google I/O, 11-12 במאי הירשם עכשיו

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

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

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

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

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

לדוגמה, נניח כי path נקודות לקובץ ב TFRecord פורמט (המחזיקה רשומות מסוג 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 יכול גם לחשב נתונים סטטיסטיים עבור תחומים סמנטיים (למשל, תמונות, טקסט). כדי לאפשר חישוב הסטטיסטיקה תחום סמנטי, להעביר tfdv.StatsOptions אובייקט עם 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 . ציון None עלול לגרום לשגיאה.

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

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

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

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

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

    schema = tfdv.infer_schema(stats)

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

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

הסכימה עצמו מאוחסנת בתור חיץ פרוטוקול סכימה ולכן יכולה להיות מעודכנת / ונערכה באמצעות ה- API פרוטוקול-בופר הסטנדרטית. TFDV מספק גם שיטות שירות כמה לבצע עדכונים אלה קלים יותר. לדוגמה, נניח כי הסכימה מכילה את הבית הבא כדי לתאר תכונה מחרוזת נדרש 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 חיץ פרוטוקול שבו כל מערך נתונים מורכב סט של דוגמאות שמראות אנומליה מסוימת. אתה יכול להשתמש בזה כדי לקבוע את מספר הדוגמאות במערך הנתונים שלך שמציגות אנומליה נתונה ואת המאפיינים של דוגמאות אלו.

סביבות סכימה

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

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

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

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

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

כדי לתקן זאת, עלינו להגדיר את סביבת ברירת המחדל עבור כל התכונות להיות גם 'TRAINING' וגם 'SERVING', ולא לכלול את תכונת ה'טיפים' מסביבת 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 .

אותו דבר עם בדיקה אם הנתונים תואמים לציפיות בסכימה, התוצאה היא גם מופע של מומים חיץ פרוטוקול ומתאר כל skew בין ההכשרה מערכי נתונים המשרתים. לדוגמה, נניח את הנתונים המשרתים מכיל משמעותית יותר דוגמאות עם תכונת 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 של tf.train.Example , CSV, וכו '). אם פורמט הנתונים שלך אינו ברשימה זו, עליך לכתוב מחבר נתונים מותאם אישית לקריאת נתוני קלט, ולחבר אותו ל-API הליבה של TFDV למחשוב נתונים סטטיסטיים.

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

לאחר שתיישם את מחבר הנתונים המותאם אישית בקבוצות דוגמאות הקלט שלך חץ RecordBatch, אתה צריך לחבר אותו עם tfdv.GenerateStatistics API לחישוב נתוני הסטטיסטיקה. קח TFRecord של tf.train.Example "s למשל. tfx_bsl מספק את TFExampleRecord מחבר נתונים, ומתחת הוא דוגמה איך לחבר אותו עם tfdv.GenerateStatistics API.

import tensorflow_data_validation as tfdv
from tfx_bsl.public import tfxio
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 and decode the data with tfx_bsl.
    | 'TFXIORead' >> (
          tfxio.TFExampleRecord(
              file_pattern=[DATA_LOCATION],
              telemetry_descriptors=['my', 'tfdv']).BeamSource())
    # 2. Invoke TFDV `GenerateStatistics` API to compute the data statistics.
    | 'GenerateStatistics' >> tfdv.GenerateStatistics()
    # 3. Materialize the generated data statistics.
    | 'WriteStatsOutput' >> WriteStatisticsToTFRecord(OUTPUT_LOCATION))

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

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

כשהוא חותך מופעל, תפוקת DatasetFeatureStatisticsList פרוטו מכיל מספר DatasetFeatureStatistics Protos, אחד עבור כול פרוסה. כל פרוסה מזוהה על ידי שם ייחודי אשר מוגדר בתור שם במערך של פרוטו 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])