Extracción de características del autocodificador para la clasificación

Autoencoder es un tipo de red neuronal que puede utilizarse para aprender una representación comprimida de los datos en bruto.

Un autoencoder está compuesto por un codificador y un decodificador sub-modelos. El codificador comprime la entrada y el decodificador intenta recrear la entrada a partir de la versión comprimida proporcionada por el codificador. Después de la formación, el modelo de codificador se guarda y el decodificador se descarta.

El codificador puede utilizarse entonces como técnica de preparación de datos para realizar la extracción de características en los datos en bruto que pueden utilizarse para entrenar un modelo diferente de aprendizaje de la máquina.

En este tutorial, descubrirá cómo desarrollar y evaluar un autoencoder para el modelado predictivo de clasificación.


Recomendado: ¿Qué es el Big data?.


Después de completar este tutorial, lo sabrás:

  • Un autoencoder es un modelo de red neural que puede ser usado para aprender una representación comprimida de los datos en bruto.
  • Cómo entrenar un modelo de autoencoder en un conjunto de datos de entrenamiento y guardar sólo la parte de codificador del modelo.
  • Cómo usar el codificador como un paso de preparación de datos cuando se entrena un modelo de aprendizaje de una máquina.

Empecemos.

Cómo desarrollar un autoencoder para la clasificación

Cómo desarrollar un autoencoder para la clasificación
Foto de Bernd Thaller, algunos derechos reservados.

Resumen del Tutorial

Este tutorial está dividido en tres partes; son:

  1. Autocodificadores para la extracción de características
  2. Autoencoder para la clasificación
  3. El codificador como preparación de datos para el modelo de predicción

Autocodificadores para la extracción de características

Un autoencoder es un modelo de red neural que busca aprender una representación comprimida de una entrada.

Un autoencoder es una red neural que está entrenada para intentar copiar su entrada a su salida.

– Página 502, Aprendizaje profundo, 2016.

Se trata de un método de aprendizaje no supervisado, aunque técnicamente se les entrena utilizando métodos de aprendizaje supervisados, denominados auto-supervisados.

Los autocodificadores suelen ser entrenados como parte de un modelo más amplio que intenta recrear la entrada.

Por ejemplo:

El diseño del modelo de autoencoder lo hace difícil a propósito, restringiendo la arquitectura a un cuello de botella en el punto medio del modelo, a partir del cual se realiza la reconstrucción de los datos de entrada.

Hay muchos tipos de autocodificadores y su uso varía, pero quizás el uso más común es como modelo de extracción de características aprendidas o automáticas.

En este caso, una vez que el modelo se ajusta, el aspecto de la reconstrucción del modelo puede ser descartado y el modelo hasta el punto del cuello de botella puede ser utilizado. La salida del modelo en el cuello de botella es un vector de longitud fija que proporciona una representación comprimida de los datos de entrada.

Por lo general, están restringidos de manera que sólo pueden copiar aproximadamente, y copiar sólo la entrada que se asemeja a los datos de entrenamiento. Dado que el modelo se ve obligado a priorizar los aspectos de la entrada que deben ser copiados, a menudo aprende propiedades útiles de los datos.

– Página 502, Aprendizaje profundo, 2016.

Los datos de entrada del dominio pueden entonces proporcionarse al modelo y la salida del modelo en el cuello de botella puede utilizarse como un vector de características en un modelo de aprendizaje supervisado, para la visualización o, más en general, para la reducción de la dimensionalidad.

A continuación, exploremos cómo podríamos desarrollar un autoencoder para la extracción de características en un problema de modelado predictivo de clasificación.

Autoencoder para la clasificación

En esta sección, desarrollaremos un autoencoder para aprender una representación comprimida de las características de entrada para un problema de modelado predictivo de clasificación.

Primero, definamos un problema de modelado predictivo de clasificación.

Utilizaremos la función make_classification() scikit-learn para definir una tarea de clasificación binaria sintética (de 2 clases) con 100 características de entrada (columnas) y 1.000 ejemplos (filas). Es importante que definamos el problema de tal manera que la mayoría de las variables de entrada sean redundantes (90 del 100 o 90 por ciento), permitiendo que el autoencoder aprenda más tarde una representación comprimida útil.

El ejemplo que figura a continuación define el conjunto de datos y resume su forma.

Ejecutando el ejemplo se define el conjunto de datos y se imprime la forma de los conjuntos, confirmando el número de filas y columnas.

A continuación, desarrollaremos un modelo de autoencoder de Percepción Multicapa (MLP).

El modelo tomará todas las columnas de entrada, y luego producirá los mismos valores. Aprenderá a recrear el patrón de entrada exactamente.

El autoencoder consta de dos partes: el codificador y el decodificador. El codificador aprende a interpretar la entrada y a comprimirla en una representación interna definida por la capa del cuello de botella. El decodificador toma la salida del codificador (la capa de cuello de botella) e intenta recrear la entrada.

Una vez que el autoencoder es entrenado, el decodificador es descartado y sólo guardamos el codificador y lo usamos para comprimir los ejemplos de entrada a los vectores de salida por la capa de cuello de botella.

En este primer autocoder, no comprimiremos la entrada en absoluto y usaremos una capa de cuello de botella del mismo tamaño que la entrada. Esto debería ser un problema fácil que el modelo aprenderá casi a la perfección y tiene como objetivo confirmar que nuestro modelo se implementa correctamente.

Definiremos el modelo usando el API funcional; si esto es nuevo para usted, le recomiendo este tutorial:

Antes de definir y ajustar el modelo, dividiremos los datos en trenes y conjuntos de pruebas y escalaremos los datos de entrada normalizando los valores en el rango 0-1, una buena práctica con los MLP.

Definiremos que el codificador tiene dos capas ocultas, la primera con dos veces el número de entradas (por ejemplo, 200) y la segunda con el mismo número de entradas (100), seguida de la capa de cuello de botella con el mismo número de entradas que el conjunto de datos (100).

Para asegurarnos de que el modelo aprende bien, usaremos la normalización de lotes y la activación de ReLU con fugas.

El decodificador se definirá con una estructura similar, aunque a la inversa.

Tendrá dos capas ocultas, la primera con el número de entradas en el conjunto de datos (por ejemplo, 100) y la segunda con el doble de entradas (por ejemplo, 200). La capa de salida tendrá el mismo número de nodos que hay columnas en los datos de entrada y utilizará una función de activación lineal para dar salida a los valores numéricos.

El modelo se ajustará utilizando la versión eficiente de Adam de descenso de gradiente estocástico y minimiza el error cuadrático medio, dado que la reconstrucción es un tipo de problema de regresión multi-salida.

Podemos trazar las capas en el modelo de auto-codificación para tener una idea de cómo los datos fluyen a través del modelo.

La imagen de abajo muestra un gráfico del autoencoder.

Esquema del modelo de autocodificador para la clasificación sin compresión

Esquema del modelo de autocodificador para la clasificación sin compresión

A continuación, podemos entrenar al modelo para reproducir la entrada y hacer un seguimiento del rendimiento del modelo en el conjunto de pruebas de retención.

Después del entrenamiento, podemos trazar las curvas de aprendizaje del tren y los juegos de prueba para confirmar que el modelo aprendió bien el problema de la reconstrucción.

Por último, podemos guardar el modelo de codificador para usarlo más tarde, si se desea.

Como parte de guardar el codificador, también trazaremos el modelo del codificador para tener una idea de la forma de la salida de la capa de cuello de botella, por ejemplo, un vector de 100 elementos.

A continuación se presenta un ejemplo de esta trama.

Esquema del modelo de codificador para la clasificación sin compresión

Esquema del modelo de codificador para la clasificación sin compresión

Enlazando todo esto, el ejemplo completo de un autoencoder para reconstruir los datos de entrada para un conjunto de datos de clasificación sin ninguna compresión en la capa de cuello de botella se enumera a continuación.

Ejecutando el ejemplo se ajusta al modelo e informa de la pérdida en el tren y los juegos de prueba a lo largo del camino.

Notasi tienes problemas para crear las tramas del modelo, puedes comentar la importación y llamar al plot_model() función.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.

En este caso, vemos que la pérdida es baja, pero no llega a cero (como podíamos haber esperado) sin compresión en la capa del cuello de botella. Tal vez se requiera un mayor ajuste de la arquitectura del modelo o el aprendizaje de hiperparámetros.

Se crea un gráfico de las curvas de aprendizaje que muestra que el modelo logra un buen ajuste en la reconstrucción de la entrada, que se mantiene constante a lo largo del entrenamiento, no en exceso.

Curvas de aprendizaje del modelo de autoencoder sin compresión

Curvas de aprendizaje del modelo de autoencoder sin compresión

Hasta ahora, todo bien. Sabemos cómo desarrollar un autoencoder sin compresión.

A continuación, cambiemos la configuración del modelo para que la capa de cuello de botella tenga la mitad del número de nodos (por ejemplo, 50).

A continuación se muestra el ejemplo completo.

Ejecutando el ejemplo se ajusta al modelo e informa de la pérdida en el tren y los juegos de prueba a lo largo del camino.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.

En este caso, vemos que la pérdida se reduce de manera similar a la del ejemplo anterior sin compresión, lo que sugiere que tal vez el modelo funciona igual de bien con un cuello de botella de la mitad del tamaño.

Se crea un gráfico de las curvas de aprendizaje, mostrando de nuevo que el modelo logra un buen ajuste en la reconstrucción de la entrada, que se mantiene constante a lo largo del entrenamiento, no en exceso.

Curvas de aprendizaje del modelo de autocodificador con compresión

Curvas de aprendizaje del modelo de autocodificador con compresión

El codificador entrenado se guarda en el archivo «codificador.h5«que podemos cargar y usar más tarde.

A continuación, exploremos cómo podríamos usar el modelo de codificador entrenado.

El codificador como preparación de datos para el modelo de predicción

En esta sección, usaremos el codificador entrenado del autoencoder para comprimir los datos de entrada y entrenar un modelo predictivo diferente.

Primero, establezcamos una línea de base en el desempeño de este problema. Esto es importante, ya que si el rendimiento de un modelo no mejora con la codificación comprimida, entonces la codificación comprimida no añade valor al proyecto y no debe utilizarse.

Podemos entrenar un modelo de regresión logística en el conjunto de datos de entrenamiento directamente y evaluar el rendimiento del modelo en el conjunto de pruebas de retención.

El ejemplo completo figura a continuación.

La ejecución del ejemplo se ajusta a un modelo de regresión logística en el conjunto de datos de entrenamiento y lo evalúa en el conjunto de pruebas.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.

En este caso, podemos ver que el modelo logra una precisión de clasificación de alrededor del 89,3 por ciento.

Esperamos y deseamos que un modelo de regresión logística se ajuste a una versión codificada de la entrada para lograr una mayor precisión para que la codificación se considere útil.

Podemos actualizar el ejemplo para codificar primero los datos utilizando el modelo de codificador entrenado en la sección anterior.

Primero, podemos cargar el modelo de codificador entrenado desde el archivo.

Podemos entonces utilizar el codificador para transformar los datos de entrada en bruto (por ejemplo, 100 columnas) en vectores de cuello de botella (por ejemplo, 50 vectores de elementos).

Este proceso puede aplicarse al tren y a los conjuntos de datos de prueba.

Podemos entonces usar estos datos codificados para entrenar y evaluar el modelo de regresión logística, como antes.

A continuación se muestra el ejemplo completo.

La ejecución del ejemplo primero codifica el conjunto de datos utilizando el codificador, luego ajusta un modelo de regresión logística en el conjunto de datos de entrenamiento y lo evalúa en el conjunto de pruebas.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.

En este caso, podemos ver que el modelo logra una precisión de clasificación de alrededor del 93,9 por ciento.

Esta es una mejor precisión de clasificación que el mismo modelo evaluado en el conjunto de datos en bruto, lo que sugiere que la codificación es útil para nuestro modelo elegido y el arnés de prueba.

Más lecturas

Esta sección proporciona más recursos sobre el tema si desea profundizar en él.

Tutoriales

Libros

APIs

Artículos

Resumen

En este tutorial, descubriste cómo desarrollar y evaluar un autoencoder para el modelado predictivo de clasificación.

Específicamente, aprendiste:

  • Un autoencoder es un modelo de red neuronal que puede ser usado para aprender una representación comprimida de los datos en bruto.
  • Cómo entrenar un modelo de autoencoder en un conjunto de datos de entrenamiento y guardar sólo la parte de codificador del modelo.
  • Cómo usar el codificador como un paso de preparación de datos cuando se entrena un modelo de aprendizaje de una máquina.

¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios de abajo y haré lo posible por responder.

Desarrollar proyectos de aprendizaje profundo con Python!

Aprendizaje profundo con Python

¿Qué pasaría si pudieras desarrollar una red en minutos

…con sólo unas pocas líneas de Python…

Descubre cómo en mi nuevo Ebook:
Aprendizaje profundo con Python

Cubre proyectos integrales en temas como:
Percepciones multicapas, Redes convolucionales y Redes neuronales recurrentesy más…

Por fin traer el aprendizaje profundo a
Sus propios proyectos

Sáltese los académicos. Sólo los resultados.

Ver lo que hay dentro