Saltar al contenido

Selección de características con algoritmos de optimización estocástica

25 de diciembre de 2020

Por lo general, se puede desarrollar un modelo de aprendizaje automático más simple y de mejor rendimiento eliminando las características de entrada (columnas) del conjunto de datos de formación.

Esto se llama selección de características y hay muchos tipos diferentes de algoritmos que pueden ser utilizados.

Es posible enmarcar el problema de la selección de características como un problema de optimización. En el caso de que haya pocas características de entrada, se pueden evaluar todas las combinaciones posibles de características de entrada y encontrar definitivamente el mejor subconjunto. En el caso de un gran número de características de entrada, se puede utilizar un algoritmo de optimización estocástica para explorar el espacio de búsqueda y encontrar un subconjunto efectivo de características.

En este tutorial, descubrirá cómo utilizar los algoritmos de optimización para la selección de características en el aprendizaje automático.

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

  • El problema de la selección de características puede definirse en términos generales como un problema de optimización.
  • Cómo enumerar todos los posibles subconjuntos de características de entrada para un conjunto de datos.
  • Cómo aplicar la optimización estocástica para seleccionar un subconjunto óptimo de características de entrada.

Empecemos.

Cómo usar la optimización para la selección de características

Cómo usar la optimización para la selección de características
Foto de Gregory «Slobirdr» Smith, algunos derechos reservados.

Resumen del Tutorial

Este tutorial está dividido en tres partes; son:

  1. Optimización para la selección de características
  2. Enumerar todos los subconjuntos de características
  3. Optimizar subconjuntos de características

Optimización para la selección de características

La selección de características es el proceso de reducir el número de variables de entrada cuando se desarrolla un modelo predictivo.

Es conveniente reducir el número de variables de entrada para reducir el costo computacional de la modelación y, en algunos casos, mejorar el rendimiento del modelo. Existen muchos tipos diferentes de algoritmos de selección de características, aunque en general pueden agruparse en dos tipos principales: métodos de envoltura y de filtro.

Los métodos de selección de características de la envoltura crean muchos modelos con diferentes subconjuntos de características de entrada y seleccionan aquellas características que resultan en el modelo de mejor rendimiento de acuerdo con una métrica de rendimiento. Estos métodos no se preocupan por los tipos de variables, aunque pueden ser costosos desde el punto de vista computacional. RFE es un buen ejemplo de un método de selección de características de envoltura.

Los métodos de selección de características de filtro utilizan técnicas estadísticas para evaluar la relación entre cada variable de entrada y la variable objetivo, y estas puntuaciones se utilizan como base para elegir (filtrar) las variables de entrada que se utilizarán en el modelo.

  • Selección de características de la envoltura: Busca subconjuntos de características que funcionen bien.
  • Selección de características de filtro: Seleccione subconjuntos de características en base a su relación con el objetivo.

Para más información sobre la elección de los algoritmos de selección de características, consulte el tutorial:

Un método popular de envoltura es el algoritmo de eliminación de características recursivas, o RFE.

La RFE funciona buscando un subconjunto de características, comenzando con todas las características del conjunto de datos de entrenamiento y eliminando con éxito las características hasta que quede el número deseado.

Esto se logra ajustando el algoritmo de aprendizaje de máquina utilizado en el núcleo del modelo, clasificando las características por su importancia, descartando las características menos importantes y volviendo a ajustar el modelo. Este proceso se repite hasta que quede un número determinado de características.

Para más información sobre RFE, vea el tutorial:

El problema de la selección de características de la envoltura puede enmarcarse como un problema de optimización. Es decir, encontrar un subconjunto de características de entrada que resulten en el mejor rendimiento del modelo.

El RFE es un enfoque para resolver este problema sistemáticamente, aunque puede estar limitado por un gran número de características.

Un enfoque alternativo sería utilizar un algoritmo de optimización estocástica, como un algoritmo de escalada de colinas estocástico, cuando el número de características es muy grande. Cuando el número de características es relativamente pequeño, puede ser posible enumerar todos los posibles subconjuntos de características.

  • Pocas variables de entrada: Enumere todos los subconjuntos posibles de características.
  • Muchas características de entrada: Algoritmo de optimización estocástica para encontrar buenos subconjuntos de características.

Ahora que estamos familiarizados con la idea de que la selección de características puede ser explorada como un problema de optimización, veamos cómo podríamos enumerar todos los posibles subconjuntos de características.

Enumerar todos los subconjuntos de características

Cuando el número de variables de entrada es relativamente pequeño y la evaluación del modelo es relativamente rápida, entonces puede ser posible enumerar todos los posibles subconjuntos de variables de entrada.

Esto significa evaluar el rendimiento de un modelo utilizando un arnés de prueba dado cada posible grupo único de variables de entrada.

Exploraremos cómo hacer esto con un ejemplo trabajado.

Primero, definamos un pequeño conjunto de datos de clasificación binaria con pocas características de entrada. Podemos usar la función make_classification() para definir un conjunto de datos con cinco variables de entrada, dos de las cuales son informativas, y 1.000 filas.

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

Ejecutando el ejemplo se crea el conjunto de datos y se confirma que tiene la forma deseada.

A continuación, podemos establecer una línea de base en el rendimiento utilizando un modelo evaluado en todo el conjunto de datos.

Usaremos un DecisionTreeClassifier como modelo porque su rendimiento es bastante sensible a la elección de las variables de entrada.

Evaluaremos el modelo utilizando buenas prácticas, como la validación cruzada estratificada con tres repeticiones y 10 pliegues.

El ejemplo completo figura a continuación.

Al ejecutar el ejemplo se evalúa el árbol de decisiones en todo el conjunto de datos y se informa de la exactitud de la clasificación de la media y la desviación estándar.

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 alcanzó una precisión de alrededor del 80,5 por ciento.

A continuación, podemos intentar mejorar el rendimiento del modelo utilizando un subconjunto de las características de entrada.

Primero, debemos elegir una representación para enumerar.

En este caso, enumeraremos una lista de valores booleanos, con un valor para cada característica de entrada: Verdadero si se va a utilizar la función y Falso si la característica no se va a utilizar como entrada.

Recomendado:  Imágenes del infrarrojo cercano para tumores profundos en el tejido, como los GIST

Por ejemplo, con las cinco características de entrada la secuencia[[Verdad, Verdad, Verdad, Verdad, Verdad]utilizaría todas las funciones de entrada, y[[Verdadero, Falso, Falso, Falso, Falso]sólo utilizaría la primera función de entrada como entrada.

Podemos enumerar todas las secuencias de valores booleanos con el longitud=5 usando la función product() Python. Debemos especificar los valores válidos[[Verdadero, falso]y el número de pasos en la secuencia, que es igual al número de variables de entrada.

La función devuelve un iterable que podemos enumerar directamente para cada secuencia.

Para una determinada secuencia de valores booleanos, podemos enumerarla y transformarla en una secuencia de índices de columna para cada Verdadero en la secuencia.

Si la secuencia no tiene índices de columna (en el caso de todas las Falso valores), entonces podemos saltarnos esa secuencia.

Podemos usar los índices de las columnas para elegir las columnas del conjunto de datos.

Y este subconjunto del conjunto de datos puede entonces ser evaluado como lo hicimos antes.

Si la precisión del modelo es mejor que la mejor secuencia encontrada hasta ahora, podemos almacenarla.

Y eso es todo.

A continuación se presenta el ejemplo completo de selección de características enumerando todos los subconjuntos de características posibles.

La ejecución del ejemplo informa de la precisión de la clasificación media del modelo para cada subconjunto de características consideradas. El mejor subconjunto se informa al final de la ejecució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, podemos ver que el mejor subconjunto de características involucraba características en los índices [2, 3, 4] que resultó en una precisión de clasificación media de alrededor del 83,0 por ciento, que es mejor que el resultado reportado anteriormente usando todas las características de entrada.

Ahora que sabemos cómo enumerar todos los posibles subconjuntos de características, veamos cómo podríamos usar un algoritmo de optimización estocástica para elegir un subconjunto de características.

Optimizar subconjuntos de características

Podemos aplicar un algoritmo de optimización estocástica al espacio de búsqueda de subconjuntos de características de entrada.

Recomendado:  Cómo el aprendizaje automático está revelando los misterios de las proteínas

En primer lugar, definamos un problema mayor que tiene muchas más características, haciendo que la evaluación del modelo sea demasiado lenta y el espacio de búsqueda demasiado grande para enumerar todos los subconjuntos.

Definiremos un problema de clasificación con 10.000 filas y 500 características de entrada, 10 de las cuales son relevantes y las 490 restantes son redundantes.

Ejecutando el ejemplo se crea el conjunto de datos y se confirma que tiene la forma deseada.

Podemos establecer una línea de base en el rendimiento evaluando un modelo en el conjunto de datos con todas las características de entrada.

Debido a que el conjunto de datos es grande y el modelo es lento de evaluar, modificaremos la evaluación del modelo para usar una validación cruzada triple, por ejemplo, menos pliegues y sin repeticiones.

El ejemplo completo figura a continuación.

Al ejecutar el ejemplo se evalúa el árbol de decisiones en todo el conjunto de datos y se informa de la exactitud de la clasificación de la media y la desviación estándar.

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 alcanzó una precisión de alrededor del 91,3 por ciento.

Esto proporciona una línea de base que esperaríamos que superara el uso de la selección de características.

Usaremos un simple algoritmo de escalada de colinas estocástico como algoritmo de optimización.

Primero, debemos definir la función objetivo. Tomará el conjunto de datos y un subconjunto de características para utilizar como entrada y devolver una precisión estimada del modelo de 0 (peor) a 1 (mejor). Es un problema de optimización de la maximización.

Esta función objetiva es simplemente la decodificación de la secuencia y el paso de evaluación del modelo de la sección anterior.

El objetivo() La función que figura a continuación implementa esto y devuelve tanto la puntuación como el subconjunto decodificado de las columnas utilizadas para la presentación de informes útiles.

También necesitamos una función que pueda dar un paso en el espacio de búsqueda.

Dada una solución existente, debe modificarla y devolver una nueva solución en estrecha proximidad. En este caso, lo conseguiremos volteando aleatoriamente la inclusión/exclusión de columnas en la subsiguiente.

Cada posición de la secuencia se considerará de forma independiente y se volteará probabilísticamente cuando la probabilidad de volteo sea un hiperparámetro.

El mutar() La función siguiente implementa esto dada una solución candidata (secuencia de booleanos) y un hiperparámetro de mutación, creando y devolviendo una solución modificada (un paso en el espacio de búsqueda).

Cuanto más grande es el p_mutar (en el rango de 0 a 1), cuanto mayor sea el paso en el espacio de búsqueda.

Ahora podemos implementar el algoritmo de escalada de colinas.

La solución inicial es una secuencia generada al azar, que luego se evalúa.

Luego hacemos un bucle de un número fijo de iteraciones, creando versiones mutadas de la solución actual, evaluándolas y guardándolas si la puntuación es mejor.

El escalada de colinas() La función que se indica a continuación implementa esto, tomando como argumentos el conjunto de datos, la función objetiva y los hiperparámetros, y devuelve el mejor subconjunto de columnas del conjunto de datos y el rendimiento estimado del modelo.

Recomendado:  Aprendizaje automático para hacer frente al cambio climático | de Salvatore Raieli | septiembre de 2022

Podemos llamar a esta función y pasar nuestro conjunto de datos sintéticos para realizar la optimización para la selección de características.

En este caso, ejecutaremos el algoritmo durante 100 iteraciones y haremos unos cinco giros a la secuencia de una mutación dada, lo cual es bastante conservador.

Al final de la ejecución, convertiremos la secuencia booleana en índices de columnas (para que podamos ajustar un modelo final si queremos) y reportaremos el rendimiento de la mejor subsecuente.

Acoplando todo esto, el ejemplo completo se enumera a continuación.

La ejecución del ejemplo informa de la precisión de la clasificación media del modelo para cada subconjunto de características consideradas. El mejor subconjunto se informa al final de la ejecució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, podemos ver que el mejor rendimiento se logró con un subconjunto de 239 características y una precisión de clasificación de aproximadamente 91,8 por ciento.

Esto es mejor que un modelo evaluado en todas las características de entrada.

Aunque el resultado es mejor, sabemos que podemos hacerlo mucho mejor, tal vez con el ajuste de los hiperparámetros del algoritmo de optimización o tal vez utilizando un algoritmo de optimización alternativo.

Más lecturas

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

Tutoriales

APIs

Resumen

En este tutorial, descubriste cómo utilizar los algoritmos de optimización para la selección de características en el aprendizaje automático.

Específicamente, aprendiste:

  • El problema de la selección de características puede definirse en términos generales como un problema de optimización.
  • Cómo enumerar todos los posibles subconjuntos de características de entrada para un conjunto de datos.
  • Cómo aplicar la optimización estocástica para seleccionar un subconjunto óptimo de características de entrada.

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