¿Cómo seleccionar rápidamente variables importantes de un conjunto de datos muy grande?

9

Tengo un conjunto de datos con aproximadamente 2,000 variables binarias / 200,000 filas y estoy tratando de predecir una sola variable dependiente binaria. Mi objetivo principal en esta etapa no es obtener la precisión de la predicción, sino identificar cuáles de estas variables son predictores importantes. Me gustaría reducir el número de variables en mi modelo final a aproximadamente 100.

¿Existe una forma relativamente rápida de obtener las variables más importantes? randomForest parece estar tardando mucho tiempo.

No tengo que usar todas las 200,000 observaciones, por lo que el muestreo es una opción sobre la mesa.

DevX
fuente
Por predictores "importantes" en lugar de "precisos", ¿quiere decir que desea encontrar aquellos que son los mejores candidatos para explicar el resultado y ayudarlo a construir una teoría? Si es así, 100 variables explicativas es un número muy grande, prohibitivamente grande. La construcción de teorías y una explicación verdadera (en lugar de una mera predicción) probablemente requerirán que reduzca el número de X a 10 o 15.
rolando2
2
@ rolando2 En algunas aplicaciones, 100 no es grande en absoluto. Por ejemplo, la literatura sobre accesibilidad a banda ancha de alta velocidad apunta a aproximadamente 150 variables (de muchos cientos analizados) y todas son razonables: se relacionan con la facilidad de ingeniería (terreno, tipo de roca, clima, etc.), con la economía (SES, etc.), a la demografía, a la geometría de la infraestructura de transporte local, a la política (clima fiscal y comercial), etc. Creo que muchos modelos económicos de manera similar pueden incluir muchos cientos de variables teóricamente importantes.
whuber
@whuber - Estoy pensando en tu punto ... ¿Estarías de acuerdo en que se necesita un analista excepcionalmente dedicado, talentoso y experimentado para resolver los roles causales (en lugar de meramente predictivos) desempeñados por tantas variables?
rolando2
@rolando claro. ¡2000 variables es mucho trabajo!
whuber

Respuestas:

6

Puede comenzar con un filtro Univariante simple y usar validación cruzada para decidir qué variables mantener. La sbffunción en el caretpaquete para R es realmente útil. Puede leer más sobre esto aquí , comenzando en la página 19.

Zach
fuente
Gracias. Acabo de leer el periódico y parece un enfoque sólido. Sin embargo, me encuentro con algunos problemas de memoria en mi sistema de memoria de 64 bits y 4 MB.
DevX
1
@DevX: ¿Si tiene demasiados datos, podría intentar tomar una muestra y elegir variables basadas en la muestra?
Zach
13

Esto suena como un problema adecuado para el lazo y los amigos que hacen contracción y selección variable. Los Elementos del aprendizaje estadístico describen el lazo y la red elástica para la regresión y, lo que es más relevante para este problema, la regresión logística.

Los autores del libro han hecho una implementación eficiente de lazo y red elástica disponible como un paquete R llamado glmnet . Anteriormente he usado este paquete para el análisis de datos binarios con matrices de datos de aproximadamente 250,000 filas, aunque algunas columnas menos, pero en realidad ejecutando regresiones de todas las columnas contra todas las demás columnas. Si la matriz de datos también es escasa, la implementación también puede aprovechar eso, y creo que el método realmente puede funcionar para el conjunto de datos completo de los OP. Aquí hay algunos comentarios sobre el lazo:

  • Lasso logra la selección de variables mediante el uso de una función de penalización que no es uniforme (el -norm), que generalmente da como resultado estimaciones de parámetros con algunos parámetros que son exactamente iguales a 0. Cuántos parámetros distintos de cero se estiman y cuánto los parámetros distintos de cero se reducen, se determina mediante un parámetro de ajuste. La eficiencia de la implementación en glmnet depende en gran medida del hecho de que para una gran penalización solo unos pocos parámetros son diferentes de 0.1
  • La selección del parámetro de ajuste a menudo se realiza mediante validación cruzada, pero incluso sin el paso de validación cruzada, el método puede proporcionar una buena secuencia de variables seleccionadas indexadas por el parámetro de penalización.
  • La desventaja, para la selección de variables, es que el lazo puede ser inestable en la selección de variables, en particular, si están algo correlacionadas. La penalización neta elástica más general se inventó para mejorar esta inestabilidad, pero no resuelve el problema por completo. El lazo adaptable es otra idea para mejorar la selección de variables para el lazo.
  • La selección de estabilidad es un método general sugerido por Meinshausen y Bühlmann para lograr una mayor estabilidad de las variables seleccionadas con métodos como el lazo. Requiere varios ajustes a las submuestras del conjunto de datos y, como tal, es mucho más exigente computacionalmente.
  • Una forma razonable de pensar en el lazo es como un método para generar un conjunto unidimensional de modelos "buenos" que van desde un modelo de una sola variable a un modelo más complicado (que no incluye necesariamente todas las variables) parametrizado por el parámetro de penalización. Por el contrario, los filtros univariados producen una selección u orden de modelos buenos de una sola variable solamente.

Para Python hay una implementación en scikit-learn de métodos como lazo y red elástica.

NRH
fuente
Como noción adicional, si el número de predictores potenciales se dispara, como en GWAS, podría hacer algo como en este artículo para preseleccionar: El análisis de asociación de todo el genoma por lazo penalizó la regresión logística
Nick Sabbe
@NickSabbe, gracias por esta referencia. Es muy útil. En el contexto de GWAS, y probablemente también en otros contextos con una gran cantidad de predictores correlacionados, escuché que Sylvia Richardson recomienda la selección del modelo bayesiano basada, por ejemplo, en algunas comparaciones con la selección de estabilidad. Sin embargo, los cálculos de MCMC fueron realmente exigentes.
NRH
Creo que vale la pena enfatizar más el lazo adaptativo, ya que es fácil de implementar (casi solo dos llamadas en lugar de una glmneten R). Otra opción es Umbralizar el lazo, que también es bastante simple de implementar. Consulta la sección 2.9 de springer.com/gp/book/9783642201912 .
Benjamin Christoffersen
2

Podría hacer una prueba de asociación de regresión logística / chi-cuadrado para cada variable y solo retener aquellas que tengan un valor p menor que algún valor, digamos .2.

Cañada
fuente
44
Para tener una idea de cómo podría desarrollarse esta recomendación, considere un caso en el que hay 100 (por ejemplo) predictores importantes (altamente correlacionados con la variable dependiente) y el resto no tiene relación alguna con la variable dependiente y entre sí. Retener a aquellos con valores de p inferiores a 0.2 asegura que terminará con aproximadamente 100 + 0.2 * (2000-100) = 480 variables, de las cuales 380 no valen nada. Para conjuntos de datos pequeños, este enfoque a veces se usa como una pantalla inicial rápida, pero realmente no se puede considerar seriamente aquí.
whuber
Buen punto @whuber. Tendría que establecer su nivel alfa mucho más bajo para retener alrededor de 100, pero luego puede perderse las variables que solo pueden afectar el ajuste para otros. Sin embargo, pasar de 2000 a 480 podría ser más manejable para ejecutar algo como bosques aleatorios.
Glen
Tienes razón, hay mérito en ese examen, si funciona correctamente. 480 es una reducción, pero existen problemas adicionales por la posibilidad de altas correlaciones entre las 2000 variables originales. Esto puede causar que no se retengan ninguna de las 100 variables correctas, como se ilustra en algunas de las respuestas a una pregunta relacionada .
whuber