ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

التحقق من صحة بيانات TensorFlow

مثال على مكون رئيسي في TensorFlow Extended

يوضح مثال دفتر ملاحظات colab هذا كيف يمكن استخدام التحقق من صحة بيانات TensorFlow (TFDV) لفحص مجموعة البيانات الخاصة بك وتصورها. يتضمن ذلك النظر في الإحصائيات الوصفية ، واستنتاج المخطط ، والتحقق من الأخطاء وإصلاحها وإصلاحها ، والتحقق من الانحراف والانحراف في مجموعة البيانات الخاصة بنا. من المهم أن تفهم خصائص مجموعة البيانات الخاصة بك ، بما في ذلك كيف يمكن أن تتغير بمرور الوقت في خط أنابيب الإنتاج. من المهم أيضًا البحث عن الحالات الشاذة في بياناتك ، ومقارنة مجموعات بيانات التدريب والتقييم والعرض للتأكد من أنها متسقة.

سنستخدم بيانات من مجموعة بيانات رحلات سيارات الأجرة الصادرة عن مدينة شيكاغو.

اقرأ المزيد حول مجموعة البيانات في Google BigQuery . استكشف مجموعة البيانات الكاملة في BigQuery UI .

الأعمدة في مجموعة البيانات هي:

pickup_community_area أجرة trip_start_month
رحلة_بدء_ساعة trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude رحلة_مايلز pickup_census_tract
dropoff_census_tract نوع_الدفع شركة
رحلة_ثواني dropoff_community_area نصائح

ترقية النقطة

لتجنب ترقية Pip في نظام عند التشغيل محليًا ، تحقق للتأكد من أننا نعمل في Colab. يمكن بالطبع ترقية الأنظمة المحلية بشكل منفصل.

try:
  import colab
  !pip install --upgrade pip
except:
  pass

قم بتثبيت TensorFlow

pip install tensorflow==2.2.0
Collecting tensorflow==2.2.0
  Using cached tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl (516.2 MB)
Requirement already satisfied: gast==0.3.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.3.3)
Requirement already satisfied: wheel>=0.26; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.35.1)
Requirement already satisfied: astunparse==1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.6.3)
Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.3.0)
Requirement already satisfied: absl-py>=0.7.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.9.0)
Requirement already satisfied: protobuf>=3.8.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.13.0)
Collecting tensorflow-estimator<2.3.0,>=2.2.0
  Using cached tensorflow_estimator-2.2.0-py2.py3-none-any.whl (454 kB)
Requirement already satisfied: h5py<2.11.0,>=2.10.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (2.10.0)
Requirement already satisfied: google-pasta>=0.1.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.2.0)
Requirement already satisfied: wrapt>=1.11.1 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.12.1)
Requirement already satisfied: grpcio>=1.8.6 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.31.0)
Requirement already satisfied: numpy<2.0,>=1.16.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.18.5)
Requirement already satisfied: termcolor>=1.1.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.0)
Requirement already satisfied: scipy==1.4.1; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.4.1)
Collecting tensorboard<2.3.0,>=2.2.0
  Using cached tensorboard-2.2.2-py3-none-any.whl (3.0 MB)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.2)
Requirement already satisfied: six>=1.12.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.15.0)
Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from protobuf>=3.8.0->tensorflow==2.2.0) (49.6.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: werkzeug>=0.11.15 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.0.1)
Requirement already satisfied: google-auth<2,>=1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.20.1)
Requirement already satisfied: requests<3,>=2.21.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.24.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.1)
Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.2.2)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/lib/python3/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.2.1)
Requirement already satisfied: rsa<5,>=3.1.4; python_version >= "3.5" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.6)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.1.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/kbuilder/.local/lib/python3.6/site-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2020.6.20)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.6)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.22)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.3.0)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /home/kbuilder/.local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python3/dist-packages (from rsa<5,>=3.1.4; python_version >= "3.5"->google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.2)
Requirement already satisfied: oauthlib>=3.0.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Requirement already satisfied: zipp>=0.5 in /home/kbuilder/.local/lib/python3.6/site-packages (from importlib-metadata; python_version < "3.8"->markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Installing collected packages: tensorflow-estimator, tensorboard, tensorflow
  Attempting uninstall: tensorflow-estimator
    Found existing installation: tensorflow-estimator 2.3.0
    Uninstalling tensorflow-estimator-2.3.0:
      Successfully uninstalled tensorflow-estimator-2.3.0
  Attempting uninstall: tensorboard
    Found existing installation: tensorboard 2.3.0
    Uninstalling tensorboard-2.3.0:
      Successfully uninstalled tensorboard-2.3.0
  Attempting uninstall: tensorflow
    Found existing installation: tensorflow 2.3.0
    Uninstalling tensorflow-2.3.0:
      Successfully uninstalled tensorflow-2.3.0
Successfully installed tensorboard-2.2.2 tensorflow-2.2.0 tensorflow-estimator-2.2.0

تحقق من إصدار Python

014aead 750

قم بتثبيت TFDV

سيؤدي هذا إلى سحب جميع التبعيات ، الأمر الذي سيستغرق دقيقة. الرجاء تجاهل التحذيرات أو الأخطاء المتعلقة بإصدارات التبعية غير المتوافقة.

import tensorflow as tf

print('Installing TensorFlow Data Validation')
!pip install -q tensorflow_data_validation[visualization]
Installing TensorFlow Data Validation

هل أعدت تشغيل وقت التشغيل؟

إذا كنت تستخدم Google Colab ، في المرة الأولى التي تقوم فيها بتشغيل الخلية أعلاه ، يجب إعادة تشغيل وقت التشغيل (Runtime> Restart runtime ...). هذا بسبب الطريقة التي يقوم بها كولاب بتحميل الحزم.

قم بتحميل الملفات

سنقوم بتنزيل مجموعة البيانات الخاصة بنا من 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/tmpgsqn6btn/data:
eval  serving  train

/tmp/tmpgsqn6btn/data/eval:
data.csv

/tmp/tmpgsqn6btn/data/serving:
data.csv

/tmp/tmpgsqn6btn/data/train:
data.csv

تحقق من الإصدار

import tensorflow_data_validation as tfdv
print('TFDV version: {}'.format(tfdv.version.__version__))
TFDV version: 0.23.0

حساب وتصور الإحصاءات

سنستخدم أولاً tfdv.generate_statistics_from_csv لحساب إحصائيات بيانات التدريب الخاصة بنا. (تجاهل التحذيرات السريعة)

يمكن لـ TFDV حساب الإحصائيات الوصفية التي توفر نظرة عامة سريعة على البيانات من حيث الميزات الموجودة وأشكال توزيعات قيمتها.

داخليًا ، يستخدم TFDV إطار المعالجة المتوازي للبيانات الخاص بـ Apache Beam لتوسيع نطاق حساب الإحصائيات على مجموعات البيانات الكبيرة. بالنسبة للتطبيقات التي ترغب في الاندماج بشكل أعمق مع TFDV (على سبيل المثال ، إرفاق إنشاء الإحصائيات في نهاية خط أنابيب توليد البيانات) ، تعرض API أيضًا Beam PT Transform لتوليد الإحصائيات.

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: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.6/site-packages/tensorflow_data_validation/utils/stats_util.py:229: 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.6/site-packages/tensorflow_data_validation/utils/stats_util.py:229: 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 الفئوية
  • حاول تحديد "الكميات" من قائمة "مخطط العرض" ، ومرر الماوس فوق العلامات لإظهار النسب المئوية
tfdv.visualize_statistics(train_stats)

استنتج مخططًا

الآن دعونا نستخدم tfdv.infer_schema لإنشاء مخطط tfdv.infer_schema . يحدد المخطط قيود البيانات ذات الصلة بتعلم الآلة. تتضمن قيود المثال نوع البيانات لكل معلم ، سواء كانت رقمية أو فئوية ، أو تكرار تواجدها في البيانات. بالنسبة للميزات الفئوية ، يحدد المخطط أيضًا المجال - قائمة القيم المقبولة. نظرًا لأن كتابة مخطط يمكن أن يكون مهمة شاقة ، خاصة بالنسبة لمجموعات البيانات التي تحتوي على الكثير من الميزات ، فإن TFDV يوفر طريقة لإنشاء نسخة أولية من المخطط بناءً على الإحصائيات الوصفية.

يعد الحصول على المخطط الصحيح أمرًا مهمًا لأن بقية خط أنابيب الإنتاج لدينا سيعتمد على المخطط الذي ينشئه TFDV ليكون صحيحًا. يوفر المخطط أيضًا توثيقًا للبيانات ، وبالتالي يكون مفيدًا عندما يعمل مطورو مختلفون على نفس البيانات. دعنا نستخدم tfdv.display_schema لعرض المخطط المستنتج حتى نتمكن من مراجعته.

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:138: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

تحقق من بيانات التقييم بحثًا عن الأخطاء

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

  • لاحظ أن كل ميزة تتضمن الآن إحصاءات لكل من مجموعات بيانات التدريب والتقييم.
  • لاحظ أن المخططات تحتوي الآن على مجموعات بيانات التدريب والتقييم متراكبة ، مما يجعل من السهل مقارنتها.
  • لاحظ أن المخططات تتضمن الآن طريقة عرض النسب المئوية ، والتي يمكن دمجها مع السجل أو المقاييس الخطية الافتراضية.
  • لاحظ أن متوسط ​​ومتوسط trip_miles يختلفان في التدريب عن مجموعات بيانات التقييم. هل سيسبب ذلك مشاكل؟
  • واو ، تختلف tips القصوى للغاية بالنسبة للتدريب عن مجموعات بيانات التقييم. هل سيسبب ذلك مشاكل؟
  • انقر فوق توسيع في مخطط الميزات الرقمية ، وحدد مقياس السجل. راجع خاصية trip_seconds الفرق في هل سيفوت التقييم أجزاء من سطح الخسارة؟
# Compute stats for evaluation data
eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)

# 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)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

إصلاح الخلل في التقييم في المخطط

عفوا! يبدو أن لدينا بعض القيم الجديدة 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 ، 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)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

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

في هذه الحالة ، يمكننا تحويل قيم INT بأمان إلى FLOATs ، لذلك نريد إخبار 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)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

الآن لدينا فقط ميزة 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-infinity ، ويمكنك تعيين مسافة العتبة بحيث تتلقى تحذيرات عندما يكون الانجراف أعلى من المقبول. عادةً ما يكون تحديد المسافة الصحيحة عملية تكرارية تتطلب معرفة المجال والتجريب.

انحراف

يمكن أن يكتشف TFDV ثلاثة أنواع مختلفة من الانحراف في بياناتك - انحراف المخطط ، وانحراف الميزات ، وانحراف التوزيع.

انحراف المخطط

يحدث انحراف المخطط عندما لا تتوافق بيانات التدريب والخدمة مع نفس المخطط. من المتوقع أن تلتزم كل من بيانات التدريب والخدمة بنفس المخطط. يجب تحديد أي انحرافات متوقعة بين الاثنين (مثل وجود ميزة التسمية فقط في بيانات التدريب ولكن ليس في الخدمة) من خلال حقل البيئات في المخطط.

ميزة الانحراف

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

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

انحراف التوزيع

يحدث انحراف التوزيع عندما يختلف توزيع مجموعة بيانات التدريب اختلافًا كبيرًا عن توزيع مجموعة بيانات العرض. أحد الأسباب الرئيسية لانحراف التوزيع هو استخدام كود مختلف أو مصادر بيانات مختلفة لإنشاء مجموعة بيانات التدريب. سبب آخر هو آلية أخذ العينات الخاطئة التي تختار عينة فرعية غير تمثيلية من بيانات الخدمة للتدريب عليها.

# 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)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

في هذا المثال ، نرى بعض الانحراف ، لكنه أقل بكثير من الحد الذي حددناه.

قم بتجميد المخطط

الآن بعد أن تمت مراجعة مخطط قاعدة البيانات وتنظيمه ، سنقوم بتخزينه في ملف ليعكس حالته "المجمدة".

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 ) للتأكد من أننا لم نفعل شيئًا خاطئًا