Praproses data dengan TensorFlow Transform

Komponen Rekayasa Fitur TensorFlow Extended (TFX)

Contoh notebook colab ini memberikan contoh yang sangat sederhana tentang bagaimana TensorFlow Transform ( tf.Transform ) dapat digunakan untuk melakukan praproses data menggunakan kode yang sama persis untuk melatih model dan menyajikan inferensi dalam produksi.

TensorFlow Transform adalah library untuk prapemrosesan data input untuk TensorFlow, termasuk membuat fitur yang memerlukan lulus penuh atas set data pelatihan. Misalnya, menggunakan TensorFlow Transform Anda dapat:

  • Normalisasi nilai input dengan menggunakan mean dan standar deviasi
  • Ubah string menjadi bilangan bulat dengan menghasilkan kosakata di semua nilai input
  • Ubah pelampung menjadi bilangan bulat dengan menetapkannya ke ember, berdasarkan distribusi data yang diamati

TensorFlow memiliki dukungan bawaan untuk manipulasi pada satu contoh atau kumpulan contoh. tf.Transform memperluas kemampuan ini untuk mendukung lintasan penuh di seluruh kumpulan data pelatihan.

Keluaran tf.Transform diekspor sebagai grafik TensorFlow yang dapat Anda gunakan untuk pelatihan dan penyajian. Menggunakan grafik yang sama untuk pelatihan dan penyajian dapat mencegah kemiringan, karena transformasi yang sama diterapkan di kedua tahap.

Tingkatkan Pip

Untuk menghindari mengupgrade Pip di sistem saat berjalan secara lokal, periksa untuk memastikan bahwa kami berjalan di Colab. Sistem lokal tentu saja dapat ditingkatkan secara terpisah.

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

Instal Transformasi TensorFlow

pip install -q -U tensorflow_transform

Apakah Anda me-restart runtime?

Jika Anda menggunakan Google Colab, pertama kali menjalankan sel di atas, Anda harus memulai ulang runtime (Runtime > Restart runtime ...). Ini karena cara Colab memuat paket.

Impor

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

Data: Buat beberapa data dummy

Kami akan membuat beberapa data dummy sederhana untuk contoh sederhana kami:

  • raw_data adalah data mentah awal yang akan kita praproses
  • raw_data_metadata berisi skema yang memberi tahu kita jenis masing-masing kolom di raw_data . Dalam hal ini, sangat sederhana.
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),
    }))

Transform: Buat fungsi preprocessing

Fungsi preprocessing adalah konsep yang paling penting dari tf.Transform. Fungsi preprocessing adalah tempat transformasi dataset benar-benar terjadi. Ia menerima dan mengembalikan kamus tensor, di mana tensor berarti Tensor atauSparseTensor . Ada dua grup utama panggilan API yang biasanya membentuk inti dari fungsi prapemrosesan:

  1. TensorFlow Ops: Fungsi apa pun yang menerima dan mengembalikan tensor, yang biasanya berarti operasi TensorFlow. Ini menambahkan operasi TensorFlow ke grafik yang mengubah data mentah menjadi data yang diubah, satu vektor fitur pada satu waktu. Ini akan berjalan untuk setiap contoh, selama pelatihan dan penyajian.
  2. Tensorflow Transform Analyzers/Mappers: Semua penganalisis/pemeta yang disediakan oleh tf.Transform. Ini juga menerima dan mengembalikan tensor, dan biasanya berisi kombinasi operasi Tensorflow dan komputasi Beam, tetapi tidak seperti operasi TensorFlow, operasi ini hanya berjalan di pipeline Beam selama analisis yang memerlukan lintasan penuh ke seluruh kumpulan data pelatihan. Komputasi Beam hanya berjalan sekali, selama pelatihan, dan biasanya melewati seluruh set data pelatihan. Mereka membuat konstanta tensor, yang ditambahkan ke grafik Anda. Misalnya, tft.min menghitung minimum tensor di atas set data pelatihan sementara tft.scale_by_min_max pertama-tama menghitung min dan maks tensor di atas set data pelatihan dan kemudian menskalakan tensor agar berada dalam rentang yang ditentukan pengguna, [output_min, keluaran_maks]. tf.Transform menyediakan seperangkat penganalisis/pemeta yang tetap, tetapi ini akan diperluas di versi mendatang.
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,
    }

Menyatukan semuanya

Sekarang kita siap untuk mengubah data kita. Kami akan menggunakan Apache Beam dengan runner langsung, dan menyediakan tiga input:

  1. raw_data - Data input mentah yang kami buat di atas
  2. raw_data_metadata - Skema untuk data mentah
  3. preprocessing_fn - Fungsi yang kami buat untuk melakukan transformasi kami
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}]

Apakah ini jawaban yang benar?

Sebelumnya, kami menggunakan tf.Transform untuk melakukan ini:

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_center

Dengan input [1, 2, 3] rata-rata x adalah 2, dan kita kurangi dari x untuk memusatkan nilai x kita pada 0. Jadi hasil [-1.0, 0.0, 1.0] kita benar.

y_dinormalkan

Kami ingin menskalakan nilai y kami antara 0 dan 1. Input kami adalah [1, 2, 3] sehingga hasil [0.0, 0.5, 1.0] kami benar.

s_terintegrasi

Kami ingin memetakan string kami ke indeks dalam kosakata, dan hanya ada 2 kata dalam kosakata kami ("halo" dan "dunia"). Jadi dengan input ["hello", "world", "hello"] hasil [0, 1, 0] kami benar. Karena "halo" paling sering muncul dalam data ini, ini akan menjadi entri pertama dalam kosakata.

x_center_times_y_normalized

Kami ingin membuat fitur baru dengan menyilangkan x_centered dan y_normalized menggunakan perkalian. Perhatikan bahwa ini mengalikan hasil, bukan nilai aslinya, dan hasil baru kami [-0.0, 0.0, 1.0] sudah benar.