La selección de funciones, el proceso de encontrar y seleccionar las funciones más útiles en un conjunto de datos, es un paso crucial en el proceso de aprendizaje automático. Las características innecesarias disminuyen la velocidad de aprendizaje, disminuyen la interpretabilidad del modelo y, lo más importante, disminuyen el rendimiento de la generalización en el conjunto de pruebas. Por tanto, el objetivo es la limpieza de datos.
Contenido
PalancaPipeline para la limpieza de datos
El FeatureSelector incluye algunos de los métodos de selección de características más comunes:
- Características con un alto porcentaje de valores faltantes
- Características colineales (altamente correlacionadas)
- Características sin importancia en un modelo de árbol
- Características de poca importancia
- Características con un único valor único
En este artículo, explicaremos el uso de FeatureSelector en un conjunto de datos de aprendizaje automático de ejemplo. Veremos cómo esto nos permite implementar rápidamente estos métodos, lo que permite un flujo de trabajo más eficiente.
El Selector de características ofrece cinco métodos para encontrar características para eliminar. Podemos acceder a las funciones identificadas y eliminarlas manualmente de los datos, o usar la función de eliminación en el selector de funciones.
Aquí revisaremos cada uno de los métodos de identificación y también mostraremos cómo se pueden realizar los 5 al mismo tiempo. FeatureSelector también tiene varias capacidades de trazado, ya que la inspección visual de los datos es una parte crucial del aprendizaje automático.
Valores faltantes
La primera forma de encontrar características para eliminar es simple: busque características con una fracción de valores faltantes por encima de un umbral específico. La siguiente llamada identifica características con más de 60 % de valores faltantes (la salida está en negrita).
fs.identify_missing(missing_threshold = 0.6)17 características con más de 0,60 valores faltantes.
Podemos ver la fracción de valores faltantes en cada columna de un dataframe:
fs.missing_stats.head()
Para ver las funciones marcadas para su eliminación, accedemos al atributo ops del FeatureSelector, un dictado de Python con funciones enumeradas en los valores.
características_faltantes = fs.ops['falta']
características_faltantes[:5]['OWN_CAR_AGE',
'AÑOS_CONSTRUCCIÓN_PROMEDIO',
'COMMONAREA_AVG',
'PISOSMIN_PROMEDIO',
'LIVINGAPARTMENTS_AVG']
Finalmente, tenemos un gráfico de la distribución de valores faltantes a través de características:
fs.plot_missing()
Columnas colineales
Las características colineales son características que están altamente correlacionadas entre sí. En el aprendizaje automático, esto conduce a un menor rendimiento de generalización en el conjunto de pruebas debido a la alta varianza y la menor interpretabilidad del modelo.
El método de identificación_colineal encuentra características colineales dado un valor de coeficiente de correlación especificado. Para cada par de características correlacionadas, identifica una de las características a eliminar (ya que solo necesitamos eliminar una):
fs.identify_collinear(correlation_threshold = 0.98)21 características con una magnitud de correlación superior a 0,98.
Una visualización ordenada que podemos hacer con las correlaciones es un mapa de calor. Esto muestra todas las características que tienen al menos una correlación por encima del umbral:
fs.plot_collinear()
Como antes, podemos acceder a la lista completa de funciones correlacionadas que se eliminarán o ver pares de funciones altamente correlacionadas en una base de datos.
# lista de características colineales para eliminar
collinear_features = fs.ops['colineal']Marco de datos # de características colineales
fs.record_collinear.head()
Si queremos investigar nuestro conjunto de datos, también podemos trazar todas las correlaciones en los datos pasando plot_all = True a la llamada:
Columnas de importancia cero
Los dos métodos anteriores se pueden aplicar a cualquier conjunto de datos estructurados y son deterministas: los resultados serán los mismos cada vez para un umbral determinado. El siguiente método está diseñado solo para problemas de aprendizaje automático supervisado en los que tenemos etiquetas para entrenar un modelo y no es determinista. La función identificar_cero_importancia encuentra características que no tienen importancia de acuerdo con un modelo de aprendizaje automático de aumento de gradiente (GBM).
Con modelos de aprendizaje automático basados en árboles, como un conjunto de refuerzo, podemos encontrar la importancia de las funciones. El valor absoluto de importancia no es tan importante como los valores relativos, que podemos usar para determinar las características más relevantes para una tarea. También podemos usar la importancia de las funciones para la selección de funciones eliminando las funciones sin importancia. En un modelo basado en árboles, las características sin importancia no se utilizan para dividir los nodos, por lo que podemos eliminarlos sin afectar el rendimiento del modelo.
El FeatureSelector encuentra la importancia de las características utilizando la máquina de mejora de gradientes de la biblioteca LightGBM. La importancia de las funciones se promedia sobre 10 ejecuciones de entrenamiento de GBM para reducir la variación. Además, el modelo se entrena con una parada anticipada con un conjunto de validación (hay una opción para desactivarlo) para evitar el sobreajuste de los datos de entrenamiento.
El siguiente código llama al método y extrae las características de importancia cero:
# Pase en los parámetros apropiados
fs.identify_zero_importance(tarea = 'clasificación',
eval_metric = 'auc',
n_iteraciones = 10,
parada_temprana = Verdadero)Lista # de características de importancia cero
zero_importance_features = fs.ops['zero_importance']63 funciones sin importancia después de la codificación one-hot.
Los parámetros que pasamos son:
tarea
: ya sea “clasificación” o “ regresión » correspondiente a nuestro problemaeval_metric
: métrica que se utilizará para el apagado anticipado (inútil si el apagado anticipado está deshabilitado)n_iteraciones
: número de ejecuciones de entrenamiento para promediar la importancia de las característicasparada_temprana
: si se debe utilizar o no la parada anticipada para el entrenamiento del modelo
Esta vez tenemos dos parcelas con plot_feature_importances:
# grafica la importancia de las características
fs.plot_feature_importances(umbral=0.99, plot_n=12)124 características requeridas para 0.99 de importancia acumulada
En la parte superior tenemos las características más importantes de plot_n (graficadas en términos de importancia normalizada donde el total es igual a 1).
En la parte inferior tenemos la importancia acumulada versus la cantidad de características. La línea vertical se traza en el umbral de importancia acumulada, en este caso 99 %.
Es bueno recordar dos notas para los métodos basados en la importancia:
- El entrenamiento de la máquina de refuerzo de gradiente es estocástico, lo que significa que la importancia de la característica cambiará cada vez que se ejecute el modelo.
Esto no debería tener un impacto importante (las características más importantes no se convertirán repentinamente en las menos importantes), pero cambiará el orden de algunas características. Esto también puede afectar la cantidad de características de importancia cero identificadas. ¡No se sorprenda si la importancia de las funciones cambia cada vez!
- Para entrenar el modelo de aprendizaje automático, las características primero se codifican en caliente. Esto significa que algunas de las características identificadas con una importancia de 0 pueden ser características codificadas en caliente agregadas durante el modelado.
Columnas de poca importancia
El siguiente método se basa en la función de importancia cero, utilizando las importancias de las características del modelo para una selección adicional. La función identificador_baja_importancia encuentra las características menos importantes que no contribuyen a una importancia total especificada.
Por ejemplo, la siguiente llamada encuentra las características menos importantes que no son necesarias para alcanzar 99 % de importancia total:
fs.identificar_baja_importancia(importancia_acumulativa = 0.99)Se requieren 123 características para una importancia acumulada de 0,99 después de una codificación en caliente.
116 características no contribuyen a la importancia acumulada de 0,99.
Según el gráfico de importancia acumulativa y esta información, la máquina de aumento de gradiente considera muchas características irrelevantes para el aprendizaje. Nuevamente, los resultados de este método cambiarán con cada entrenamiento.
Para mostrar todas las características importantes en un marco de datos:
fs.feature_importants.head(10)
El método de baja importancia toma prestado de uno de los métodos de uso del análisis de componentes principales (PCA), donde es común mantener solo el PC necesario para retener un cierto porcentaje de la varianza (por ejemplo, 95 %). El porcentaje de importancia total tenido en cuenta se basa en la misma idea.
Los métodos basados en la importancia de las características sólo son realmente aplicables si vamos a utilizar un modelo basado en una árbol para hacer predicciones. Además de ser estocásticos, los métodos basados en la importancia son un enfoque de caja negra en el que realmente no sabemos por qué el modelo considera que las características son irrelevantes. Si usa estos métodos, ejecútelos varias veces para ver cómo cambian los resultados, y quizás cree múltiples conjuntos de datos con diferentes parámetros para probar.
Columnas de valor único
El último método es bastante básico: busque todas las columnas que tengan un único valor único. Una función con un solo valor único no puede ser útil para el aprendizaje automático porque esta función tiene una variación cero. Por ejemplo, un modelo de árbol nunca puede dividir una característica con un solo valor (ya que no hay grupos en los que dividir las observaciones).
No hay configuraciones para seleccionar aquí, a diferencia de otros métodos:
fs.identify_single_unique()4 características con un único valor único.
Podemos trazar un histograma del número de valores únicos en cada categoría:
fs.plot_unique()
Un punto a recordar es que los NaN se eliminan antes de calcular los valores únicos en Pandas de forma predeterminada.
Quitar columnas
Una vez que identificamos las características a eliminar, tenemos dos opciones para eliminarlas. Todas las funciones que se eliminarán se almacenan en el dictado de operaciones de FeatureSelector y podemos usar las listas para eliminar funciones manualmente. Otra opción es utilizar la función de eliminación integrada.
Para este método, pasamos los métodos a usar para eliminar características. Si queremos usar todos los métodos implementados, simplemente pasamos métodos = 'todos'.
# Eliminar las características de todos los métodos (devuelve un df)
train_removed = fs.remove(métodos = 'todos')Se han ejecutado los métodos ['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance']
Se eliminaron 140 características.
Este método devuelve un marco de datos con las características eliminadas. Para eliminar también funciones codificadas en caliente que se crean durante el aprendizaje automático:
train_removed_all = fs.remove(métodos = 'todos', keep_one_hot=False)Se eliminaron 187 funciones, incluidas las funciones one-hot.
¡Podría ser una buena idea comprobar qué funciones se eliminarán antes de continuar! ¡El conjunto de datos original se almacena en el atributo de datos del FeatureSelector como copia de seguridad!
Pipeline de limpieza de datos
En lugar de usar los métodos individualmente, podemos usarlos todos conidentificar_todos. Esto toma un diccionario de parámetros para cada método:
fs.identify_all(selection_params = {'missing_threshold': 0.6,
'correlación_umbral': 0.98,
'tarea': 'clasificar',
'eval_metric': 'auc',
'importancia_acumulativa': 0.99})151 características totales de 255 identificadas para su eliminación después de la codificación one-hot.
Tenga en cuenta que el número total de funciones cambiará a medida que volvamos a ejecutar la plantilla. A continuación, se puede llamar a la función de eliminación para eliminar estas funciones.
La clase Feature Selector implementa varias operaciones comunes para eliminar funciones antes de entrenar un modelo de aprendizaje automático. Ofrece funciones para identificar características para eliminar, así como visualizaciones. Los métodos se pueden ejecutar individualmente o todos a la vez para flujos de trabajo eficientes.
Los métodos faltante, colineal y único_único son deterministas, mientras que los métodos basados en la importancia de las características cambian con cada ejecución. La selección de funciones, al igual que el campo del aprendizaje automático, es en gran parte empírica y requiere probar múltiples combinaciones para encontrar la respuesta óptima. Se recomienda probar varias configuraciones en una canalización, y el selector de funciones proporciona una forma de evaluar rápidamente la configuración de selección de funciones.