Para la clasificación con bosques aleatorios en R, ¿cómo se debe ajustar para los tamaños de clase desequilibrados?

17

Estoy explorando diferentes métodos de clasificación para un proyecto en el que estoy trabajando y estoy interesado en probar Random Forests. Estoy tratando de educarme a medida que avanzo, y agradecería cualquier ayuda brindada por la comunidad de CV.

He dividido mis datos en conjuntos de entrenamiento / prueba. De la experimentación con bosques aleatorios en R (usando el paquete randomForest), he tenido problemas con una alta tasa de clasificación errónea para mi clase más pequeña. He leído este documento sobre el rendimiento de los bosques aleatorios en datos desequilibrados, y los autores presentaron dos métodos para tratar el desequilibrio de clases cuando se utilizan bosques aleatorios.

1. Bosques aleatorios ponderados

2. Bosques aleatorios equilibrados

El paquete R no permite la ponderación de las clases (en los foros de ayuda de R, he leído que el parámetro classwt no funciona correctamente y está programado como una futura corrección de errores), por lo que me queda la opción 2. Puedo especificar El número de objetos muestreados de cada clase para cada iteración del bosque aleatorio.

Me siento incómodo al establecer tamaños de muestra iguales para bosques aleatorios, ya que siento que estaría perdiendo demasiada información sobre la clase más grande que conduce a un bajo rendimiento con datos futuros. Las tasas de clasificación errónea cuando se redujo el muestreo de la clase más grande ha mejorado, pero me preguntaba si había otras formas de lidiar con tamaños de clase desequilibrados en bosques aleatorios.

ialm
fuente
1
También estoy enfrentando el mismo problema. ¿Podría proporcionar el script para el bosque aleatorio ponderado y el bosque aleatorio basado en métricas, si tiene? Mirando hacia adelante por su respuesta

Respuestas:

5

Si no le gustan esas opciones, ¿ha considerado utilizar un método de refuerzo? Dada una función de pérdida adecuada, aumentar automáticamente recalibra los pesos a medida que avanza. Si la naturaleza estocástica de los bosques aleatorios te atrae, el aumento de gradiente estocástico también lo construye.

David J. Harris
fuente
Hola David, gracias por la sugerencia. ¿Sería posible impulsar dentro / en combinación con bosques aleatorios? Además, he leído que el aumento puede no ser aplicable con datos ruidosos. Los datos con los que estoy trabajando contienen muchas variables "ruidosas". Actualmente estoy ejecutando bosques aleatorios sin selección de características, disminuyendo el muestreo de la clase más grande para tratar el desequilibrio. He estado obteniendo resultados aceptables (clasificando correctamente el 85% de la clase más pequeña y el 93% de la clase más grande en el conjunto de entrenamiento), pero las mejoras siempre son bienvenidas.
ialm
@ Jonathan No tengo una buena idea de cuánto ruido se requiere antes de que los bosques aleatorios comiencen a competir con los diversos métodos de impulso, pero mi impresión es que es muy necesario. El gbmpaquete Rtiene un término funcional de "pesos", y puede aumentar la aleatoriedad de una manera muy similar a los bosques aleatorios disminuyendo con el término "bag.fraction". Parece que vale la pena intentarlo.
David J. Harris
@ DavidJ.Harris Boosting también sufre un desequilibrio de clase, especialmente en el caso de una rareza absoluta, cuando la información sobre las clases minoritarias es escasa
Antoine
2

Creo que ponderar objetos es de alguna manera equivalente a duplicarlos. Tal vez debería intentar modificar el paso de arranque mediante el muestreo apropiado de sus diferentes clases.

0.5

0asa
fuente
0

¡En lugar de probar clases grandes, puede expandir clases pequeñas! Si las clases grandes tienen muchas más observaciones que las pequeñas, entonces biase será pequeña. Espero que pueda manejar ese conjunto de datos de gran tamaño.

También puede identificar subconjuntos de observaciones que manejan la mayor cantidad de información sobre clases grandes, hay muchos procedimientos posibles, el más simple creo que se basa en el método de los vecinos más cercanos: el muestreo de observación condicionado a la estructura del gráfico de vecindario garantiza que la muestra tendrá una densidad de probabilidad más similar a el original.

randomForest está escrito en Fortran yc, el código fuente está disponible (http://cran.r-project.org/src/contrib/randomForest_4.6-2.tar.gz) pero no puedo detectar el lugar donde se calcula la entusiasmo, PD. ups que el bosque aleatorio usa Gini en lugar de entusiasmo

Qbik
fuente
Identificar subconjuntos de observaciones en la clase más grande parece una idea interesante. La segunda parte del proyecto en realidad está diferenciando la clase más grande en subgrupos más pequeños y útiles que pueden ser útiles para futuros estudios. En cuanto a los cálculos de entropía en el código, en realidad no he profundizado en el código y solo he visto algo de la teoría detrás de rf, por lo que no puedo comentar sobre eso.
ialm
Quería modificar ese código hace mucho tiempo, pero no tuve tiempo para eso, agregar pesos no debería ser conceptualmente difícil.
Qbik
El bosque aleatorio en R podría usarse como herramienta de regresión, también puede ser útil para la clasificación no supervisada. Hace mucho tiempo que quería modificar el código de randomForest, pero no tuve tiempo para eso, agregar pesos no debería ser conceptualmente difícil. Hace un tiempo, me preguntaba por mi cuenta cómo usar el bosque aleatorio para la agrupación no supervisada y tuve una idea, pero aún no lo probé, desafortunadamente parece bastante exigente por obligación: observaciones numéricas ^ 2.
Qbik
0

(1) Tienes razón, la función de ponderación no funciona y no estoy seguro de si alguna vez se ha solucionado.

(2) La mayoría usa la opción 2 con datos balanceados. La clave para no perder demasiados datos es el muestreo estratificado. Muestra aleatoriamente un conjunto equilibrado único para cada árbol.

Charles
fuente