Предварительно обработайте данные с помощью 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

pip install -q -U tensorflow_transform

Вы перезапустили среду выполнения?

Если вы используете 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 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.Transform. Функция предварительной обработки — это место, где действительно происходит преобразование набора данных. Он принимает и возвращает словарь тензоров, где тензор означает Tensor илиSparseTensor . Есть две основные группы вызовов API, которые обычно составляют основу функции предварительной обработки:

  1. TensorFlow Ops: любая функция, которая принимает и возвращает тензоры, что обычно означает операции TensorFlow. Они добавляют к графу операции TensorFlow, которые преобразуют необработанные данные в преобразованные данные по одному вектору признаков за раз. Они будут выполняться для каждого примера, как во время обучения, так и во время обслуживания.
  2. Анализаторы/преобразователи преобразования Tensorflow: любой из анализаторов/преобразователей, предоставляемых tf.Transform. Они также принимают и возвращают тензоры и обычно содержат комбинацию операций Tensorflow и вычислений Beam, но, в отличие от операций TensorFlow, они выполняются только в конвейере Beam во время анализа, требующего полного прохода по всему набору обучающих данных. Вычисление Beam запускается только один раз во время обучения и обычно полностью проходит через весь набор обучающих данных. Они создают тензорные константы, которые добавляются к вашему графику. Например, tft.min вычисляет минимум тензора по набору обучающих данных, в то время как tft.scale_by_min_max сначала вычисляет минимум и максимум тензора по набору обучающих данных, а затем масштабирует тензор так, чтобы он находился в заданном пользователем диапазоне [output_min, выход_макс]. 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_centered

При вводе [1, 2, 3] среднее значение x равно 2, и мы вычитаем его из x, чтобы центрировать наши значения x на 0. Таким образом, наш результат [-1.0, 0.0, 1.0] правильный.

у_нормализованный

Мы хотели масштабировать наши значения y между 0 и 1. Наши входные данные были [1, 2, 3] поэтому наш результат [0.0, 0.5, 1.0] правильный.

s_integerized

Мы хотели сопоставить наши строки с индексами в словаре, а в нашем словаре было всего 2 слова («привет» и «мир»). Таким образом, при вводе ["hello", "world", "hello"] наш результат [0, 1, 0] правильный. Поскольку слово «привет» чаще всего встречается в этих данных, оно будет первой записью в словаре.

x_centered_times_y_normalized

Мы хотели создать новую функцию, скрестив x_centered и y_normalized с помощью умножения. Обратите внимание, что это умножает результаты, а не исходные значения, и наш новый результат [-0.0, 0.0, 1.0] является правильным.