Estoy trabajando en un conjunto de datos con más de 200,000 muestras y aproximadamente 50 características por muestra: 10 variables continuas y las otras ~ 40 son variables categóricas (países, idiomas, campos científicos, etc.). Para estas variables categóricas, tiene por ejemplo 150 países diferentes, 50 idiomas, 50 campos científicos, etc.
Hasta ahora mi enfoque es:
Para cada variable categórica con muchos valores posibles, tome solo la que tenga más de 10000 muestras que tome este valor. Esto se reduce a 5-10 categorías en lugar de 150.
Cree una variable ficticia para cada una categórica (si hay 10 países, agregue para cada muestra un vector binario de tamaño 10).
Alimente un clasificador de bosque aleatorio (validación cruzada de los parámetros, etc.) con estos datos.
Actualmente con este enfoque, solo logro obtener un 65% de precisión y siento que se puede hacer más. Especialmente no estoy satisfecho con mi 1) ya que siento que no debería eliminar arbitrariamente los "valores menos relevantes" de acuerdo con el número de muestra que tienen, porque estos valores menos representados podrían ser más discriminatorios. Por otro lado, mi RAM no puede permitirse agregar 500 columnas * 200000 filas a los datos manteniendo todos los valores posibles.
¿Tendrías alguna sugerencia para hacer frente a tantas variables categóricas?
Respuestas:
1) Los bosques aleatorios deberían poder manejar los valores categóricos de forma nativa, así que busque una implementación diferente para que no tenga que codificar todas esas características y usar toda su memoria.
2) El problema con las características categóricas de alta cardinalidad es que es fácil ajustarlas en exceso. Es posible que tenga suficientes datos para que esto no sea un problema, pero tenga cuidado.
3) Sugiero buscar en una selección aleatoria de características basadas en el bosque usando el método propuesto por Brieman o contrastes artificiales . El método de contrastes artificiales (ACE) es interesante porque compara la importancia de la característica con la importancia de una versión aleatoria de sí mismo que combate algunos de los problemas de alta cardinalidad. Hay un nuevo documento "Bosques aleatorios guiados por módulos" que podría ser interesante si tuviera muchas más características, ya que utiliza un método de selección de características que conoce grupos de características altamente correlacionadas.
4) Otra opción que alguna vez se usa es ajustar el algoritmo para que use las cajas sin bolsa para hacer la selección final de características después de ajustar las divisiones en las cajas en bolsa, lo que a veces ayuda a combatir el sobreajuste.
Hay una aplicación ace casi completa aquí y tengo un effichent más memoria aplicación / rf rápido que maneja las variables categóricas de forma nativa aquí ... la opción apoya la opción -evaloob 4 Yo estoy trabajando para añadir soporte para ACE y un par de otros rf basados en métodos de selección de funciones pero aún no se ha hecho
fuente
pandas.get_dummies
función). La implementación de H2O del bosque aleatorio me ha funcionado muy bien (ver 0xdata.com/docs/master/model/rf ).En lugar de dummificar sus categorías, ¿por qué no usaría una sola variable numérica para cada una? En el contexto de los bosques aleatorios, a menudo me he estado preguntando sobre la consecuencia de hacerlo (porque estoy de acuerdo en que suena sospechoso introducir la ordinalidad en datos categóricos con los que, si no tiene sentido), pero en la práctica (al menos con la implementación scikit-learn de los RF que he estado usando), a menudo he observado que no hace una diferencia en los resultados (aunque no estoy seguro de por qué).
fuente
Creo que debería considerar una o más técnicas de reducción variable . Se deshace de los predictores no tan influyentes.
He estado leyendo mucho sobre el procesamiento previo de datos y es una excelente solución para reducir el n ° de sus variables.
Mis sugerencias son las siguientes:
'nzv'
función del'caret'
paquete. Esto reducirá en gran medida su dimensión de datos.Además, sugeriría usar el algoritmo AdaBoost en lugar de RF. Personalmente, las investigaciones que he realizado me dieron coeficientes de Gini muy similares para ambos métodos. Lo bueno de AdaBoost es que en R maneja las observaciones que faltan. Entonces puede omitir el primer paso de esta lista
Espero que haya ayudado un poco. Buena suerte
fuente
Es posible que desee considerar modelos de efectos mixtos. Son populares en las ciencias sociales debido a su rendimiento en datos categóricos de alta cardinalidad, y los he usado para crear excelentes modelos predictivos que superan los enfoques populares de aprendizaje automático, como árboles impulsados por gradientes, bosques aleatorios y regresión logística regularizada de red elástica. La implementación más conocida es el paquete lme4 de R; la función que usaría para la clasificación es glmer, que implementa la regresión logística de efectos mixtos. Es posible que tenga problemas para escalar su conjunto de datos, pero he realizado 80k filas con 15 características sin demasiada dificultad.
fuente
Cuando dice "construir variable ficticia para cada una categórica" , ¿parece que está utilizando Python no R? R randomforest puede manejar categóricamente, también la reducción de memoria consecuente. Intenta con R.
A continuación, no necesita podar / fusionar manualmente los niveles categóricos, eso suena como un gran dolor. E incluso si lo hiciera, no está garantizado que las categorías más pobladas sean las más predictivas. Controle la complejidad del bosque aleatorio con el tamaño de los nodos de parámetros : comience con un tamaño de nodos grande y reduzca progresivamente (esto es una búsqueda de hiperparámetros).
La selección de variables será útil. @lorelai da buenas recomendaciones. Intente eliminar las características inútiles (de baja importancia o altamente correlacionadas). La construcción del árbol es cuadrática para la cantidad de características, por lo que si incluso elimina un tercio, pagará dividendos.
fuente
Deberías mirar el paquete H2O.ai. Maneja las variables categóricas fuera de la caja sin tener que hacer ninguna codificación (asegúrese de que las variables sean factores).
Particularmente me gusta su implementación de Gradient Boosted Machine (GBM) porque puedes ver la importancia variable después de construir el modelo. Los GBM también tienen la buena característica de ser resistentes al sobreajuste.
Si desea explorar otros modelos, tienen: GLM, Random Forest, Naive Bayes, Deep Learning, etc.
Ver: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html
También es fácil de instalar (Windows, Linux, Mac) y fácil de ejecutar con API que usan R, Python, Java y Scala.
Puede usar múltiples núcleos para acelerar las cosas.
En un futuro cercano, admitirán GPU.
También es de código abierto y gratuito (hay soporte de Enterprise).
fuente