Path: blob/master/site/es-419/tutorials/structured_data/preprocessing_layers.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Clasificar datos estructurados usando capas de preprocesamiento Keras
Este tutorial muestra cómo clasificar datos estructurados, como datos tabulares, usando una versión simplificada del conjunto de datos PetFinder de un concurso de Kaggle almacenado en un archivo CSV.
Utilizará Keras para definir el modelo, y capas de preprocesamiento Keras como puente para mapear desde columnas en un archivo CSV a características utilizadas para entrenar el modelo. La meta es predecir si una mascota será adoptada.
Este tutorial contiene el código completo para:
Construir una canalización de entrada para procesar por lotes y barajar las filas usando
tf.data
(visite tf.data: Construir canalizaciones de entrada TensorFlow para más detalles).Mapeo de las columnas del archivo CSV a las características usadas para entrenar el modelo con las capas de preprocesamiento de Keras.
Construir, entrenar y evaluar un modelo usando los métodos incorporados de Keras.
Nota: Este tutorial es similar a Clasificar datos estructurados con columnas de características. Esta versión usa las capas de preprocesamiento Keras en lugar de la API tf.feature_column
, ya que las primeras son más intuitivas y pueden incluirse fácilmente dentro de su modelo para simplificar la implementación.
El mini conjunto de datos PetFinder.my
Hay varios miles de filas en el mini archivo de datos CSV de PetFinder.my, donde cada fila describe una mascota (un perro o un gato) y cada columna describe un atributo, como la edad, la raza, el color, etc.
En el resumen del conjunto de datos que aparece a continuación, observe que hay principalmente columnas numéricas y categóricas. En este tutorial, sólo se ocupará de esos dos tipos de características, eliminando Description
(una característica de texto libre) y AdoptionSpeed
(una característica de clasificación) durante el preprocesamiento de los datos.
Columna | Descripción de mascota | Tipo de característica | Tipo de datos |
---|---|---|---|
Type | Tipo de animal (Dog , Cat ) | Categórica | cadena |
Age | Edad | Numérica | entero |
Breed1 | Raza primaria | Categórica | cadena |
Color1 | Color 1 | Categórica | cadena |
Color2 | Color 2 | 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 | Redacción del perfil | Texto | cadena |
PhotoAmt | Total de fotos subidas | Numérica | entero |
AdoptionSpeed | Rapidez de adopción categórica | Clasificación | entero |
Importar TensorFlow y otras librerías
Cargar el conjunto de datos y leerlo en un DataFrame pandas
pandas es una librería de Python con muchas utilidades útiles para cargar y trabajar con datos estructurados. Use tf.keras.utils.get_file
para descargar y extraer el archivo CSV con el miniconjunto de datos PetFinder.my, y cárguelo en un DataFrame con pandas.read_csv
:
Inspeccione el conjunto de datos comprobando las cinco primeras filas del DataFrame:
Crear una variable objetivo
La tarea original del concurso de Kaggle sobre predicción de adopciones PetFinder.my consistía en predecir la velocidad a la que se adoptará una mascota (por ejemplo, en la primera semana, el primer mes, los tres primeros meses, etc.).
En este tutorial, simplificará la tarea transformándola en un problema de clasificación binaria, en el que simplemente tendrá que predecir si una mascota ha sido adoptada o no.
Tras modificar la columna AdoptionSpeed
, 0
indicará que la mascota no fue adoptada y 1
indicará que sí lo fue.
Dividir el DataFrame en conjuntos de entrenamiento, validación y prueba
El conjunto de datos está en un único DataFrame pandas. Divídalo en conjuntos de entrenamiento, validación y prueba usando, por ejemplo, una proporción 80:10:10, respectivamente:
Crear una canalización de entrada usando tf.data
A continuación, cree una función de utilidad que convierta cada conjunto de datos de entrenamiento, validación y prueba en un tf.data.Dataset
y, a continuación, mezcle y agrupe los datos.
Nota: Si estuviera trabajando con un archivo CSV muy grande (tan grande que no cupiera en memoria), usaría la API tf.data
para leerlo directamente del disco. Eso no se trata en este tutorial.
Ahora, use la función recién creada (df_to_dataset
) para comprobar el formato de los datos que devuelve la función ayudante a la canalización de entrada llamándola sobre los datos de entrenamiento, y use un tamaño de lote pequeño para mantener la legibilidad de la salida:
Como demuestra la salida, el conjunto de entrenamiento devuelve un diccionario de nombres de columnas (del DataFrame) que se mapean a valores de columnas de filas.
Aplicar las capas de preprocesamiento Keras
Las capas de preprocesamiento de Keras le permiten construir canalizaciones de procesamiento de entrada nativas de Keras, que pueden usarse como código de preprocesamiento independiente en flujos de trabajo no Keras, combinarse directamente con modelos Keras y exportarse como parte de un SavedModel de Keras.
En este tutorial, usará las cuatro capas de preprocesamiento siguientes para demostrar cómo realizar el preprocesamiento, la codificación de datos estructurados y la ingeniería de características:
tf.keras.layers.Normalization
: Realiza la normalización de las características de entrada.tf.keras.layers.CategoryEncoding
: Convierte los rasgos categóricos enteros en representaciones densas de uno, varios o tf-idf pasos.tf.keras.layers.StringLookup
: Convierte los valores categóricos de cadena en índices enteros.tf.keras.layers.IntegerLookup
: Convierte valores categóricos enteros en índices enteros.
Puede obtener más información sobre las capas disponibles en la guía Trabajar con capas de preprocesamiento.
Para las características numéricas del miniconjunto de datos PetFinder.my, usará una capa
tf.keras.layers.Normalization
para normalizar la distribución de los datos.Para las características categóricas, como las
Type
de mascotas (Dog
yCat
), las transformará en tensores codificados contf.keras.layers.CategoryEncoding
.
Columnas numéricas
Para cada característica numérica del miniconjunto de datos PetFinder.my, usará una capa tf.keras.layers.Normalization
para estandarizar la distribución de los datos.
Defina una nueva función de utilidad que devuelva una capa que aplique la normalización por características a las características numéricas usando esa capa Keras de preprocesamiento:
A continuación, pruebe la nueva función llamándola sobre el total de características de las fotos de mascotas cargadas para normalizar 'PhotoAmt'
:
Nota: Si tiene muchas características numéricas (cientos, o más), es más eficiente concatenarlas primero y usar una única capa tf.keras.layers.Normalization
.
Columnas categóricas
El Tipo
de mascota en el conjunto de datos se representa como cadenas-Perro
y Gato
-que deben codificarse de forma múltiple antes de introducirse en el modelo. La característica Age
Defina otra nueva función de utilidad que devuelva una capa que mapee valores de un vocabulario a índices enteros y codifique de forma múltiple las características usando las capas de preprocesamiento tf.keras.layers.StringLookup
, tf.keras.layers.IntegerLookup
, y tf.keras.CategoryEncoding
:
Pruebe la función get_category_encoding_layer
llamándola sobre rasgos 'Type'
de mascota para convertirlos en tensores codificados multihilo:
Repita el proceso en las características 'Age'
de la mascota:
Preprocesar las características seleccionadas para entrenar sobre el modelo
Ha aprendido a usar varios tipos de capas de preprocesamiento Keras. A continuación, hará lo siguiente:
Aplicará las funciones de utilidad de preprocesamiento definidas anteriormente a 13 características numéricas y categóricas del miniconjunto de datos PetFinder.my.
Añada todas las entradas de características a una lista.
Como se mencionó al principio, para entrenar el modelo, usará las características numéricas ('PhotoAmt'
, 'Fee'
) y categóricas ('Age'
, 'Type'
, 'Color1'
, 'Color2'
, 'Sex'
, 'MaturitySize'
, 'FurLength'
, 'Vaccinated'
, 'Sterilized'
, 'Health'
, 'Breed1'
) del miniconjunto de datos PetFinder.my.
Nota: 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.
Anteriormente, usó un tamaño de lote pequeño para demostrar la canalización de entrada. Ahora creemos una nueva canalización de entrada con un tamaño de lote mayor, de 256:
Normalice las características numéricas (el número de fotos de mascotas y la cuota de adopción) y añádalas a una lista de entradas llamada encoded_features
:
Convierta los valores categóricos enteros del conjunto de datos (la edad de la mascota) en índices enteros, realice una codificación de múltiples pasos y añada las entradas de características resultantes a encoded_features
:
Repita el mismo paso para los valores categóricos de cadena:
Crear, compilar y entrenar el modelo
El siguiente paso es crear un modelo usando la API Functional de Keras. Para la primera capa de su modelo, fusione la lista de entradas de características (encoded_features
) en un vector mediante concatenación con tf.keras.layers.concatenate
.
Configure el modelo con Model.compile
de Keras:
Visualicemos el grafo de conectividad:
A continuación, entrene el modelo:
Realizar inferencias
El modelo que ha desarrollado ahora puede clasificar una fila a partir de un archivo CSV directamente después de haber incluido las capas de preprocesamiento dentro del propio modelo.
Ahora puede guardar y volver a cargar el modelo Keras con Model.save
y Model.load_model
antes de realizar la inferencia sobre nuevos datos:
Para obtener una predicción para una nueva muestra, basta con llamar al método Model.predict
de Keras. Sólo tiene que hacer dos cosas:
Encapsule los escalares en una lista para que tengan una dimensión de lote (
Model
s sólo procesan lotes de datos, no muestras individuales).Llame a
tf.convert_to_tensor
sobre cada característica.
Nota: Normalmente obtendrá mejores resultados con el aprendizaje profundo con conjuntos de datos más grandes y complejos. Cuando trabaje con un conjunto de datos pequeño, como el simplificado PetFinder.my, puede usar un árbol de decisión o un bosque aleatorio como línea de referencia sólida. La meta de este tutorial es demostrar la mecánica de trabajar con datos estructurados, para que tenga un punto de partida cuando trabaje con sus propios conjuntos de datos en el futuro.
Siguientes pasos
Para aprender más sobre la clasificación de datos estructurados, pruebe a trabajar con otros conjuntos de datos. Para mejorar la precisión durante el entrenamiento y las pruebas de sus modelos, piense detenidamente qué características incluir en su modelo y cómo deben representarse.
Aquí tiene algunas sugerencias de conjuntos de datos:
Conjuntos de datos TensorFlow: MovieLens: Un conjunto de clasificaciones de un servicio de recomendación de películas.
Conjuntos de datos TensorFlow: Wine Quality: Dos conjuntos de datos relacionados con las variantes tintas y blancas del vino portugués "Vinho Verde". También puede encontrar el conjunto de datos Red Wine Quality en Kaggle.
Kaggle: conjunto de datos arXiv: Un corpus de 1.7 millones de artículos académicos de arXiv, que abarca la física, la informática, las matemáticas, la estadística, la ingeniería eléctrica, la biología cuantitativa y la economía.