روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

با اعتبار سنجی داده Tensorflow شروع کنید

اعتبار سنجی داده Tensorflow (TFDV) می تواند آموزش و ارائه داده ها را برای موارد زیر تجزیه و تحلیل کند:

API اصلی با بهره گیری از روشهای راحتی که از بالا ساخته می شوند و می توان آنها را در زمینه نوت بوک ها فراخوانی کرد ، از هر عملکرد پشتیبانی می کند.

محاسبه آمار توصیفی داده ها

TFDV می تواند آمار توصیفی را محاسبه کند که یک مرور کلی از داده ها را از نظر ویژگی های موجود و اشکال توزیع ارزش آنها ارائه می دهد. ابزارهایی مانند Facets Overview می توانند تصویری خلاصه از این آمار را برای مرور آسان فراهم کنند.

به عنوان مثال ، فرض کنید آن path به فایلی با قالب TFRecord (که رکوردهایی از نوع tensorflow.Example ) نشان می دهد. به عنوان مثال. قطعه زیر محاسبه آمار با استفاده از TFDV را نشان می دهد:

    stats = tfdv.generate_statistics_from_tfrecord(data_location=path)

مقدار برگشتی یک بافر پروتکل DatasetFeatureStatisticsList است. نوت بوک نمونه شامل تجسم آمار با استفاده از Facets Overview :

    tfdv.visualize_statistics(stats)

عکس صفحه از تجسم آمار

مثال قبلی فرض می کند که داده ها در یک فایل TFRecord ذخیره شده اند. TFDV همچنین از فرمت ورودی CSV ، با قابلیت توسعه برای سایر فرمت های رایج ، پشتیبانی می کند. رمزگشاهای داده موجود را می توانید در اینجا پیدا کنید . علاوه بر این ، TFDV تابع سودمندی tfdv.generate_statistics_from_dataframe را برای کاربران با داده در حافظه ارائه شده به عنوان یک پاندا DataFrame فراهم می کند.

علاوه بر محاسبه یک مجموعه پیش فرض از آمار داده ، TFDV همچنین می تواند آماری را برای حوزه های معنایی (مثلاً تصاویر ، متن) محاسبه کند. برای فعال کردن محاسبه آمار دامنه معنایی ، یک شی tfdv.StatsOptions را با تنظیمات_ enable_semantic_domain_stats تنظیم کنید تا روی True to 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 ذخیره می GCS_STATS_OUTPUT_PATH .

توجه هنگام فراخوانی هر یک از توابع tfdv.generate_statistics_... (به عنوان مثال ، tfdv.generate_statistics_from_tfrecord ) در Google Cloud ، باید مسیر output_path ارائه output_path . مشخص کردن هیچ یک ممکن است خطایی ایجاد کند.

استنباط طرحواره روی داده ها

طرح واره خصوصیات مورد انتظار داده را توصیف می کند. برخی از این خصوصیات عبارتند از:

  • کدام ویژگی ها انتظار می رود وجود داشته باشد
  • نوع آنها
  • تعداد مقادیر یک ویژگی در هر مثال
  • وجود هر ویژگی در تمام مثال ها
  • دامنه های مورد انتظار از ویژگی ها.

به طور خلاصه ، این طرح انتظارات برای داده های "صحیح" را توصیف می کند و بنابراین می تواند برای تشخیص خطاهای موجود در داده ها مورد استفاده قرار گیرد (در زیر توضیح داده شده است) علاوه بر این ، می توان از همان طرح برای تنظیم تبدیل Tensorflow برای تبدیل داده ها استفاده کرد. توجه داشته باشید که انتظار می رود طرح نسبتاً ساکن باشد ، به عنوان مثال ، چندین مجموعه داده می توانند با همان طرح مطابقت داشته باشند ، در حالی که آمار (توضیح داده شده در بالا) می تواند در هر مجموعه داده متفاوت باشد.

از آنجا که نوشتن یک طرحواره می تواند کاری خسته کننده باشد ، خصوصاً برای مجموعه داده هایی که دارای ویژگی های زیادی هستند ، TFDV روشی را برای تولید نسخه اولیه طرحواره بر اساس آمار توصیفی ارائه می دهد:

    schema = tfdv.infer_schema(stats)

به طور کلی ، TFDV از روشهای اکتشافی محافظه کارانه برای استنباط خواص داده پایدار از آمار استفاده می کند تا از قرار دادن بیش از حد طرح به مجموعه داده خاص جلوگیری کند. اکیداً توصیه می شود برای گرفتن هرگونه دانش دامنه در مورد داده هایی که ممکن است ابتکارات TFDV از دست داده باشد ، طرح استنباط شده را بازبینی کرده و آن را در صورت لزوم اصلاح کنید .

به طور پیش فرض ، tfdv.infer_schema شکل هر ویژگی مورد نیاز را value_count.min ، اگر value_count.min برابر با value_count.max برای ویژگی باشد. آرگومان infer_feature_shape را روی False تنظیم کنید تا استنباط شکل غیرفعال شود.

این طرح به خودی خود به عنوان یک بافر پروتکل Schema ذخیره می شود و بنابراین می تواند با استفاده از استاندارد 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)

نتیجه نمونه ای از بافر پروتکل Anomalies است و خطاهایی را که در آن آمار با طرح موافق نیست توصیف می کند. به عنوان مثال ، فرض کنید داده ها در 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" باشند و ویژگی "راهنمایی" را از محیط 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 این بررسی را با مقایسه آمار مجموعه های مختلف داده بر اساس مقایسه کننده های رانش / کج مشخص شده در طرح انجام می دهد. به عنوان مثال ، برای بررسی اینکه آیا بین ویژگی "Payment_type" درون آموزش و ارائه مجموعه داده انحرافی وجود دارد:

    # 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)

توجه: برای شناسایی انحراف برای ویژگی های عددی ، به جای آستانه infinity_norm در skew_comparator skew ، آستانه jensen_shannon_divergence مشخص کنید.

با بررسی اینکه آیا یک مجموعه داده مطابق با انتظارات تعیین شده در برنامه است ، نتیجه نیز نمونه ای از بافر پروتکل Anomalies است و هرگونه انحراف بین مجموعه داده های آموزش و ارائه را توصیف می کند. به عنوان مثال ، فرض کنید داده های ارائه شده به طور قابل توجهی مثالهای بیشتری با ویژگی 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)

توجه: برای تشخیص انحراف برای ویژگیهای عددی ، به جای آستانه infinity_norm در مقایسه با drift_comparator ، یک آستانه jensen_shannon_divergence مشخص کنید.

نوشتن اتصال داده سفارشی

برای محاسبه آمار داده ها ، TFDV چندین روش مناسب برای مدیریت داده های ورودی در قالب های مختلف (به عنوان مثال TFRecord از tf.train.Example ، CSV و غیره) فراهم می کند. اگر قالب داده شما در این لیست نیست ، برای خواندن داده های ورودی باید یک اتصال داده سفارشی بنویسید و آن را برای محاسبه آمار داده با API هسته TFDV متصل کنید.

API هسته TFDV برای محاسبه آمار داده ها یک Beam PTransform است که مجموعه ای از نمونه های ورودی را از یک مجموعه انتخاب می کند (دسته ای از نمونه های ورودی به صورت Arrow RecordBatch نشان داده می شود) ، و یک PCollection را شامل می شود که یک بافر پروتکل DatasetFeatureStatisticsList .

هنگامی که اتصال داده سفارشی را اجرا کردید که نمونه های ورودی شما را در Arrow RecordBatch دسته بندی می کند ، باید آن را با tfdv.GenerateStatistics API برای محاسبه آمار داده متصل کنید. TFRecord از tf.train.Example بگیرید. به عنوان مثال. 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 می تواند برای محاسبه آمار برش داده ها پیکربندی شود. برش زدن را می توان با ارائه توابع برش که در Arrow 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])