Path: blob/master/site/es-419/tutorials/keras/regression.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Regresión básica: predicción de la eficiencia del combustible
En un problema de regresión, la meta es predecir la salida de un valor continuo, como un precio o una probabilidad. Comparemos esto con un problema de clasificación, donde la meta es seleccionar una clase de una lista de clases (por ejemplo, donde una imagen contiene una manzana o una naranja, reconocer qué fruta se muestra en la imagen).
Este tutorial usa el clásico conjunto de datos Auto MPG y demuestra cómo generar modelos para predecir la eficiencia del combustible de los automóviles de fines de 1970 y principios de 1980. Para ello, deberá brindarles a los modelos una descripción de muchos automóviles de ese período. Esta descripción incluye atributos como cilindros, desplazamiento, potencia y peso.
En este ejemplo se usa la API de Keras. (Visite los tutoriales y las guías de Keras para obtener más información).
El conjunto de datos Auto MPG
El conjunto de datos está disponible desde el repositorio UCI Machine Learning.
Obtener los datos
Para empezar, use pandas para descargar e importar el conjunto de datos:
Limpiar los datos
El conjunto de datos contiene algunos valores desconocidos:
Descarte esas filas para simplificar este tutorial inicial:
La columna "Origin"
corresponde a una categoría, no es numérica. Entonces, el siguiente paso es aplicar la codificación en un solo paso de los valores en la columna con pd.get_dummies.
Nota: Puede configurar tf.keras.Model
para que realice este tipo de transformación por usted, pero eso está fuera del alcance de este tutorial. Consulte los tutoriales Clasificar datos estructurados con las capas de preprocesamiento de Keras o Cargar datos CSV para ver ejemplos.
Dividir los datos en conjuntos de entrenamiento y prueba
Ahora, divida los conjuntos de datos en un conjunto de entrenamiento y un conjunto de prueba. Usará el conjunto de prueba para la evaluación final de sus modelos.
Inspeccionar los datos
Revise la distribución conjunta de algunos pares de columnas del conjunto de entrenamiento.
La fila superior sugiere que la eficiencia del combustible (MPG) es una función conjunta de todos los demás parámetros. Las otras filas indican que son funciones entre sí.
Comprobemos también las estadísticas generales. Observe cómo cada característica cubre un rango muy distinto:
Separar las características de las etiquetas
Separe el valor de destino, la "etiqueta", de las características. Esta etiqueta es el valor que deberá predecir el modelo entrenado.
Normalización
En la tabla de estadísticas se puede ver con claridad lo distintos que son los rangos de cada característica:
Resulta muy práctico normalizar características que usan diferentes escalas y rangos.
Uno de los motivos por los que esto resulta importante es que las características se multiplican por los pesos del modelo. Por lo tanto, la escala de las salidas y la escala de los gradientes se ve afectada por la escala de las entradas.
Si bien un modelo podría converger sin implementar la normalización de las características, dicha normalización le aporta más estabilidad al entrenamiento.
Nota: Normalizar las características de codificación en un solo paso no presenta ninguna ventaja, solo se hace aquí para simplificar. Si desea obtener más información sobre cómo se usan las capas de preprocesamiento, consulte la guía Trabajar con capas de preprocesamiento y el tutorial Clasificar datos estructurados con las capas de preprocesamiento de Keras.
La capa de normalización
tf.keras.layers.Normalization
presenta un método simple y directo de agregar normalización de características a su modelo.
El primer paso consiste en crear la capa:
Luego, debe llamar Normalization.adapt
para ajustar el estado de la capa de preprocesamiento a los datos:
Calcule la media y la desviación, y almacénelas en la capa:
Cuando se llama a la capa, esta devuelve los datos de entrada, con cada característica normalizada de forma independiente:
Regresión lineal
Antes de generar un modelo de red neuronal profunda, comience con la regresión lineal y use una y varias variables.
Regresión lineal con una variable
Comience por aplicar una regresión lineal de una sola variable para predecir 'MPG'
a partir de 'Horsepower'
.
Al entrenar un modelo con tf.keras
generalmente se comienza por definir la arquitectura del modelo. Use un modelo tf.keras.Sequential
, que representa una secuencia de pasos.
Un modelo de regresión lineal de una variable consta de dos pasos:
Normalice las características de la entrada
'Horsepower'
mediante el uso de la capa de preprocesamientotf.keras.layers.Normalization
.Aplique una transformación lineal () para producir 1 salida mediante el uso de una capa lineal (
tf.keras.layers.Dense
).
La cantidad de entradas se pueden establecer tanto mediante el argumento input_shape
como de forma automática cuando el modelo se ejecute por primera vez.
En primer lugar, cree un arreglo NumPy compuesto por las características de 'Horsepower'
. Luego, cree instancias de tf.keras.layers.Normalization
y ajuste su estado a los datos de horsepower
:
Generar el modelo secuencial de Keras:
Este modelo puede predecir 'MPG'
a partir de 'Horsepower'
.
Ejecute el modelo sin entrenar en los primeros 10 valores de 'Horsepower'. La salida no será buena, pero observe que tiene la forma esperada de (10, 1)
:
Una vez que se haya generado el modelo, configure el procedimiento de entrenamiento a través del método Model.compile
de Keras. Los argumentos más importantes para compilar son loss
y optimizer
, ya que estos definen qué se optimizará (mean_absolute_error
) y cómo (mediante el uso de tf.keras.optimizers.Adam
).
Use Model.fit
de Keras para ejecutar el entrenamiento durante 100 épocas:
Visualice el progreso del entrenamiento del modelo con ayuda de las estadísticas almacenadas en el objeto history
:
Recopile los resultados del conjunto de prueba para después:
Como se trata de una regresión lineal con una sola variable, es fácil ver las predicciones del modelo como una función de la entrada:
Regresión lineal con múltiples entradas
Puede usar una configuración prácticamente idéntica para hacer predicciones basadas en múltiples entradas. Este modelo hace lo mismo que con la diferencia de que es una matriz y es un vector.
Cree un modelo secuencial de Keras nuevamente donde la primera capa sea normalizer
(tf.keras.layers.Normalization(axis=-1)
) que anteriormente ya definió y adaptó a todo el conjunto de datos:
Cuando llama Model.predict
en un lote de entradas, produce salidas units=1
para cada ejemplo:
Cuando llama el modelo, sus matrices de peso se generarán; compruebe que los pesos kernel
(the in ) tengan la misma forma que (9, 1)
:
Configure el modelo con Keras Model.compile
y entrénelo con Model.fit
durante 100 épocas:
Usar todas las entradas en este modelo de regresión consigue un error de entrenamiento y validación mucho más bajo que horsepower_model
, que tenía una sola entrada:
Recopile los resultados del conjunto de prueba para después:
Regresión con una red neuronal profunda (DNN)
En la sección anterior, implementó dos modelos lineales tanto con una entrada como con múltiples entradas.
Aquí, implementará modelos de DNN de una sola entrada y de múltiples entradas.
El código es básicamente el mismo, con la diferencia de que el modelo se amplió para incluir algunas capas no lineales "ocultas". Con el término "ocultas" nos referimos a que no están directamente conectadas con las entradas y las salidas.
Estos modelos contendrán algunas capas más que el modelo lineal:
La capa de normalización, de la misma forma que sucedió anteriormente (con
horsepower_normalizer
para un modelo de una sola entrada ynormalizer
para un modelo con múltiples entradas).Dos capas
Dense
ocultas, no lineales con la función de activación no lineal ReLU (relu
).Una capa
Dense
lineal de una sola salida.
Ambos modelos usarán el mismo procedimiento de entrenamiento, por lo que el método compile
se incluye en la función build_and_compile_model
a continuación.
Regresión usando una DNN y una sola entrada
Cree un modelo de DNN con solo 'Horsepower'
como entrada y horsepower_normalizer
(definido anteriormente) como capa de normalización:
Este modelo tiene bastantes parámetros entrenables más que el modelo lineal:
Entrene el modelo con Model.fit
de Keras:
Este modelo tiene un rendimiento ligeramente superior al modelo lineal horsepower_model
de una sola entrada:
Si traza estas predicciones como una función de 'Horsepower'
, notará que este modelo aprovecha la falta de linealidad que le aportan las capas ocultas:
Recopile los resultados del conjunto de prueba para después:
Regresión usando una DNN y múltiples entradas
Repita el proceso anterior usando todas las entradas. El rendimiento del modelo mejora levemente con el conjunto de datos de validación.
Recopile los resultados del conjunto de prueba:
Rendimiento
Dado que ya ha entrenado todos los modelos, puede consultar el rendimiento del conjunto de prueba:
Estos resultados coinciden con el error de validación que se observó durante el entrenamiento.
Hacer predicciones
Ahora puede hacer predicciones con dnn_model
en el conjunto de prueba usando Keras Model.predict
y revisar la pérdida:
Al parecer, el modelo predice bastante bien.
Ahora, compruebe la distribución de los errores:
Si está satisfecho con el modelo, guárdelo para usarlo más tarde con Model.save
:
Si vuelve a cargar el modelo, le da una salida idéntica:
Conclusión
Este bloc de notas introdujo algunas técnicas para hacer frente a un problema de regresión. Aquí encontrará algunos consejos más que pueden ayudarle:
El error cuadrático medio (MSE) (
tf.keras.losses.MeanSquaredError
) y el error absoluto medio (MAE) (tf.keras.losses.MeanAbsoluteError
) son funciones de pérdida comunes que se usan para problemas de regresión. MAE es menos susceptible a los valores atípicos. Para los problemas de clasificación se usan otras funciones de pérdida.Asimismo, las métricas de evaluación que se usan para la regresión son distintas de las que se usan para la clasificación.
Cuando las características de los datos de entradas numéricas tienen valores con diferentes rangos, se debe escalar por separado cada característica al mismo rango.
El sobreajuste es un problema común para los modelos de DNN, aunque no fue un problema para este tutorial. Visite el tutorial Sobreajuste y subajuste para obtener más ayuda al respecto.