我們正在嘗試構建一個管道,該管道從 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 輸入到 aFixedLenFeature中,它會中斷。但是,當我嘗試輸入字符串或整數 aVarLenFeature時,它也會中斷。這似乎是因為 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']當我使用我的字符串輸入(例如“UK”)嘗試 VarLenFeature 時,輸出是這樣的 SparseTensor:SparseTensorValue(indices=[(0, 0), (0, 1)], values=['U', 'K'], dense_shape=(1, 2))因此,似乎我需要將一個列表傳遞給 VarLenFeature 才能使其正常工作,但 BigQuerySource 默認情況下不這樣做。有沒有一種簡單的方法可以實現這一目標?還是我完全錯過了從 BigQuery 讀取可空列的標記?
1 回答

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
您可能需要自己處理 NULL(缺失)值。對于數值列,您可以將 NULL 替換為平均值或中位數。對于分類列 (STRING),您可以使用一些默認值,例如空 STRING 或新值作為缺失值指示符。
我對 VarLenFeature 不是很熟悉,但您可能可以替換 source_query 中的 NULL(NULL 插補)。就像是:
IFNULL(col, col_mean) AS col_imputed
缺點是您必須首先使用 sql 計算 col_mean 并在此處將其填充為常數。另一件事是您需要記住這個平均值并在預測中應用相同的平均值,因為它不是 tf.transform (您的圖表)的一部分。
Bigquery 本身將 BQML 作為 ML 平臺。他們確實支持TRANSFORM 和自動插補。也許你也可以看看:)
添加回答
舉報
0/150
提交
取消