Path: blob/master/site/es-419/tfx/tutorials/transform/census.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Cómo preprocesar datos con TensorFlow Transform
El componente de ingeniería de características de TensorFlow Extended (TFX)
Este bloc de notas de Colab de ejemplo proporciona un ejemplo un poco más avanzado de cómo se puede usar TensorFlow Transform (tf.Transform
) para preprocesar datos de manera que se use exactamente el mismo código tanto para entrenar un modelo como para realizar inferencias en producción.
TensorFlow Transform es una biblioteca que permite preprocesar datos de entrada para TensorFlow, lo que incluye la creación de características que requieren un paso completo sobre el conjunto de datos de entrenamiento. Por ejemplo, mediante el uso de TensorFlow Transform podría hacer lo siguiente:
Normalizar un valor de entrada a través del uso de la media y la desviación estándar
Convertir cadenas a números enteros mediante la generación de un vocabulario sobre todos los valores de entrada
Convertir valores flotantes en enteros al asignarlos a cubos, en función de la distribución de datos observada
TensorFlow tiene soporte integrado para manipulaciones en un solo ejemplo o un lote de ejemplos. tf.Transform
amplía estas capacidades para permitir pasos completos sobre todo el conjunto de datos de entrenamiento.
La salida de tf.Transform
se exporta como un grafo de TensorFlow que se puede usar tanto para entrenamiento como para servicio. Usar el mismo grafo tanto para el entrenamiento como para el servicio sirve para evitar sesgos, ya que se aplican las mismas transformaciones en ambas etapas.
Punto clave: Para comprender tf.Transform
y cómo funciona con Apache Beam, tendrá que saber un poco sobre Apache Beam. La Guía de programación de Beam es un excelente punto de partida.
##Qué estamos haciendo en este ejemplo
En este ejemplo, procesaremos un conjunto de datos ampliamente utilizado que contiene datos del censo y entrenaremos un modelo para ejecutar la clasificación. En este proceso, transformaremos los datos con ayuda de tf.Transform
.
Punto clave: Como modelador y desarrollador, piense en cómo se usan estos datos y en los posibles beneficios y daños que pueden causar las predicciones de un modelo. Un modelo como este podría reforzar los sesgos y las disparidades sociales. ¿Es una característica relevante para el problema que desea resolver o introducirá un sesgo? Para obtener más información, lea sobre la equidad del aprendizaje automático.
Nota: TensorFlow Model Analysis es una herramienta poderosa que nos ayuda a comprender qué tan bien predice un modelo para varios segmentos de sus datos, lo que implica entender cómo el modelo puede reforzar los sesgos y las disparidades sociales.
Instale TensorFlow Transform
Importaciones y globales
En primer lugar, importe lo que necesita.
Luego, descargue los archivos de datos:
Nombre las columnas
Crearemos algunas listas útiles para hacer referencia a las columnas de nuestro conjunto de datos.
Esta es una vista previa rápida de los datos:
Los datos de prueba tienen 1 línea de encabezado que debe omitirse y un "." al final de cada línea.
###Definamos nuestras características y nuestro esquema Definamos un esquema basado en los tipos de columnas en nuestra entrada. Entre otras cosas, esto nos ayudará a importarlos correctamente.
[Opcional] Codifique y decodifique protocolos tf.train.Example
En algunas partes de este tutorial debemos convertir ejemplos del conjunto de datos hacia y desde tf.train.Example
.
La función oculta encode_example
a continuación convierte un diccionario de características del conjunto de datos en un tf.train.Example
.
Ahora puede convertir ejemplos de conjuntos de datos en protocolos Example
:
También puede convertir lotes de protocolos de ejemplo serializados nuevamente en un diccionario de tensores:
En algunos casos, la etiqueta no se pasará, por lo que la función de codificación se escribe para que la etiqueta sea opcional:
Al crear un protocolo Example
, simplemente no contendrá la clave de etiqueta.
###Configuración de hiperparámetros y limpieza básica
Constantes e hiperparámetros que se usan para el entrenamiento.
##Cómo preprocesar con tf.Transform
Cree una preprocessing_fn con tf.Transform
La función de preprocesamiento es el concepto más importante de tf.Transform. Una función de preprocesamiento es la que realmente ejecuta la transformación del conjunto de datos. Acepta y devuelve un diccionario de tensores, donde tensor significa Tensor
o SparseTensor
. Hay dos grupos principales de llamadas API que normalmente constituyen el núcleo de una función de preprocesamiento:
TensorFlow Ops: cualquier función que acepte y devuelva tensores, lo que generalmente significa operaciones de TensorFlow. Estas agregan operaciones de TensorFlow al grafo que transforma datos sin procesar en datos transformados, un vector de características a la vez. Estas se ejecutarán para cada ejemplo, tanto durante el entrenamiento como durante el servicio.
Tensorflow Transform Analyzers/Mappers: cualquiera de los analizadores/asignadores que ofrece tf.Transform. Estos también aceptan y devuelven tensores y, por lo general, contienen una combinación de operaciones de Tensorflow y cálculos de Beam, pero a diferencia de las operaciones de TensorFlow, solo se ejecutan en la canalización de Beam durante el análisis, lo que requiere un paso completo por todo el conjunto de datos de entrenamiento. El cálculo de Beam se ejecuta solo una vez (antes del entrenamiento, durante el análisis) y, por lo general, hace un recorrido completo por todo el conjunto de datos de entrenamiento. Se encargan de crear tensores
tf.constant
, que se agregan a su grafo. Por ejemplo,tft.min
calcula el mínimo de un tensor sobre el conjunto de datos de entrenamiento.
Atención: Cuando aplique su función de preprocesamiento para servir inferencias, las constantes creadas por los analizadores durante el entrenamiento no cambiarán. Si sus datos tienen componentes de tendencia o estacionalidad, planifique en consecuencia.
Esta es una preprocessing_fn
para este conjunto de datos. Hace varias cosas:
Usa
tft.scale_to_0_1
para escalar las características numéricas al rango[0,1]
.Usa
tft.compute_and_apply_vocabulary
para calcular un vocabulario para cada una de las características categóricas y devuelve los ID enteros para cada entrada comotf.int64
. Esto se aplica tanto a entradas categóricas de cadenas como a enteras.Aplica algunas transformaciones manuales a los datos mediante operaciones estándar de TensorFlow. Aquí estas operaciones se aplican a la etiqueta, pero también podrían transformar las características. Las operaciones de TensorFlow hacen varias cosas:
Crean una tabla de búsqueda para la etiqueta (
tf.init_scope
garantiza que la tabla solo se cree la primera vez que se llama a la función).Normalizan el texto de la etiqueta.
Convierten la etiqueta en única.
Sintaxis
Está casi listo para armar todo y usar Apache Beam para ejecutarlo.
Apache Beam usa una sintaxis especial para definir e invocar transformaciones. Por ejemplo, en esta línea:
El método to_this_call
se invoca y se pasa el objeto llamado pass_this
, y esta operación se conocerá como name this step
en un seguimiento de pila . El resultado de la llamada a to_this_call
se devuelve en result
. A menudo verá etapas de una canalización encadenadas de esta manera:
y como comenzó con una nueva canalización, puede continuar así:
Transforme los datos
Ahora estamos listos para comenzar a transformar nuestros datos en una canalización de Apache Beam.
Lea los datos con ayuda del lector CSV
tfxio.CsvTFXIO
(para procesar líneas de texto en una canalización, es mejor usartfxio.BeamRecordCsvTFXIO
).Analice y transforme los datos con la
preprocessing_fn
definida anteriormente.Escriba el resultado como un
TFRecord
de protocolosExample
, que usaremos para entrenar un modelo más adelante.
Ejecute la canalización:
Envuelva el directorio de salida como tft.TFTransformOutput
:
Si mira el directorio, verá que contiene tres cosas:
Los archivos de datos
train_transformed
ytest_transformed
El directorio
transform_fn
(untf.saved_model
)Los
transformed_metadata
En las siguientes secciones se muestra cómo usar estos artefactos para entrenar un modelo.
##Cómo usar nuestros datos preprocesados para entrenar un modelo con tf.keras
Para mostrar cómo tf.Transform
nos permite usar el mismo código tanto para el entrenamiento como para el servicio, y así evitar el sesgo, entrenaremos un modelo. Para entrenar nuestro modelo y prepararlo para la producción, tenemos que crear funciones de entrada. La principal diferencia entre nuestra función de entrada de entrenamiento y nuestra función de entrada de servicio es que los datos de entrenamiento contienen las etiquetas y los datos de producción no. Los argumentos y las devoluciones también son algo diferentes.
###Cree una función de entrada para entrenamiento
Al ejecutar la canalización en la sección anterior se crearon archivos TFRecord
que contienen los datos transformados.
El siguiente código usa tf.data.experimental.make_batched_features_dataset
y tft.TFTransformOutput.transformed_feature_spec
para leer estos archivos de datos como tf.data.Dataset
:
A continuación, se puede ver una muestra transformada de los datos. Observe cómo las columnas numéricas education-num
y hourd-per-week
se convierten en flotantes con un rango de [0,1], y las columnas de cadena se han convertido en ID:
Entrene y evalúe el modelo
Compile el modelo
Compile los conjuntos de datos
Entrene y evalúe el modelo:
Transforme nuevos datos
En la sección anterior, el proceso de entrenamiento usó las copias impresas de los datos transformados que fueron generados por tft_beam.AnalyzeAndTransformDataset
en la función transform_dataset
.
Para operar con datos nuevos, deberá cargar la versión final de preprocessing_fn
que guardó tft_beam.WriteTransformFn
.
El método TFTransformOutput.transform_features_layer
carga el SavedModel de la preprocessing_fn
desde el directorio de salida.
Esta es una función para cargar lotes nuevos sin procesar desde un archivo fuente:
Cargue tft.TransformFeaturesLayer
para transformar estos datos con preprocessing_fn
:
tft_layer
es lo suficientemente inteligente como para ejecutar la transformación si solo se pasa un subconjunto de características. Por ejemplo, si solo pasa dos características, obtendrá solo las versiones transformadas de esas características:
Esta es una versión más sólida que elimina características que no están en las especificaciones de características y devuelve un par (features, label)
si la etiqueta está en las características proporcionadas:
Ahora puede usar Dataset.map
para aplicar esa transformación, sobre la marcha, a nuevos datos:
Exporte el modelo
Entonces tiene un modelo entrenado y un método para aplicar preprocessing_fn
a nuevos datos. Ensámblelos en un nuevo modelo que acepte protocolos tf.train.Example
serializados como entrada.
Compile el modelo y pruébelo en el lote de ejemplos serializados:
Exporte el modelo como SavedModel:
Vuelva a cargar el modelo y pruébelo en el mismo lote de ejemplos:
##Qué hicimos En este ejemplo usamos tf.Transform
para preprocesar un conjunto de datos del censo y entrenar un modelo con los datos limpios y transformados. También creamos una función de entrada que podríamos usar cuando implementemos nuestro modelo entrenado en un entorno de producción para ejecutar inferencias. Al usar el mismo código tanto para el entrenamiento como para la inferencia, evitamos cualquier problema con el sesgo de los datos. En el proceso, aprendimos cómo crear una transformación Apache Beam para ejecutar la transformación que necesitábamos para limpiar los datos. También vimos cómo usar estos datos transformados para entrenar un modelo con ayuda de tf.keras
. ¡Esto es solo una pequeña parte de lo que TensorFlow Transform puede hacer! Le recomendamos que se interiorice en tf.Transform
y descubra lo que puede hacer por usted.
[Opcional] Cómo usar nuestros datos preprocesados para entrenar un modelo con tf.estimator
Advertencia: Los estimadores no se recomiendan para código nuevo. Los estimadores ejecutan el código de estilo
v1.Session
que es más difícil de escribir correctamente y que puede tener un comportamiento inesperado; particularmente, cuando se combina con código TF 2. Los estimadores están incluidos dentro de nuestras garantías de compatibilidad, pero no se les harán correcciones a menos que se trate de vulneraciones a la seguridad. Para más detalles, consulte la Guía de migración.
###Cree una función de entrada para entrenamiento
###Cree una función de entrada para servicio
Creemos una función de entrada que podamos usar en producción y preparemos nuestro modelo entrenado para su servicio.
###Envuelva los datos de entrada en FeatureColumns. Nuestro modelo esperará nuestros datos en TensorFlow FeatureColumns.
###Entrene, evalúe y exporte el modelo
###Unimos todo Hemos creado todo lo que necesitamos para preprocesar los datos de nuestro censo, entrenar un modelo y prepararlo para su servicio. Hasta ahora solo hemos estado preparando las cosas. ¡Es hora de empezar a ejecutar!
Nota: Desplácese por el resultado de esta celda para ver todo el proceso. Los resultados estarán en la parte inferior.