Logotipo de Zephyrnet

Métodos alternativos de selección de funciones en el aprendizaje automático

Fecha:

By Soledad Galli, PhD, científico principal de datos e instructor de aprendizaje automático

Métodos alternativos de selección de funciones en el aprendizaje automático
Imagen de Gerd Altmann Desde Pixabay

 

Probablemente haya realizado sus búsquedas en línea sobre "Selección de características" y probablemente haya encontrado toneladas de artículos que describen los tres términos generales que agrupan las metodologías de selección, es decir, "Métodos de filtro", "Métodos de envoltura" y "Métodos integrados".

En "Métodos de filtro", encontramos pruebas estadísticas que seleccionan características en función de sus distribuciones. Estos métodos son computacionalmente muy rápidos, pero en la práctica no brindan buenas características para nuestros modelos. Además, cuando tenemos grandes conjuntos de datos, los valores de p para las pruebas estadísticas tienden a ser muy pequeños, destacando como pequeñas diferencias significativas en las distribuciones, que pueden no ser realmente importantes.

La categoría "Métodos de envoltorio" incluye algoritmos codiciosos que probarán todas las combinaciones de características posibles basadas en un paso adelante, un paso atrás o una búsqueda exhaustiva. Para cada combinación de funciones, estos métodos entrenarán un modelo de aprendizaje automático, generalmente con validación cruzada, y determinarán su rendimiento. Por lo tanto, los métodos de envoltura son muy costosos desde el punto de vista computacional y, a menudo, imposibles de llevar a cabo.

Los "Métodos integrados", por otro lado, entrenan un solo modelo de aprendizaje automático y seleccionan funciones en función de la importancia de la función devuelta por ese modelo. Tienden a funcionar muy bien en la práctica y son más rápidos de calcular. La desventaja es que no podemos derivar valores de importancia de características de todos los modelos de aprendizaje automático. Por ejemplo, no podemos derivar valores de importancia de los vecinos más cercanos. Además, la colinealidad afectará los valores de los coeficientes devueltos por los modelos lineales, o los valores de importancia devueltos por los algoritmos basados ​​en árboles de decisión, lo que puede enmascarar su importancia real. Finalmente, los algoritmos basados ​​en árboles de decisión pueden no funcionar bien en espacios de características muy grandes y, por lo tanto, los valores de importancia pueden no ser confiables.

Los métodos de filtro son difíciles de interpretar y no se usan comúnmente en la práctica; Los métodos de envoltorio son computacionalmente costosos y, a menudo, imposibles de llevar a cabo; y los métodos integrados no son adecuados en todos los escenarios ni para todos los modelos de aprendizaje automático. ¿Qué hacemos entonces? ¿De qué otra manera podemos seleccionar características predictivas?

Afortunadamente, hay más formas de seleccionar funciones para el aprendizaje supervisado. Y cubriré tres de ellos en detalle a lo largo de esta publicación de blog. Para obtener más métodos de selección de funciones, consulte el curso en línea Selección de funciones para el aprendizaje automático.

Métodos alternativos de selección de características

 
En este artículo, describiré tres algoritmos que seleccionan características en función de su impacto en el rendimiento del modelo. A menudo se los denomina "métodos híbridos" porque comparten características de los métodos Wrapper e Embedded. Algunos de estos métodos se basan en el entrenamiento de más de un modelo de aprendizaje automático, un poco como los métodos de envoltura. Algunos procedimientos de selección se basan en la importancia de las funciones, como los métodos integrados.

Pero aparte de la nomenclatura, estos métodos se han utilizado con éxito en la industria o en competencias de ciencia de datos, y brindan formas adicionales de encontrar las características más predictivas para un determinado modelo de aprendizaje automático.

A lo largo del artículo, expondré la lógica y el procedimiento de algunos de estos métodos de selección de funciones y mostraré cómo podemos implementarlos en Python usando la biblioteca de código abierto Feature-engine. Empecemos.

Discutiremos la selección por:

  • Barajar características
  • Rendimiento de funciones
  • Desempeño medio objetivo

Barajar características

 
La importancia de la función de barajar o permutación consiste en asignar importancia a una función en función de la disminución en la puntuación de rendimiento de un modelo cuando los valores de una sola función se barajan aleatoriamente. Mezclar el orden de los valores de las características (en las filas del conjunto de datos) altera la relación original entre la característica y el objetivo, por lo que la caída en la puntuación de rendimiento del modelo es indicativa de cuánto depende el modelo de esa característica.

Métodos alternativos de selección de funciones en el aprendizaje automático

El procedimiento funciona de la siguiente manera:

  1. Entrena un modelo de aprendizaje automático y determina su rendimiento.
  2. Baraja el orden de los valores de 1 característica.
  3. Hace predicciones con el modelo entrenado en el paso 1 y determina el rendimiento.
  4. Si el rendimiento cae por debajo de un umbral, mantiene la función; de lo contrario, la elimina.
  5. Se repite desde el paso 2 hasta que se examinan todas las características.

La selección por barajar características tiene varias ventajas. Primero, necesitamos entrenar solo un modelo de aprendizaje automático. La importancia se asigna posteriormente mezclando los valores de las características y haciendo predicciones con ese modelo. En segundo lugar, podemos seleccionar funciones para cualquier modelo de aprendizaje automático supervisado de nuestra elección. En tercer lugar, podemos implementar este procedimiento de selección utilizando código abierto y veremos cómo hacerlo en los próximos párrafos.

 
Pros:

  • Solo entrena un modelo de aprendizaje automático, por lo que es rápido.
  • Es adecuado para cualquier modelo de aprendizaje automático supervisado.
  • Está disponible en Feature-engine, una biblioteca de código abierto de Python.

En el lado negativo, si dos características están correlacionadas, cuando se mezcla una de las características, el modelo aún tendrá acceso a la información a través de su variable correlacionada. Esto puede resultar en un valor de importancia más bajo para ambas características, aunque podrían se Importante. Además, para seleccionar funciones, debemos definir un umbral de importancia arbitrario por debajo del cual se eliminarán las funciones. Con valores de umbral más altos, se seleccionarán menos funciones. Finalmente, mezclar características introduce un elemento de aleatoriedad, por lo que para características con importancia límite, es decir, valores de importancia cercanos al umbral, diferentes ejecuciones del algoritmo pueden devolver diferentes subconjuntos de características.

 
consideraciones:

  • Las correlaciones pueden afectar la interpretación de la importancia de la característica.
  • El usuario necesita definir un umbral arbitrario.
  • El elemento de aleatoriedad hace que el procedimiento de selección no sea determinista.

Con esto en mente, la selección de características mediante la combinación aleatoria de características es un buen método de selección de características que se enfoca en resaltar aquellas variables que afectan directamente el rendimiento del modelo. Podemos derivar manualmente el importancia de la permutación con Scikit-learn, y luego seleccionar aquellas variables que muestren una importancia por encima de cierto umbral. O podemos automatizar todo el procedimiento con Feature-engine.

 
Implementación de Python

Veamos cómo realizar la selección por combinación de características con Feature-engine. Usaremos el conjunto de datos de diabetes que viene con Scikit-learn. Primero, cargamos los datos:

import pandas as pd from sklearn.datasets import load_diabetes from sklearn.linear_model import LinearRegression from feature_engine.selection import SelectByShuffling # load dataset diabetes_X, diabetes_y = load_diabetes(return_X_y=True) X = pd.DataFrame(diabetes_X) y = pd.DataFrame(diabetes_y )

Configuramos el modelo de aprendizaje automático que nos interesa:

# inicializar el estimador de regresión lineal linear_model = LinearRegression()

Seleccionaremos funciones en función de la caída en la r2 usando validación cruzada de 3 veces:

# inicializar el selector de características tr = SelectByShuffling(estimator=linear_model, scoring="r2", cv=3)

Con el método fit() el transformador encuentra las variables importantes —aquellas que causan una caída en r2 cuando se baraja. De forma predeterminada, las funciones se seleccionarán si la caída del rendimiento es mayor que la caída media causada por todas las funciones.

# ajustar transformador tr.fit(X, y)

Con el método transform() eliminamos las características no seleccionadas del conjunto de datos:

Xt = tr.transformar(X)

Podemos inspeccionar la importancia de la característica individual a través de uno de los atributos del transformador:

tr.performance_drifts_ {0: -0.02368121940502793, 1: ,0.017909161264480666, 2: ,0.18565460365508413, 3: ,0.07655405817715671, 4: ,0.4327180164470878, 5: ,0.16394693824418372, 6: -0.012876023845921625, 7: ,0.01048781540981647, 8: ,0.3921465005640224, 9: -0.01427065640301245}

Podemos acceder a los nombres de las características que serán eliminadas en otro atributo:

tr.features_to_drop_ [0, 1, 3, 6, 7, 9]

Eso es todo, sencillo. Tenemos un marco de datos reducido en Xt.

Rendimiento de funciones

 
Una forma directa de determinar la importancia de una función es entrenar un modelo de aprendizaje automático utilizando únicamente esa función. En este caso, la “importancia” de la función viene dada por la puntuación de rendimiento del modelo. En otras palabras, qué tan bien un modelo entrenado en una sola función predice el objetivo. Las métricas de bajo rendimiento hablan de características débiles o no predictivas.

El procedimiento funciona de la siguiente manera:

  1. Entrena un modelo de aprendizaje automático para cada función.
  2. Para cada modelo, hace predicciones y determina el rendimiento del modelo.
  3. Selecciona características con métricas de rendimiento por encima de un umbral.

En este procedimiento de selección, entrenamos un modelo de aprendizaje automático por función. El modelo utiliza una característica individual para predecir la variable objetivo. Luego, determinamos el rendimiento del modelo, generalmente con validación cruzada, y seleccionamos características cuyo rendimiento se encuentra por encima de cierto umbral.

Por un lado, este método es más costoso computacionalmente porque entrenaríamos tantos modelos como características tengamos en nuestro conjunto de datos. Por otro lado, los modelos entrenados en una sola función tienden a entrenarse con bastante rapidez.

Con este método, podemos seleccionar características para cualquier modelo que queramos, porque la importancia la da la métrica de rendimiento. En el lado negativo, debemos proporcionar un umbral arbitrario para la selección de funciones. Con valores de umbral más altos, seleccionamos grupos de funciones más pequeños. Algunos valores de umbral pueden ser bastante intuitivos. Por ejemplo, si la métrica de rendimiento es roc-auc, podemos seleccionar funciones cuyo rendimiento sea superior a 0.5. Para otras métricas, como la precisión, lo que determina un buen valor no está tan claro.

 
Pros:

  • Es adecuado para cualquier modelo de aprendizaje automático supervisado.
  • Explora características individualmente, evitando así problemas de correlación.
  • Está disponible en Feature-engine, un proyecto de código abierto de Python.

 
consideraciones:

  • Entrenar un modelo por característica puede ser costoso desde el punto de vista computacional.
  • El usuario necesita definir un umbral arbitrario.
  • No detecta interacciones de funciones.

Podemos implementar la selección por rendimiento de función única utilizando Feature-engine.

 
Implementación de Python

Carguemos el conjunto de datos de diabetes de Scikit-learn:

import pandas as pd from sklearn.datasets import load_diabetes from sklearn.linear_model import LinearRegression from feature_engine.selection import SelectBySingleFeaturePerformance # cargar dataset diabetes_X, diabetes_y = load_diabetes(return_X_y=True) X = pd.DataFrame(diabetes_X) y = pd.DataFrame(diabetes_y )

Queremos seleccionar características cuya r2 > 0.01, utilizando una regresión lineal y utilizando una validación cruzada de 3 veces.

# inicializar el selector de funciones sel = SelectBySingleFeaturePerformance(estimator=LinearRegression(), scoring="r2", cv=3, threshold=0.01)

El transformador utiliza el método fit() para ajustar 1 modelo por función, determinar el rendimiento y seleccionar las funciones importantes.

# ajustar transformador sel.fit(X, y)

Podemos explorar las funciones que se eliminarán:

sel.features_to_drop_ [1]

También podemos examinar el rendimiento de cada característica individual:

sel.feature_performance_ {0: ,0.029231969375784466, 1: -0.003738551760264386, 2: ,0.336620809987693, 3: ,0.19219056680145055, 4: ,0.037115559827549806, 5: ,0.017854228256932614, 6: ,0.15153886177526896, 7: ,0.17721609966501747, 8: ,0.3149462084418813, 9: ,0.13876602125792703}

Con el método transform() eliminamos las características del conjunto de datos:

# soltar variables Xt = sel.transform(X)

Y eso es. Ahora tenemos un conjunto de datos reducido.

Desempeño medio objetivo

 
El procedimiento de selección que discutiré ahora fue presentado en la competencia de ciencia de datos KDD 2009 por Miller y colaboradores. Los autores no le atribuyen ningún nombre a la técnica, pero dado que utiliza el valor objetivo medio por grupo de observaciones como proxy para las predicciones, me gusta llamar a esta técnica "Selección por rendimiento medio objetivo".

Esta metodología de selección también asigna un valor de “importancia” a cada característica. Este valor de importancia se deriva de una métrica de rendimiento. Curiosamente, el modelo no entrena ningún modelo de aprendizaje automático. En su lugar, utiliza un proxy mucho más simple como predicción.

En pocas palabras, el procedimiento utiliza el valor objetivo medio por categoría o por intervalo (si la variable es continua) como proxy para la predicción. Con esta predicción, deriva una métrica de rendimiento, como r2, precisión o cualquier otra métrica que evalúe una predicción contra la verdad. 

¿Cómo funciona exactamente este procedimiento?

Para variables categóricas:

  1. Divide el marco de datos en un conjunto de entrenamiento y otro de prueba.
  2. Para cada característica categórica, determina el valor objetivo medio por categoría (utilizando el conjunto de trenes).
  3. Reemplaza las categorías con los valores medios objetivo correspondientes en la prueba.
  4. Determina una métrica de rendimiento utilizando las funciones codificadas y el objetivo (en el conjunto de prueba).
  5. Selecciona características cuyo rendimiento está por encima de un umbral.

Para los valores categóricos, el valor medio del objetivo se determina para cada categoría en función del conjunto de entrenamiento. Luego, las categorías se reemplazan por los valores aprendidos en el conjunto de prueba y estos valores se usan para determinar la métrica de rendimiento.

Para variables continuas, el procedimiento es bastante similar:

  1. Divide el marco de datos en un conjunto de entrenamiento y otro de prueba.
  2. Para cada característica continua, ordena los valores en intervalos discretos y encuentra los límites usando el conjunto de trenes.
  3. Determina el valor objetivo medio por intervalo (utilizando un conjunto de entrenamiento).
  4. Ordena las variables en el conjunto de prueba en los intervalos identificados en 2.
  5. Reemplaza los intervalos con los valores medios objetivo correspondientes (usando el conjunto de prueba).
  6. Determina una métrica de rendimiento entre la función codificada y el objetivo (en el conjunto de prueba).
  7. Selecciona características cuyo rendimiento está por encima de un umbral.

Para las variables continuas, los autores primero separaron las observaciones en contenedores, un proceso también llamado discretización. Utilizaron cuantiles del 1%. Luego, determinaron el valor medio del objetivo en cada contenedor utilizando el conjunto de entrenamiento y evaluaron el rendimiento después de reemplazar los valores del contenedor con la media del objetivo en el conjunto de prueba.

Esta técnica de selección de características es muy simple; implica tomar la media de las respuestas para cada nivel (categoría o intervalo) y comparar estos valores con los valores objetivo para obtener una métrica de rendimiento. A pesar de su sencillez, tiene una serie de ventajas.

En primer lugar, no implica entrenar un modelo de aprendizaje automático, por lo que es increíblemente rápido de calcular. En segundo lugar, captura relaciones no lineales con el objetivo. En tercer lugar, es adecuado para variables categóricas, a diferencia de la gran mayoría de los algoritmos de selección existentes. Es resistente a los valores atípicos, ya que estos valores se asignarán a uno de los contenedores extremos. Según los autores, ofrece un rendimiento comparable entre variables categóricas y numéricas. Y es independiente del modelo. Las características seleccionadas por este procedimiento deberían, en teoría, ser adecuadas para cualquier modelo de aprendizaje automático.

 
Pros:

  • Es rápido porque no se entrena ningún modelo de aprendizaje automático.
  • Es adecuado para variables categóricas y numéricas por igual.
  • Es robusto a valores atípicos.
  • Captura las relaciones no lineales entre las entidades y el objetivo.
  • Es agnóstico del modelo.

Este método de selección también presenta algunas limitaciones. Primero, para las variables continuas, el usuario necesita definir un número arbitrario de intervalos en los que se ordenarán los valores. Esto plantea un problema para las variables sesgadas, donde la mayoría de los valores pueden caer en un solo contenedor. En segundo lugar, las variables categóricas con etiquetas poco frecuentes pueden dar lugar a resultados poco fiables, ya que hay pocas observaciones para esas categorías. Por lo tanto, el valor objetivo medio por categoría no será fiable. En casos extremos, si una categoría no estuviera presente en el conjunto de entrenamiento, no tendríamos un valor objetivo medio para usar como proxy para determinar el rendimiento.

 
consideraciones:

  • Necesita ajustar los números de intervalo para variables sesgadas.
  • Las categorías raras ofrecerán proxies de rendimiento poco confiables o harán que el método sea imposible de calcular.

Con estas consideraciones en mente, podemos seleccionar variables basadas en el rendimiento medio objetivo con Feature-engine.

 
Implementación de Python

Usaremos este método para seleccionar variables del conjunto de datos Titanic, que tiene una combinación de variables numéricas y categóricas. Al cargar los datos, haré un preprocesamiento para facilitar la demostración y luego los separaré en entrenamiento y prueba.

importar pandas como pd importar numpy como np de sklearn.model_selection importar train_test_split de sklearn.metrics importar roc_auc_score de feature_engine.selection importar SelectByTargetMeanPerformance # cargar datos datos = pd.read_csv('https://www.openml.org/data/get_csv/ 16826755/phpMYEkMl') # extraer la letra de la cabina data['cabin'] = data['cabin'].str[0] # reemplazar las cabinas poco frecuentes por N data['cabin'] = np.where(data['cabin'] .isin(['T', 'G']), 'N', data['cabin']) # cap valores máximos data['parch'] = np.where(data['parch']>3,3 ,data['parch']) data['sibsp'] = np.where(data['sibsp']>3,3,data['sibsp']) # convertir variables como objeto para tratar como datos categóricos[[' pclass','sibsp','parch']] = data[['pclass','sibsp','parch']].astype('O') # conjuntos separados de entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split( data.drop(['survived'], axis=1), data['survived'], test_size=0.3, random_state=0)

Seleccionaremos características basadas en el roc-auc utilizando una validación cruzada de 2 pliegues. Lo primero a destacar es que Feature-engine nos permite utilizar validación cruzada, lo que supone una mejora con respecto al método original descrito por los autores.

Feature-engine también nos permite decidir cómo determinaremos los intervalos para las variables numéricas. Podemos elegir intervalos de igual frecuencia o igual amplitud. Los autores utilizaron cuantiles del 1 %, lo que es adecuado para variables continuas con una distribución justa de valores, pero no suele ser adecuado para variables sesgadas. En esta demostración, separaremos las variables numéricas en intervalos de frecuencia iguales.

Finalmente, queremos seleccionar características para las cuales el roc-auc sea mayor que 0.6.

# Feature-engine automatiza la selección de # variables categóricas y numéricas sel = SelectByTargetMeanPerformance( variables=Ninguna, puntuación="roc_auc_score", umbral=0.6, bins=3, estrategia="equal_frequency", cv=2,# validación cruzada random_state= 1, # semilla para reproducibilidad)

Con el método fit() el transformador:

  • reemplaza las categorías por la media objetivo
  • clasifica las variables numéricas en contenedores de igual frecuencia
  • reemplaza los contenedores por la media objetivo
  • el uso de las variables codificadas de la media objetivo devuelve el roc-auc
  • selecciona entidades cuya roc-auc > 0.6
# encontrar características importantes sel.fit(X_train, y_train)

Podemos explorar el ROC-AUC para cada característica:

sel.feature_performance_ { 'pClass': ,0.6802934787230475, 'sexo': ,0.7491365252482871, 'edad': ,0.5345141148737766, 'sibsp': ,0.5720480307315783, 'pergamino': ,0.5243557188989476, 'tarifa': ,0.6600883312700917, 'cabaña': ,0.6379782658154696, 'embarcado': 0.5672382248783936}

Podemos encontrar las características que se eliminarán de los datos:

sel.features_to_drop_ ['edad', 'sibsp', 'parch', 'embarcado']

Con el método transform() eliminamos las características de los conjuntos de datos:

# eliminar funciones X_train = sel.transform(X_train) X_test = sel.transform(X_test)

Sencillo. Ahora tenemos versiones reducidas de los conjuntos de tren y prueba.

Terminando

 
Hemos llegado al final del artículo. Si llegaste hasta aquí, felicidades y gracias por leer. Si desea obtener más información sobre la selección de funciones, incluido el filtro, el envoltorio, el integrado y una serie de métodos híbridos, consulte el curso en línea. Selección de funciones para el aprendizaje automático.

Para obtener cursos adicionales sobre aprendizaje automático, incluida la ingeniería de funciones, la optimización de hiperparámetros y la implementación de modelos, visite nuestro página web del NDN Collective .

Para implementar métodos de selección Filter, Wrapper, Embedded e Hybrid en Python, consulte los módulos de selección en Scikit-learn, MLXtend y motor de funciones. Las bibliotecas vienen con una extensa documentación que lo ayudará a comprender la metodología subyacente.

 
Bio: Soledad Galli, PhD es el científico principal de datos e instructor de aprendizaje automático en Capacitar en datos. Sole imparte cursos intermedios y avanzados en ciencia de datos y aprendizaje automático. Trabajó en finanzas y seguros, recibió una Premio a los líderes en ciencia de datos en 2018 y fue seleccionado como “la voz de LinkedIn” en ciencia de datos y análisis en 2019. También es la creadora y mantenedora de la biblioteca de código abierto de Python motor de funciones. A Sole le apasiona compartir conocimientos y ayudar a otros a tener éxito en la ciencia de datos.

Fuente: https://www.kdnuggets.com/2021/12/alternative-feature-selection-methods-machine-learning.html

punto_img

Información más reciente

punto_img