Подача обнуляемых данных из BigQuery в Tensorflow Transform - PullRequest
3 голосов
/ 22 января 2020

Мы пытаемся построить конвейер, который принимает данные из BigQuery, проходит через TensorFlow Transform, перед обучением в TensorFlow.

Конвейер запущен и работает, но у нас возникают проблемы с нулевыми значениями в BigQuery.

Мы используем Beam для загрузки из BigQuery:

    raw_data = (pipeline
                | '{}_read_from_bq'.format(step) >> beam.io.Read(
                    beam.io.BigQuerySource(query=source_query,
                                           use_standard_sql=True,
                                           )))

Я играю с метаданными набора данных, пробуя FixedLenFeature и VarLenFeature для различных столбцов:

    # Categorical feature schema
    categorical_features = {
        column_name: tf.io.FixedLenFeature([], tf.string) for column_name in categorical_columns
    }
    raw_data_schema.update(categorical_features)

    # Numerical feature schema
    numerical_features = {
        column_name: tf.io.VarLenFeature(tf.float32) for column_name in numerical_columns
    }
    raw_data_schema.update(numerical_features)

    # Create dataset_metadata given raw_data_schema
    raw_metadata = dataset_metadata.DatasetMetadata(
        schema_utils.schema_from_feature_spec(raw_data_schema))

Как и ожидалось, если вы попытаетесь передать BigQuery NULL в FixedLenFeature, он сломается.

Однако, когда я попытаюсь передать строки или целые числа в VarLenFeature, он сломается тоже. Это происходит потому, что VarLenFeature ожидает список, но BigQuerySource дает Python примитив. Точная точка, где он ломается, находится здесь (ошибка возникла из-за того, что я попытался с целым числом):

File "/usr/local/lib/python3.7/site-packages/tensorflow_transform/impl_helper.py", line 157, in <listcomp>
indices = [range(len(value)) for value in values]
TypeError: object of type 'int' has no len()
[while running 'train_transform/AnalyzeDataset/ApplySavedModel[Phase0]/ApplySavedModel/ApplySavedModel']

Когда я пытаюсь использовать VarLenFeature со своими строковыми входами, например, «UK», выводом является SparseTensor, подобный этому :

SparseTensorValue(indices=[(0, 0), (0, 1)], values=['U', 'K'], dense_shape=(1, 2))

Похоже, мне нужно передать список в VarLenFeature, чтобы это работало, но BigQuerySource не делает этого по умолчанию.

Существует ли простой способ достижения это? Или я полностью теряю оценку при чтении пустых столбцов в BigQuery?

Заранее большое спасибо!

1 Ответ

2 голосов
/ 23 января 2020

Возможно, вам придется самостоятельно обрабатывать значения NULL (отсутствующие). Для числовых столбцов вы можете заменить NULL на среднее значение или медиану. Для категориальных столбцов (STRING) вы можете использовать какое-либо значение по умолчанию, например пустую STRING, или новое значение в качестве индикатора отсутствующего значения.

Я не очень знаком с VarLenFeature, но вы, вероятно, можете заменить NULL (NULL). вменение) в source_query. Что-то вроде:

IFNULL (col, col_mean) AS col_imputed

Недостатком является то, что сначала вам придется вычислять col_mean, используя sql и заполните его здесь как константу. Другое дело, что вам нужно запомнить это среднее значение и применить то же среднее значение в прогнозе, поскольку оно не является частью tf.transform (вашего графика).

В Bigquery BQML используется в качестве платформы ML. Они поддерживают TRANSFORM и автоматизацию c вменения . Может быть, вы могли бы также посмотреть:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...