Limpieza de datos

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 la canalización del aprendizaje automático. Las características innecesarias disminuyen la velocidad de aprendizaje, disminuyen la interpretabilidad del modelo y, sobre todo, disminuyen el rendimiento de generalización en el conjunto de prueba. El objetivo es, por tanto, la limpieza de datos.

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, veremos 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í repasaremos cada uno de los métodos de identificación y también mostraremos cómo se pueden realizar los 5 al mismo tiempo. El 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()
limpieza de datos limpieza de datos

Columnas colineales

Las características colineales son características que están fuertemente correlacionadas entre sí. En el aprendizaje automático, esto conduce a una disminución del rendimiento de generalización en el conjunto de prueba 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 funciones correlacionadas, identifica una de las funciones 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()
limpieza de datos limpieza de datos

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()
limpieza de datos limpieza de datos

Si queremos investigar nuestro conjunto de datos, también podemos trazar todas las correlaciones en los datos pasando plot_all = True a la llamada:

limpieza de datos limpieza de datos

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 problema
  • eval_metric: métrica a usar para la terminación anticipada (inútil si la terminación anticipada está deshabilitada)
  • n_iteraciones : número de ejecuciones de entrenamiento para promediar la importancia de las características
  • parada_temprana: utilizar o no la parada anticipada para la formación de modelos

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
limpieza de datos limpieza de datos
limpieza de datos limpieza de datos

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 frente al número de características. La línea vertical se dibuja en el umbral de importancia acumulada, en este caso 99 %.

Vale la pena recordar dos notas para los métodos basados en la importancia:

  • El entrenamiento de la máquina de aumento de gradiente es estocástico, lo que significa que la importancia de las características cambiará cada vez que se ejecute el modelo.

Esto no debería tener un impacto importante (las funciones más importantes no se convertirán repentinamente en las menos importantes), pero cambiará el orden de algunas funciones. También puede afectar la cantidad de características sin importancia identificadas. ¡No se sorprenda si la importancia de las características 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 se requieren para llegar a 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 acumulada y esta información, la máquina de aumento de gradiente considera que muchas funciones son 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)
limpieza de datos limpieza de datos

El método de baja significación 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 la importancia total que se tiene en cuenta se basa en la misma idea.

Los métodos basados en la importancia de las características solo son realmente aplicables si vamos a utilizar un modelo basado en un á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 parámetros para seleccionar aquí, a diferencia de los 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()
limpieza de datos limpieza de datos

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.

¡Puede ser una buena idea verificar qué funciones se eliminarán antes de continuar! ¡El conjunto de datos original se almacena en el atributo de datos de 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.