Tiền xử lý dữ liệu với TensorFlow Transform

Thành phần kỹ thuật tính năng của TensorFlow Extended (TFX)

Sổ tay chuyên mục ví dụ này cung cấp một ví dụ rất đơn giản về cách TensorFlow Transform ( tf.Transform ) có thể được sử dụng để xử lý trước dữ liệu bằng cách sử dụng chính xác cùng một mã cho cả việc đào tạo mô hình và cung cấp các suy luận trong sản xuất.

TensorFlow Transform là một thư viện để xử lý trước dữ liệu đầu vào cho TensorFlow, bao gồm việc tạo các tính năng yêu cầu chuyển toàn bộ tập dữ liệu đào tạo. Ví dụ: sử dụng TensorFlow Transform, bạn có thể:

  • Chuẩn hóa giá trị đầu vào bằng cách sử dụng giá trị trung bình và độ lệch chuẩn
  • Chuyển đổi chuỗi thành số nguyên bằng cách tạo từ vựng trên tất cả các giá trị đầu vào
  • Chuyển đổi float thành số nguyên bằng cách gán chúng vào nhóm, dựa trên phân phối dữ liệu quan sát được

TensorFlow có hỗ trợ tích hợp cho các thao tác trên một ví dụ hoặc một loạt ví dụ. tf.Transform mở rộng các khả năng này để hỗ trợ chuyển toàn bộ qua toàn bộ tập dữ liệu đào tạo.

Đầu ra của tf.Transform được xuất dưới dạng biểu đồ TensorFlow mà bạn có thể sử dụng cho cả đào tạo và phục vụ. Việc sử dụng cùng một biểu đồ cho cả quá trình luyện tập và phục vụ có thể ngăn chặn sự sai lệch, vì các phép biến đổi giống nhau được áp dụng trong cả hai giai đoạn.

Nâng cấp Pip

Để tránh nâng cấp Pip trong hệ thống khi chạy cục bộ, hãy kiểm tra để đảm bảo rằng chúng tôi đang chạy trong Colab. Hệ thống cục bộ tất nhiên có thể được nâng cấp riêng.

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

Cài đặt TensorFlow Transform

pip install -q -U tensorflow_transform

Bạn có khởi động lại thời gian chạy không?

Nếu bạn đang sử dụng Google Colab, lần đầu tiên bạn chạy ô ở trên, bạn phải khởi động lại thời gian chạy (Runtime> Restart runtime ...). Điều này là do cách Colab tải các gói.

Nhập khẩu

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

Dữ liệu: Tạo một số dữ liệu giả

Chúng tôi sẽ tạo một số dữ liệu giả đơn giản cho ví dụ đơn giản của chúng tôi:

  • raw_data là dữ liệu thô ban đầu mà chúng tôi sẽ xử lý trước
  • raw_data_metadata chứa lược đồ cho chúng ta biết kiểu của từng cột trong raw_data . Trong trường hợp này, nó rất đơn giản.
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),
    }))

Chuyển đổi: Tạo một chức năng tiền xử lý

Hàm tiền xử lý là khái niệm quan trọng nhất của tf.Transform. Chức năng tiền xử lý là nơi mà việc chuyển đổi tập dữ liệu thực sự xảy ra. Nó chấp nhận và trả về một từ điển các tensor, trong đó tensor có nghĩa là Tensor hoặcSparseTensor . Có hai nhóm lệnh gọi API chính thường tạo thành trung tâm của một hàm tiền xử lý:

  1. TensorFlow Ops: Bất kỳ hàm nào chấp nhận và trả về tensor, thường có nghĩa là hoạt động TensorFlow. Các thao tác này thêm các hoạt động TensorFlow vào biểu đồ để biến đổi dữ liệu thô thành dữ liệu đã biến đổi, từng vectơ đặc trưng tại một thời điểm. Chúng sẽ chạy cho mọi ví dụ, trong cả quá trình đào tạo và phục vụ.
  2. Tensorflow Transform Analyzers / Mappers: Bất kỳ thiết bị phân tích / ánh xạ nào do tf.Transform cung cấp. Chúng cũng chấp nhận và trả về các tensor, và thường chứa sự kết hợp giữa các hoạt động Tensorflow và tính toán Beam, nhưng không giống như các hoạt động TensorFlow, chúng chỉ chạy trong đường ống Beam trong quá trình phân tích yêu cầu chuyển toàn bộ qua toàn bộ tập dữ liệu đào tạo. Tính toán Beam chỉ chạy một lần, trong quá trình đào tạo và thường thực hiện toàn bộ toàn bộ tập dữ liệu đào tạo. Chúng tạo ra các hằng số tensor, được thêm vào đồ thị của bạn. Ví dụ: tft.min tính toán giá trị tối thiểu của tensor trên tập dữ liệu huấn luyện trong khi tft.scale_by_min_max trước tiên tính toán giá trị tối thiểu và tối đa của tensor trên tập dữ liệu huấn luyện và sau đó chia tỉ lệ tensor trong phạm vi do người dùng chỉ định, [output_min, output_max]. tf.Transform cung cấp một tập hợp cố định gồm các trình phân tích / lập bản đồ như vậy, nhưng điều này sẽ được mở rộng trong các phiên bản tương lai.
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,
    }

Để tất cả chúng cùng nhau

Bây giờ chúng tôi đã sẵn sàng để chuyển đổi dữ liệu của mình. Chúng tôi sẽ sử dụng Apache Beam với một người chạy trực tiếp và cung cấp ba đầu vào:

  1. raw_data - Dữ liệu đầu vào thô mà chúng tôi đã tạo ở trên
  2. raw_data_metadata - Lược đồ cho dữ liệu thô
  3. preprocessing_fn - Hàm mà chúng tôi đã tạo để thực hiện chuyển đổi
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}]

Đây có phải là câu trả lời đúng?

Trước đây, chúng tôi đã sử dụng tf.Transform để thực hiện việc này:

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_centered

Với đầu vào là [1, 2, 3] giá trị trung bình của x là 2 và chúng ta lấy x trừ đi để căn giữa các giá trị x của chúng ta bằng 0. Vì vậy, kết quả của [-1.0, 0.0, 1.0] là đúng.

y_normalized

Chúng tôi muốn chia tỷ lệ các giá trị y của mình trong khoảng từ 0 đến 1. Đầu vào của chúng tôi là [1, 2, 3] vì vậy kết quả [0.0, 0.5, 1.0] của chúng tôi là chính xác.

s_integerized

Chúng tôi muốn ánh xạ các chuỗi của mình thành các chỉ mục trong một từ vựng và chỉ có 2 từ trong từ vựng của chúng tôi ("xin chào" và "thế giới"). Vì vậy, với đầu vào là ["hello", "world", "hello"] kết quả [0, 1, 0] của chúng tôi là chính xác. Vì "xin chào" xuất hiện thường xuyên nhất trong dữ liệu này nên nó sẽ là mục nhập đầu tiên trong từ vựng.

x_centered_times_y_normalized

Chúng tôi muốn tạo một tính năng mới bằng cách x_centeredy_normalized bằng phép nhân. Lưu ý rằng điều này nhân kết quả, không phải giá trị ban đầu và kết quả mới của chúng tôi là [-0.0, 0.0, 1.0] là chính xác.