Path: blob/master/site/es-419/tutorials/structured_data/feature_columns.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Clasificar datos estructurados con columnas de características
Advertencia: El módulo
tf.feature_columns
descrito en este tutorial no se recomienda para código nuevo. Las capas de preprocesamiento Keras cubren esta funcionalidad, para instrucciones de migración consulte la guía Migrando columnas de características. El módulotf.feature_columns
fue diseñado para usarse con losEstimators
de TF1. Entra dentro de nuestras garantías de compatibilidad, pero no recibirá más correcciones que las vulnerabilidades de seguridad.
Este tutorial muestra cómo clasificar datos estructurados (por ejemplo, datos tabulares en un CSV). Usaremos Keras para definir el modelo, y tf.feature_column
como puente para mapear desde columnas en un CSV a características usadas para entrenar el modelo. Este tutorial contiene el código completo para:
Cargar un archivo CSV usando Pandas.
Construir una canalización de entrada para procesar por lotes y mezclar las filas usando tf.data.
Mapear de columnas en el CSV a características usadas para entrenar el modelo usando columnas de características.
Construir, entrenar y evaluar un modelo usando Keras.
El conjunto de datos
Usaremos una versión simplificada del conjunto de datos de PetFinder. Hay varios miles de filas en el CSV. Cada fila describe una mascota y cada columna describe un atributo. Usaremos esta información para predecir la velocidad a la que se adoptará la mascota.
A continuación se describe este conjunto de datos. Observe que hay columnas numéricas y categóricas. Hay una columna de texto libre que no usaremos en este tutorial.
Columna | Descripción | Tipo de característica | Tipo de datos |
---|---|---|---|
Type | Tipo de animal (Dog, Cat) | Categórica | cadena |
Age | Edad de la mascota | Numérico | entero |
Breed1 | Raza principal de la mascota | Categórica | cadena |
Color1 | Color 1 de la mascota | Categórica | cadena |
Color2 | Color 2 de la mascota | Categórica | cadena |
MaturitySize | Tamaño de adulto | Categórica | cadena |
FurLength | Largo de pelo | Categórica | cadena |
Vaccinated | La mascota ha sido vacunada | Categórica | cadena |
Sterilized | La mascota ha sido esterilizada | Categórica | cadena |
Health | Condición de salud | Categórica | cadena |
Fee | Tarifa de adopción | Numérica | entero |
Description | Reseña del perfil de esta mascota | Texto | cadena |
PhotoAmt | Total de fotos subidas para esta mascota | Numérica | entero |
AdoptionSpeed | Rapidez de adopción | Clasificación | entero |
Importar TensorFlow y otras librerías
Usar Pandas para crear un dataframe
Pandas es una librería de Python con muchas utilidades útiles para cargar y trabajar con datos estructurados. Usaremos Pandas para descargar el conjunto de datos desde una URL, y cargarlo en un dataframe.
Crear variable objetivo
La tarea en el conjunto de datos original es predecir la velocidad a la que se adoptará una mascota (por ejemplo, en la primera semana, el primer mes, los tres primeros meses, etc.). Simplifiquemos esto para nuestro tutorial. Aquí, transformaremos esto en un problema de clasificación binaria, y simplemente predeciremos si la mascota fue adoptada, o no.
Tras modificar la columna de la etiqueta, 0 indicará que la mascota no fue adoptada y 1 que sí lo fue.
Dividir el dataframe en entrenamiento, validación y prueba
El conjunto de datos que descargamos era un único archivo CSV. Lo dividiremos en conjuntos de entrenamiento, validación y prueba.
Crear una canalización de entrada usando tf.data
A continuación, encapsularemos los marcos de datos con tf.data. Esto nos permitirá usar columnas de características como puente para mapear desde las columnas del dataframe de Pandas a las características usadas para entrenar el modelo. Si estuviéramos trabajando con un archivo CSV muy grande (tan grande que no cupiera en memoria), usaríamos tf.data para leerlo directamente del disco. Eso no se trata en este tutorial.
Comprender la canalización de entrada
Ahora que hemos creado la canalización de entrada, vamos a llamarla para ver el formato de los datos que devuelve. Hemos usado un tamaño de lote pequeño para mantener la salida legible.
Podemos ver que el conjunto de datos devuelve un diccionario de nombres de columnas (del dataframe) que mapean con valores de columnas de filas del dataframe.
Demostrar varios tipos de columnas de características
TensorFlow proporciona muchos tipos de columnas de características. En esta sección, crearemos varios tipos de columnas de características y demostraremos cómo transforman una columna del dataframe.
Columnas numéricas
La salida de una columna de características se convierte en la entrada del modelo (usando la función demo definida anteriormente, podremos ver exactamente cómo se transforma cada columna del dataframe). Una columna numérica es el tipo más simple de columna. Se usa para representar características de valor real. Al usar esta columna, su modelo recibirá el valor de la columna del dataframe sin cambios.
En el conjunto de datos PetFinder, la mayoría de las columnas del dataframe son categóricas.
Columnas por cubos
A menudo, no querrá introducir un número directamente en el modelo, sino dividir su valor en diferentes categorías basadas en rangos numéricos. Consideremos los datos brutos que representan la edad de una persona. En lugar de representar la edad como una columna numérica, podríamos dividir la edad en varios cubos usando una columna por cubos. Observe que los valores de un punto que aparecen a continuación describen a qué rango de edad corresponde cada fila.
Columnas categóricas
En este conjunto de datos, el tipo se representa como una cadena (por ejemplo, 'Dog', o 'Cat'). No podemos introducir cadenas directamente en un modelo. En su lugar, primero debemos mapearlas a valores numéricos. Las columnas del vocabulario categórico proporcionan una forma de representar las cadenas como un vector de un solo punto (muy parecido a lo que ha visto anteriormente con los cubos de edad). El vocabulario puede pasarse como una lista usando categorical_column_with_vocabulary_list, o cargarse desde un archivo usando categorical_column_with_vocabulary_file.
Incorporación de columnas
Supongamos que en lugar de tener sólo unas pocas cadenas posibles, tenemos miles (o más) de valores por categoría. Por diversos motivos, a medida que el número de categorías progresa, resulta inviable entrenar una red neuronal usando codificaciones de un solo paso. Podemos usar una columna de incorporación para superar esta limitación. En lugar de representar los datos como un vector unívoco de muchas dimensiones, una columna de incorporación representa esos datos como un vector denso de dimensiones inferiores en el que cada celda puede contener cualquier número, no sólo 0 o 1. El tamaño de la incorporación (8, en el ejemplo siguiente) es un parámetro que debe ajustarse.
Punto clave: usar una columna de incorporación es lo mejor cuando una columna categórica tiene muchos valores posibles. Aquí estamos usando una con fines de demostración, para que tenga un ejemplo completo que pueda modificar para un conjunto de datos diferente en el futuro.
Columnas de características hasheadas
Otra forma de representar una columna categórica con un gran número de valores es usar una categorical_column_with_hash_bucket. Esta columna categórica calcula un valor hash de la entrada y, a continuación, selecciona uno de los cubos hash_bucket_size
para codificar una cadena. Al usar esta columna, no necesita proporcionar el vocabulario, y puede seleccionar que el número de hash_buckets sea significativamente menor que el número de categorías reales para ahorrar espacio.
Punto clave: Un inconveniente importante de esta técnica es que puede haber colisiones en las que se mapeen cadenas diferentes en el mismo cubo. En la práctica, esto puede funcionar bien para algunos conjuntos de datos a pesar de todo.
Columnas de características cruzadas
La combinación de características en una única característica, más conocida como cruces de características, permite a un modelo aprender ponderaciones separadas para cada combinación de características. Aquí, crearemos una nueva característica que es el cruce de Edad y Tipo. Tenga en cuenta que crossed_column
no construye la tabla completa de todas las combinaciones posibles (que podría ser muy grande). En su lugar, está respaldada por una hashed_column
, de modo que puede seleccionar el tamaño de la tabla.
Seleccionar qué columnas usar
Hemos visto cómo usar varios tipos de columnas de características. Ahora las usaremos para entrenar un modelo. La meta de este tutorial es mostrarle el código completo (por ejemplo, la mecánica) necesario para trabajar con columnas de características. A continuación, hemos seleccionado arbitrariamente algunas columnas para entrenar nuestro modelo.
Punto clave: Si su objetivo es construir un modelo preciso, pruebe con un conjunto de datos propio más amplio y piense detenidamente qué características son las más significativas que debe incluir y cómo deben representarse.
Crear una capa de características
Ahora que hemos definido nuestras columnas de características, usaremos una capa DenseFeatures para introducirlas en nuestro modelo Keras.
Anteriormente, usamos un tamaño de lote pequeño para demostrar cómo funcionaban las columnas de características. Creamos una nueva canalización de entrada con un tamaño de lote mayor.
Crear, compilar y entrenar el modelo
Punto clave: Normalmente obtendrá mejores resultados con el aprendizaje profundo con conjuntos de datos mucho más grandes y complejos. Cuando trabaje con un conjunto de datos pequeño como éste, le recomendamos usar un árbol de decisión o un bosque aleatorio como línea de referencia sólida. La meta de este tutorial no es entrenar un modelo preciso, sino demostrar la mecánica de trabajo con datos estructurados, para que disponga de código que pueda usar como punto de partida cuando trabaje con sus propios conjuntos de datos en el futuro.
Siguientes pasos
La mejor manera de aprender más sobre la clasificación de datos estructurados es intentarlo usted mismo. Le sugerimos que encuentre otro conjunto de datos con el que trabajar y entrene un modelo para clasificarlo utilizando un código similar al anterior. Para mejorar la precisión, piense detenidamente qué características incluir en su modelo y cómo deben representarse.