import tensorflow as tf
import tensorflow_transform as tft
import tensorflow_transform.beam as tft_beam
import apache_beam as beam
from tensorflow_transform.tf_metadata import dataset_metadata, schema_utils
from tensorflow_transform.tf_metadata import schema_pb2
# Sample raw data
raw_data = [
{'age': 25, 'income': 50000, 'city': 'New York', 'label': 1},
{'age': 40, 'income': 60000, 'city': 'San Francisco', 'label': 0},
{'age': 35, 'income': 58000, 'city': 'New York', 'label': 1},
{'age': 50, 'income': 52000, 'city': 'Chicago', 'label': 0}
]
# Define schema
feature_spec = {
'age': tf.io.FixedLenFeature([], tf.float32),
'income': tf.io.FixedLenFeature([], tf.float32),
'city': tf.io.FixedLenFeature([], tf.string),
'label': tf.io.FixedLenFeature([], tf.int64)
}
raw_data_metadata = dataset_metadata.DatasetMetadata(schema_utils.schema_from_feature_spec(feature_spec))
# Preprocessing function
def preprocessing_fn(inputs):
age = inputs['age']
income = inputs['income']
city = inputs['city']
# Scale numeric features
age_scaled = tft.scale_to_z_score(age)
income_scaled = tft.scale_to_z_score(income)
# Encode categorical feature
city_encoded = tft.compute_and_apply_vocabulary(city)
return {
'age_scaled': age_scaled,
'income_scaled': income_scaled,
'city_encoded': city_encoded,
'label': inputs['label']
}
# Run TF Transform pipeline
with beam.Pipeline() as pipeline:
with tft_beam.Context(temp_dir='/tmp'):
raw_data_pcoll = pipeline | 'CreateData' >> beam.Create(raw_data)
transformed_dataset, transform_fn = (
(raw_data_pcoll, raw_data_metadata) |
tft_beam.AnalyzeAndTransformDataset(preprocessing_fn)
)
transformed_data, transformed_metadata = transformed_dataset
# Collect transformed data
transformed_data_list = []
_ = transformed_data | beam.Map(transformed_data_list.append)
# Prepare transformed data for model
import numpy as np
X = np.array([
[d['age_scaled'], d['income_scaled'], d['city_encoded']] for d in transformed_data_list
])
y = np.array([d['label'] for d in transformed_data_list])
# Define simple model
model = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(3,)),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Train model
model.fit(X, y, epochs=10, batch_size=2, validation_split=0.5, verbose=0)
# Evaluate model
train_loss, train_acc = model.evaluate(X, y, verbose=0)
print(f'Training accuracy: {train_acc*100:.2f}%', f'Training loss: {train_loss:.4f}')