오늘 지역 TensorFlow Everywhere 이벤트에 참석하세요!
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TensorFlow Transform으로 데이터 전처리

TensorFlow Extended (TFX)의 기능 엔지니어링 구성 요소

이 예제 colab 노트북은 TensorFlow Transform ( tf.Transform ) 을 사용하여 모델을 학습시키고 프로덕션에서 추론을 제공하기 위해 정확히 동일한 코드를 사용하여 데이터를 사전 처리하는 방법에 대한 매우 간단한 예를 제공합니다.

TensorFlow Transform은 학습 데이터 세트 전체를 통과해야하는 기능 생성을 포함하여 TensorFlow의 입력 데이터를 사전 처리하기위한 라이브러리입니다. 예를 들어 TensorFlow Transform을 사용하여 다음을 수행 할 수 있습니다.

  • 평균 및 표준 편차를 사용하여 입력 값 정규화
  • 모든 입력 값에 대해 어휘를 생성하여 문자열을 정수로 변환
  • 관찰 된 데이터 분포를 기반으로 부동 소수점을 버킷에 할당하여 정수로 변환

TensorFlow는 단일 예제 또는 예제 배치에 대한 조작을 기본적으로 지원합니다. tf.Transform 은 이러한 기능을 확장하여 전체 학습 데이터 세트에 대한 전체 패스를 지원합니다.

tf.Transform 의 출력은 학습 및 제공 모두에 사용할 수있는 TensorFlow 그래프로 내보내집니다. 학습 및 제공에 동일한 그래프를 사용하면 두 단계 모두에 동일한 변환이 적용되므로 편향을 방지 할 수 있습니다.

Pip 업그레이드

로컬에서 실행할 때 시스템에서 Pip을 업그레이드하지 않으려면 Colab에서 실행 중인지 확인하십시오. 물론 로컬 시스템은 별도로 업그레이드 할 수 있습니다.

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

TensorFlow Transform 설치

pip install -q -U tensorflow_transform==0.24.1

런타임을 다시 시작 했습니까?

Google Colab을 사용하는 경우 위의 셀을 처음 실행할 때 런타임을 다시 시작해야합니다 (런타임> 런타임 다시 시작 ...). 이는 Colab이 패키지를로드하는 방식 때문입니다.

수입품

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 dataset_schema

데이터 : 더미 데이터 생성

간단한 예제를 위해 간단한 더미 데이터를 만들 것입니다.

  • 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(
    dataset_schema.from_feature_spec({
        'y': tf.io.FixedLenFeature([], tf.float32),
        'x': tf.io.FixedLenFeature([], tf.float32),
        's': tf.io.FixedLenFeature([], tf.string),
    }))
WARNING:tensorflow:From <ipython-input-1-e4eabb23bec3>:11: from_feature_spec (from tensorflow_transform.tf_metadata.dataset_schema) is deprecated and will be removed in a future version.
Instructions for updating:
from_feature_spec is a deprecated, use schema_utils.schema_from_feature_spec

변환 : 전처리 함수 만들기

전처리 기능 은 tf.Transform의 가장 중요한 개념입니다. 전처리 기능은 데이터 세트의 변환이 실제로 발생하는 곳입니다. 텐서는 Tensor 또는SparseTensor 의미하는 Tensor 사전을 받아들이고 반환합니다. 일반적으로 전처리 기능의 핵심을 형성하는 두 가지 주요 API 호출 그룹이 있습니다.

  1. TensorFlow Ops : 일반적으로 TensorFlow 작업을 의미하는 텐서를 수락하고 반환하는 모든 함수입니다. 이렇게하면 원시 데이터를 한 번에 하나의 특성 벡터로 변환 된 데이터로 변환하는 TensorFlow 작업이 그래프에 추가됩니다. 이는 훈련과 서빙 중 모든 예에서 실행됩니다.
  2. Tensorflow 변환 분석기 / 매퍼 : tf.Transform에서 제공하는 모든 분석기 / 매퍼. 이들은 또한 텐서를 수락하고 반환하며 일반적으로 Tensorflow 작업 및 Beam 계산의 조합을 포함하지만 TensorFlow 작업과 달리 전체 학습 데이터 세트에 대한 전체 패스가 필요한 분석 중 Beam 파이프 라인에서만 실행됩니다. 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,
    }

함께 모아서

이제 데이터를 변환 할 준비가되었습니다. Direct Runner와 함께 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:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended. 

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:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended. 

WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended. 

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.6/site-packages/tensorflow_transform/tf_utils.py:218: 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.6/site-packages/tensorflow_transform/tf_utils.py:218: 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.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.

WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:No assets to write.

INFO:tensorflow:No assets to write.

WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/ff5f13c5719441dea300f05fd68e7426/saved_model.pb

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/ff5f13c5719441dea300f05fd68e7426/saved_model.pb

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:No assets to write.

INFO:tensorflow:No assets to write.

WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_analyzer_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

WARNING:tensorflow:Issue encountered when serializing tft_mapper_use.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'Counter' object has no attribute 'name'

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/8c2cfdde815344f3aa317b99612cb837/saved_model.pb

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/8c2cfdde815344f3aa317b99612cb837/saved_model.pb

WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended. 

WARNING:tensorflow:Tensorflow version (2.3.2) found. Note that Tensorflow Transform support for TF 2.0 is currently in beta, and features such as tf.function may not work as intended. 

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

INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:Assets added to graph.

INFO:tensorflow:Assets written to: /tmp/tmp70eqi_6g/tftransform_tmp/45ca8d192fe740f288e9261e058cf9ff/assets

INFO:tensorflow:Assets written to: /tmp/tmp70eqi_6g/tftransform_tmp/45ca8d192fe740f288e9261e058cf9ff/assets

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/45ca8d192fe740f288e9261e058cf9ff/saved_model.pb

INFO:tensorflow:SavedModel written to: /tmp/tmp70eqi_6g/tftransform_tmp/45ca8d192fe740f288e9261e058cf9ff/saved_model.pb

WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"


WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"


INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Saver not created because there are no variables in the graph to restore

WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"


WARNING:tensorflow:Expected binary or unicode string, got type_url: "type.googleapis.com/tensorflow.AssetFileDef"
value: "\n\013\n\tConst_3:0\022-vocab_compute_and_apply_vocabulary_vocabulary"


INFO:tensorflow:Saver not created because there are no variables in the graph to restore

INFO:tensorflow:Saver not created because there are no variables in the graph to restore


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 을 사용 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_centered

[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_integerized

우리는 문자열을 어휘의 색인에 매핑하고 싶었고 어휘에는 2 개의 단어 만있었습니다 ( "hello"및 "world"). 따라서 ["hello", "world", "hello"] 하면 [0, 1, 0] 의 결과가 정확합니다. 이 데이터에서 "hello"가 가장 자주 발생하므로 어휘의 첫 번째 항목이됩니다.

x_centered_times_y_normalized

곱셈을 사용하여 x_centeredy_normalized 를 교차하여 새로운 기능을 만들고 싶었습니다. 이렇게하면 원래 값이 아닌 결과가 곱해지며 [-0.0, 0.0, 1.0] 의 새 결과가 정확합니다.