Path: blob/master/site/es-419/guide/migrate/migrating_feature_columns.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Migrar tf.feature_column
a capas de preprocesamiento Keras
El entrenamiento de un modelo suele ir acompañado de una cierta cantidad de preprocesamiento de características, sobre todo cuando se trata de datos estructurados. Cuando se entrena un tf.estimator.Estimator
en TensorFlow 1, normalmente se realiza el preprocesamiento de características con la API tf.feature_column
. En TensorFlow 2, puede hacerlo directamente con las capas de preprocesamiento de Keras.
Esta guía de migración demuestra las transformaciones comunes de las características usando ambas columnas de características y capas de preprocesamiento, seguidas del entrenamiento de un modelo completo con ambas API.
En primer lugar, comience con un par de imports necesarios:
A continuación, añada una función de servicio para llamar a una columna de características para demostración:
Manejo de entradas
Para usar columnas de características con un estimador, siempre se espera que las entradas del modelo sean un diccionario de tensores:
Cada columna de características debe crearse con una clave para indexarla en los datos de origen. La salida de todas las columnas de características se concatena y es usada por el modelo de estimación.
En Keras, la entrada del modelo es mucho más flexible. Un tf.keras.Model
puede manejar una única entrada de tensor, una lista de características de tensor o un diccionario de características de tensor. Usted puede manejar la entrada de diccionario pasando un diccionario de tf.keras.Input
en la creación del modelo. Las entradas no se concatenarán automáticamente, lo que permite usarlas de formas mucho más flexibles. Pueden concatenarse con tf.keras.layers.Concatenate
.
Codificación de un solo paso de ID enteros
Una transformación de características común es la codificación de un solo paso de entradas enteras de un rango conocido. He aquí un ejemplo usando columnas de características:
Usando capas de preprocesamiento Keras, estas columnas pueden ser sustituidas por una única capa tf.keras.layers.CategoryEncoding
con output_mode
configurado como 'one_hot'
:
Nota: Para codificaciones grandes de un solo paso, es mucho más eficiente usar una representación sparse de la salida. Si pasa sparse=True
a la capa CategoryEncoding
, la salida de la capa será un tf.sparse.SparseTensor
, que puede manejarse eficientemente como entrada a una capa tf.keras.layers.Dense
.
Normalización de características numéricas
Cuando maneje características continuas de punto flotante con columnas de características, deberá usar una tf.feature_column.numeric_column
. En caso de que la entrada ya esté normalizada, convertir esto en Keras es trivial. Puede simplemente usar un tf.keras.Input
directamente en su modelo, como se muestra arriba.
También se puede usar una numeric_column
para normalizar la entrada:
En cambio, con Keras, esta normalización puede realizarse con tf.keras.layers.Normalization
.
Cubicación y codificación de características numéricas en un solo paso
Otra transformación común de entradas continuas en punto flotante es cubicarlas a continuación a enteros de un rango fijo.
En las columnas de características, esto puede lograrse con una tf.feature_column.bucketized_column
:
En Keras, esto puede ser sustituido por tf.keras.layers.Discretization
:
Codificación de un solo paso para datos de cadena con un vocabulario
El manejo de características de cadena a menudo requiere una búsqueda de vocabulario para traducir las cadenas en índices. Aquí tiene un ejemplo en el que se usan columnas de características para buscar cadenas y luego codificar los índices de un solo paso:
Usando capas de preprocesamiento Keras, use la capa tf.keras.layers.StringLookup
con output_mode
configurado a 'one_hot'
:
Nota: Para codificaciones grandes de un solo paso, es mucho más eficiente usar una representación dispersa de la salida. Si pasa sparse=True
a la capa StringLookup
, la salida de la capa será un tf.sparse.SparseTensor
, que puede manejarse eficientemente como entrada a una capa tf.keras.layers.Dense
.
Incorporación de datos de cadena con un vocabulario
En el caso de vocabularios más extensos, suele ser necesaria una incorporación para obtener un buen rendimiento. Aquí tiene un ejemplo de incorporación de una característica de cadena usando columnas de características:
Usando capas de preprocesamiento Keras, esto se puede conseguir combinando una capa tf.keras.layers.StringLookup
y una capa tf.keras.layers.Embedding
. La salida por default de la capa StringLookup
serán índices enteros que pueden introducirse directamente en una incorporación.
Nota: La capa Embedding
contiene parámetros entrenables. Mientras que la capa StringLookup
puede aplicarse a datos dentro o fuera de un modelo, la capa Embedding
siempre debe formar parte de un modelo Keras entrenable a fin de entrenar correctamente.
Suma de datos categóricos ponderados
En algunos casos, es necesario tratar datos categóricos en los que cada aparición de una categoría lleva asociada una ponderación. En las columnas de características, esto se gestiona con tf.feature_column.weighted_categorical_column
. Cuando se combina con una indicator_column
, tiene el efecto de sumar las ponderaciones por categoría.
En Keras, esto puede hacerse pasando una entrada count_weights
a tf.keras.layers.CategoryEncoding
con output_mode='count'
.
Incorporación de datos categóricos ponderados
Es posible que, alternativamente, desee incorporar entradas categóricas ponderadas. En las columnas de características, la embedding_column
contiene un argumento combiner
. Si algún muestreo contiene varias entradas para una categoría, se combinarán según lo establecido en el argumento (por defecto 'mean'
).
En Keras, no existe la opción combiner
para tf.keras.layers.Embedding
, pero puede conseguir el mismo efecto con tf.keras.layers.Dense
. La embedding_column
anterior es simplemente la combinación lineal de vectores de incorporación según la ponderación de la categoría. Aunque no resulte obvio a primera vista, es exactamente equivalente a representar sus entradas categóricas como un vector de ponderación disperso de tamaño (num_tokens)
, y multiplicarlos por un kernel Dense
de forma (embedding_size, num_tokens)
.
Ejemplo de entrenamiento completo
Para mostrar un flujo de trabajo de entrenamiento completo, prepare primero algunos datos con tres características de distintos tipos:
Defina algunas constantes comunes para los flujos de trabajo TensorFlow 1 y TensorFlow 2:
Con columnas de características
Las columnas de características deben pasarse como una lista al estimador en el momento de la creación, y se llamarán implícitamente durante el entrenamiento.
Las columnas de características también se usarán para transformar los datos de entrada cuando se ejecute la inferencia en el modelo.
Con las capas de preprocesamiento Keras
Las capas Keras de preprocesamiento son más flexibles en cuanto a dónde pueden ser llamadas. Una capa puede aplicarse directamente a los tensores, usarse dentro de una canalización de entrada tf.data
, o integrarse directamente en un modelo Keras entrenable.
En este ejemplo, aplicará capas de preprocesamiento dentro de una canalización de entrada tf.data
. Para ello, puede definir un tf.keras.Model
separado para preprocesar sus características de entrada. Este modelo no es entrenable, pero es una forma conveniente de agrupar las capas de preprocesamiento.
Nota: Como alternativa a suministrar un vocabulario y estadísticas de normalización en la creación de capas, muchas capas de preprocesamiento ofrecen un método adapt()
para aprender el estado de la capa directamente a partir de los datos de entrada. Consulte la guía de preprocesamiento para más detalles.
Ahora puede aplicar este modelo dentro de una llamada a tf.data.Dataset.map
. Tenga en cuenta que la función pasada a map
se convertirá automáticamente en una tf.function
, y se aplicarán las advertencias habituales para escribir código tf.function
(sin efectos secundarios).
A continuación, puede definir un Model
independiente que contenga las capas entrenables. Tenga en cuenta cómo las entradas a este modelo reflejan ahora los tipos de características y formas preprocesadas.
Ahora puede entrenar el training_model
con tf.keras.Model.fit
.
Por último, en el momento de la inferencia, puede ser útil combinar estas etapas separadas en un único modelo que maneje las entradas de características brutas.
Este modelo compuesto puede guardarse como archivo .keras
para usarlo posteriormente.
Nota: Las capas de preprocesamiento no son entrenables, lo que le permite aplicarlas asincrónicamente usando tf.data
. Esto tiene beneficios para el rendimiento, ya que puede preextraer lotes preprocesados y liberar cualquier acelerador para que se enfoque en las partes diferenciables de un modelo (más información en la sección Preextracción de la guía Mejor rendimiento con la API tf.data
). Como muestra esta guía, separar el preprocesamiento durante el entrenamiento y componerlo durante la inferencia es una forma flexible de aprovechar estas ganancias de rendimiento. Sin embargo, si su modelo es pequeño o el tiempo de preprocesamiento es insignificante, puede ser más sencillo construir el preprocesamiento en un modelo completo desde el principio. Para ello, puede construir un modelo único que comience con tf.keras.Input
, seguido de las capas de preprocesamiento, seguidas de las capas entrenables.
Tabla de equivalencias de columnas de características
A modo de referencia, he aquí una correspondencia aproximada entre las columnas de características y las capas de preprocesamiento de Keras:
Columna de características | Capas Keras |
---|---|
`tf.feature_column.bucketized_column` | `tf.keras.layers.Discretization` |
`tf.feature_column.categorical_column_with_hash_bucket` | `tf.keras.layers.Hashing` |
`tf.feature_column.categorical_column_with_identity` | `tf.keras.layers.CategoryEncoding` |
`tf.feature_column.categorical_column_with_vocabulary_file` | `tf.keras.layers.StringLookup` o `tf.keras.layers.IntegerLookup` |
`tf.feature_column.categorical_column_with_vocabulary_list` | `tf.keras.layers.StringLookup` o `tf.keras.layers.IntegerLookup` |
`tf.feature_column.crossed_column` | `tf.keras.layers.experimental.preprocessing.HashedCrossing` |
`tf.feature_column.embedding_column` | `tf.keras.layers.Embedding` |
`tf.feature_column.indicator_column` | `output_mode='one_hot'` o `output_mode='multi_hot'`* |
`tf.feature_column.numeric_column` | `tf.keras.layers.Normalization` |
`tf.feature_column.sequence_categorical_column_with_hash_bucket` | `tf.keras.layers.Hashing` |
`tf.feature_column.sequence_categorical_column_with_identity` | `tf.keras.layers.CategoryEncoding` |
`tf.feature_column.sequence_categorical_column_with_vocabulary_file` | `tf.keras.layers.StringLookup`, `tf.keras.layers.IntegerLookup`, o `tf.keras.layer.TextVectorization`† |
`tf.feature_column.sequence_categorical_column_with_vocabulary_list` | `tf.keras.layers.StringLookup`, `tf.keras.layers.IntegerLookup`, o `tf.keras.layer.TextVectorization`† |
`tf.feature_column.sequence_numeric_column` | `tf.keras.layers.Normalization` |
`tf.feature_column.weighted_categorical_column` | `tf.keras.layers.CategoryEncoding` |
El
output_mode
puede pasarse atf.keras.layers.CategoryEncoding
,tf.keras.layers.StringLookup
,tf.keras.layers.IntegerLookup
, ytf.keras.layers.TextVectorization
.
† tf.keras.layers.TextVectorization
puede manejar directamente la entrada de texto de forma libre (por ejemplo, frases o párrafos enteros). Esto no es un reemplazo uno-a-uno para el manejo de secuencias categóricas en TensorFlow 1, pero puede ofrecer un reemplazo conveniente para el preprocesamiento de texto ad-hoc.
Nota: Los estimadores lineales, como tf.estimator.LinearClassifier
, pueden manejar entradas categóricas directas (índices enteros) sin una embedding_column
o indicator_column
. Sin embargo, los índices enteros no pueden pasarse directamente a tf.keras.layers.Dense
o tf.keras.experimental.LinearModel
. Estas entradas deben codificarse primero con tf.layers.CategoryEncoding
con output_mode='count'
(y sparse=True
si el tamaño de las categorías es grande) antes de llamar a Dense
o LinearModel
.
Siguientes pasos
Para obtener más información sobre las capas de preprocesamiento de Keras, consulte la guía Trabajar con capas de preprocesamiento.
Para ver un ejemplo más detallado de cómo aplicar capas de preprocesamiento a datos estructurados, consulte el tutorial Clasificar datos estructurados utilizando capas de preprocesamiento Keras.