بيانات المعالجة المسبقة باستخدام TensorFlow Transform

مكون هندسة الميزات في TensorFlow Extended (TFX)

يوفر دفتر ملاحظات colab هذا مثالًا بسيطًا جدًا لكيفية استخدام TensorFlow Transform ( tf.Transform ) للمعالجة المسبقة للبيانات باستخدام نفس الكود تمامًا لكل من تدريب النموذج وتقديم الاستنتاجات في الإنتاج.

TensorFlow Transform هي مكتبة للمعالجة المسبقة لبيانات الإدخال لـ TensorFlow ، بما في ذلك إنشاء الميزات التي تتطلب تمريرة كاملة عبر مجموعة بيانات التدريب. على سبيل المثال ، باستخدام TensorFlow Transform ، يمكنك:

  • تطبيع قيمة الإدخال باستخدام المتوسط ​​والانحراف المعياري
  • تحويل السلاسل إلى أعداد صحيحة عن طريق توليد مفردات على كل قيم الإدخال
  • قم بتحويل العوامات إلى أعداد صحيحة عن طريق تخصيصها لمجموعات ، بناءً على توزيع البيانات المرصود

يحتوي TensorFlow على دعم داخلي للمعالجة في مثال واحد أو مجموعة من الأمثلة. tf.Transform يوسع هذه القدرات لدعم التمريرات الكاملة على مجموعة بيانات التدريب بأكملها.

يتم تصدير ناتج tf.Transform كرسم بياني TensorFlow والذي يمكنك استخدامه للتدريب والخدمة. يمكن أن يؤدي استخدام نفس الرسم البياني لكل من التدريب والخدمة إلى منع الانحراف ، حيث يتم تطبيق نفس التحويلات في كلتا المرحلتين.

ترقية النقطة

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

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

قم بتثبيت TensorFlow Transform

pip install -q -U tensorflow_transform

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

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

الواردات

import pprint
import tempfile

import tensorflow as tf
import tensorflow_transform as tft

import tensorflow_transform.beam as tft_beam
from tensorflow_transform.tf_metadata import dataset_metadata
from tensorflow_transform.tf_metadata import schema_utils

البيانات: قم بإنشاء بعض البيانات الوهمية

سننشئ بعض البيانات الوهمية البسيطة لمثالنا البسيط:

  • raw_data هي البيانات الأولية الأولية التي سنقوم بمعالجتها مسبقًا
  • يحتوي raw_data_metadata على المخطط الذي يخبرنا بأنواع كل عمود من الأعمدة في raw_data . في هذه الحالة ، الأمر بسيط للغاية.
raw_data = [
      {'x': 1, 'y': 1, 's': 'hello'},
      {'x': 2, 'y': 2, 's': 'world'},
      {'x': 3, 'y': 3, 's': 'hello'}
  ]

raw_data_metadata = dataset_metadata.DatasetMetadata(
    schema_utils.schema_from_feature_spec({
        'y': tf.io.FixedLenFeature([], tf.float32),
        'x': tf.io.FixedLenFeature([], tf.float32),
        's': tf.io.FixedLenFeature([], tf.string),
    }))

التحويل: إنشاء وظيفة ما قبل المعالجة

تعتبر وظيفة المعالجة المسبقة أهم مفهوم لتحويل tf. وظيفة المعالجة المسبقة هي المكان الذي يحدث فيه تحويل مجموعة البيانات حقًا. يقبل ويعيد قاموس التنسورات ، حيث يعني Tensor موتر أوSparseTensor . هناك مجموعتان رئيسيتان من استدعاءات API التي تشكل عادةً قلب وظيفة المعالجة المسبقة:

  1. TensorFlow Ops: أي دالة تقبل وتعيد الموترات ، والتي تعني عادةً عمليات TensorFlow. تضيف هذه عمليات TensorFlow إلى الرسم البياني الذي يحول البيانات الأولية إلى بيانات محولة متجهًا لميزة واحدة في كل مرة. سيتم تشغيل هذه لكل مثال ، أثناء التدريب والخدمة.
  2. أدوات التحليل / مخططو Tensorflow Transform: أي من أجهزة التحليل / المخططات المقدمة من tf.Transform. هذه أيضًا تقبل وتعيد الموترات ، وتحتوي عادةً على مجموعة من عمليات Tensorflow وحساب الشعاع ، ولكن على عكس عمليات TensorFlow ، فإنها تعمل فقط في خط أنابيب Beam أثناء التحليل الذي يتطلب تمريرة كاملة عبر مجموعة بيانات التدريب بأكملها. يعمل حساب الشعاع مرة واحدة فقط ، أثناء التدريب ، وعادةً ما يقوم بتمرير كامل عبر مجموعة بيانات التدريب بأكملها. ينشئون ثوابت الموتر ، والتي تضاف إلى الرسم البياني الخاص بك. على سبيل المثال ، يحسب tft.min الحد الأدنى من الموتر على مجموعة بيانات التدريب بينما يحسب tft.scale_by_min_max أولاً الحد الأدنى والحد الأقصى للموتر على مجموعة بيانات التدريب ثم يقيس الموتر ليكون ضمن نطاق محدد من قبل المستخدم ، [output_min ، output_max]. tf يوفر Transform مجموعة ثابتة من هؤلاء المحللين / المخططين ، ولكن سيتم تمديد ذلك في الإصدارات المستقبلية.
def preprocessing_fn(inputs):
    """Preprocess input columns into transformed columns."""
    x = inputs['x']
    y = inputs['y']
    s = inputs['s']
    x_centered = x - tft.mean(x)
    y_normalized = tft.scale_to_0_1(y)
    s_integerized = tft.compute_and_apply_vocabulary(s)
    x_centered_times_y_normalized = (x_centered * y_normalized)
    return {
        'x_centered': x_centered,
        'y_normalized': y_normalized,
        's_integerized': s_integerized,
        'x_centered_times_y_normalized': x_centered_times_y_normalized,
    }

ضع كل شيء معا

نحن الآن جاهزون لتحويل بياناتنا. سنستخدم Apache Beam مع عداء مباشر ، ونوفر ثلاثة مدخلات:

  1. raw_data - بيانات الإدخال الأولية التي أنشأناها أعلاه
  2. raw_data_metadata - مخطط البيانات الأولية
  3. preprocessing_fn - الوظيفة التي أنشأناها للقيام بالتحول
def main():
  # Ignore the warnings
  with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
    transformed_dataset, transform_fn = (  # pylint: disable=unused-variable
        (raw_data, raw_data_metadata) | tft_beam.AnalyzeAndTransformDataset(
            preprocessing_fn))

  transformed_data, transformed_metadata = transformed_dataset  # pylint: disable=unused-variable

  print('\nRaw data:\n{}\n'.format(pprint.pformat(raw_data)))
  print('Transformed data:\n{}'.format(pprint.pformat(transformed_data)))

if __name__ == '__main__':
  main()
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:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:289: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_transform/tf_utils.py:289: Tensor.experimental_ref (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use ref() instead.
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:tensorflow:You are passing instance dicts and DatasetMetadata to TFT which will not provide optimal performance. Consider following the TFT guide to upgrade to the TFXIO format (Apache Arrow RecordBatch).
WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/tmp/tmp8aif_7w8.json', '--HistoryManager.hist_file=:memory:']
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
2022-02-03 10:18:41.378629: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/319450c9d7da4ab08741bc79e129ac38/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:Assets written to: /tmp/tmpfvgb9_2h/tftransform_tmp/1f79865adbdd4ede9a3768fcac29949c/assets
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_text is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:tensorflow_decision_forests is not available.
INFO:tensorflow:struct2tensor is not available.
INFO:tensorflow:struct2tensor is not available.
Raw data:
[{'s': 'hello', 'x': 1, 'y': 1},
 {'s': 'world', 'x': 2, 'y': 2},
 {'s': 'hello', 'x': 3, 'y': 3}]

Transformed data:
[{'s_integerized': 0,
  'x_centered': -1.0,
  'x_centered_times_y_normalized': -0.0,
  'y_normalized': 0.0},
 {'s_integerized': 1,
  'x_centered': 0.0,
  'x_centered_times_y_normalized': 0.0,
  'y_normalized': 0.5},
 {'s_integerized': 0,
  'x_centered': 1.0,
  'x_centered_times_y_normalized': 1.0,
  'y_normalized': 1.0}]

هل هذا هو الجواب الصحيح؟

في السابق ، استخدمنا tf.Transform للقيام بذلك:

x_centered = x - tft.mean(x)
y_normalized = tft.scale_to_0_1(y)
s_integerized = tft.compute_and_apply_vocabulary(s)
x_centered_times_y_normalized = (x_centered * y_normalized)

x_ تمركز

بإدخال [1, 2, 3] يكون متوسط ​​x هو 2 ، ونطرحه من x إلى مركز قيم x لدينا عند 0. لذا فإن النتيجة [-1.0, 0.0, 1.0] صحيحة.

y_normalized

أردنا قياس قيم y لدينا بين 0 و 1. كان إدخالنا [1, 2, 3] لذا فإن النتيجة [0.0, 0.5, 1.0] صحيحة.

s_ متكاملة

أردنا رسم خيوطنا إلى الفهارس في المفردات ، ولم يكن هناك سوى كلمتين في مفرداتنا ("مرحبًا" و "العالم"). لذا مع إدخال ["hello", "world", "hello"] تكون النتيجة [0, 1, 0] صحيحة. نظرًا لأن كلمة "مرحبًا" تحدث بشكل متكرر في هذه البيانات ، فستكون الإدخال الأول في المفردات.

x_centered_times_y_normalized

أردنا إنشاء ميزة جديدة عن طريق عبور x_centered و y_normalized باستخدام الضرب. لاحظ أن هذا يضاعف النتائج ، وليس القيم الأصلية ، والنتيجة الجديدة لدينا [-0.0, 0.0, 1.0] صحيحة.