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.
Respuestas:
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.
fuente
gbm
paqueteR
tiene 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.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.
fuente
¡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
fuente
(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.
fuente
El sobremuestreo minoritario sintético (SMOTE) genera nuevas observaciones de la clase minoritaria como combinaciones convexas aleatorias de observaciones vecinas. El documento está aquí: https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-14-106
fuente