ابدأ مع التحقق من صحة بيانات 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 للمستخدمين الذين لديهم بيانات في الذاكرة ممثلة على شكل pandas DataFrame.

بالإضافة إلى حساب مجموعة افتراضية من إحصائيات البيانات ، يمكن أن يحسب TFDV أيضًا إحصائيات المجالات الدلالية (مثل الصور والنصوص). لتمكين حساب إحصائيات المجال الدلالي ، قم بتمرير كائن tfdv.StatsOptions مع مجموعة enable_semantic_domain_stats إلى True إلى tfdv.generate_statistics_from_tfrecord .

يعمل على جوجل كلاود

داخليًا ، يستخدم TFDV إطار عمل المعالجة المتوازي للبيانات الخاص بـ Apache Beam لتوسيع نطاق حساب الإحصائيات على مجموعات البيانات الكبيرة. بالنسبة للتطبيقات التي ترغب في الاندماج بشكل أعمق مع TFDV (على سبيل المثال ، إرفاق إنشاء الإحصائيات في نهاية خط أنابيب توليد البيانات ، وإنشاء إحصائيات للبيانات بتنسيق مخصص ) ، تعرض واجهة برمجة التطبيقات أيضًا 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 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 حيث تتكون كل مجموعة بيانات من مجموعة من الأمثلة التي تعرض حالة شاذة معينة. يمكنك استخدام هذا لتحديد عدد الأمثلة في مجموعة البيانات الخاصة بك التي تعرض شذوذًا معينًا وخصائص تلك الأمثلة.

بيئات المخطط

بشكل افتراضي ، تفترض عمليات التحقق من الصحة أن جميع مجموعات البيانات في خط الأنابيب تلتزم بمخطط واحد. في بعض الحالات ، يكون إدخال اختلافات طفيفة في المخطط أمرًا ضروريًا ، على سبيل المثال ، الميزات المستخدمة كعناوين مطلوبة أثناء التدريب (ويجب التحقق من صحتها) ، ولكنها مفقودة أثناء العرض.

يمكن استخدام البيئات للتعبير عن مثل هذه المتطلبات. على وجه الخصوص ، يمكن ربط الميزات في المخطط مع مجموعة من البيئات التي تستخدم البيئة الافتراضية ، والبيئة ، وليس البيئة.

على سبيل المثال ، إذا تم استخدام ميزة التلميحات كتسمية في التدريب ، ولكنها مفقودة في بيانات العرض. بدون تحديد البيئة ، ستظهر على أنها حالة شاذة.

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

لقطة شاشة لخدمة الحالات الشاذة

لإصلاح ذلك ، نحتاج إلى تعيين البيئة الافتراضية لجميع الميزات لتكون "تدريب" و "خدمة" ، واستبعاد ميزة "النصائح" من بيئة الخدمة.

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

ملاحظة: سوف تكتشف قاعدة L-infinity فقط الانحراف عن الميزات الفئوية. بدلاً من تحديد عتبة infinity_norm ، فإن تحديد عتبة jensen_shannon_divergence في skew_comparator سيكشف الانحراف لكل من الميزات الرقمية والفئوية.

كما هو الحال مع التحقق مما إذا كانت مجموعة البيانات تتوافق مع التوقعات المحددة في المخطط ، فإن النتيجة هي أيضًا مثيل للمخزن المؤقت لبروتوكول 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)

ملاحظة: سوف تكتشف قاعدة L-infinity فقط الانحراف عن الميزات الفئوية. بدلاً من تحديد عتبة infinity_norm ، فإن تحديد عتبة jensen_shannon_divergence في skew_comparator سيكشف الانحراف لكل من الميزات الرقمية والفئوية.

كتابة موصل بيانات مخصص

لحساب إحصائيات البيانات ، يوفر TFDV عدة طرق ملائمة لمعالجة بيانات الإدخال بتنسيقات مختلفة (مثل TFRecord من tf.train.Example ، CSV ، إلخ). إذا لم يكن تنسيق البيانات الخاص بك في هذه القائمة ، فأنت بحاجة إلى كتابة موصل بيانات مخصص لقراءة بيانات الإدخال ، وتوصيله بـ TFDV core API لحساب إحصائيات البيانات.

واجهة برمجة تطبيقات TFDV الأساسية لحساب إحصائيات البيانات هي Beam PTransform التي تأخذ مجموعة من دفعات أمثلة الإدخال (يتم تمثيل مجموعة من أمثلة الإدخال على أنها Arrow RecordBatch) ، وتخرج مجموعة PC تحتوي على مخزن مؤقت لبروتوكول DatasetFeatureStatisticsList واحد.

بمجرد تنفيذ موصل البيانات المخصص الذي يقوم بتجميع أمثلة المدخلات الخاصة بك في Arrow RecordBatch ، فإنك تحتاج إلى توصيله بـ tfdv.GenerateStatistics API لحساب إحصائيات البيانات. خذ TFRecord من tf.train.Example 's على سبيل المثال. يوفر tfx_bsl موصل بيانات TFExampleRecord ، وفيما يلي مثال على كيفية توصيله بواجهة برمجة تطبيقات tfdv.GenerateStatistics .

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 عند حساب الإحصائيات.

عند تمكين التقسيم إلى شرائح ، تحتوي مجموعة بيانات الإخراج الأولية لقائمة الميزات على مجموعة بيانات أولية متعددة ، واحدة لكل شريحة. يتم تحديد كل شريحة من خلال اسم فريد يتم تعيينه كاسم مجموعة بيانات في مجموعة البيانات الأولية الخاصة بالإحصاءات . بشكل افتراضي ، يحسب 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])