style shinythemes div dashboardpage color r random-forest

shinythemes - Bosque aleatorio con clases muy desequilibradas.



tags$div shiny (4)

Debe intentar usar métodos de muestreo que reduzcan el grado de desequilibrio de 1: 10,000 a 1: 100 o 1:10. También debe reducir el tamaño de los árboles que se generan. (En este momento, estas son recomendaciones que solo repito de memoria, pero veré si puedo encontrar más autoridad que mi corteza esponjosa).

Una forma de reducir el tamaño de los árboles es establecer el "tamaño de nodos" más grande. Con ese grado de desequilibrio, es posible que tenga que tener un tamaño de nodo realmente grande, por ejemplo 5-10,000. Aquí hay un hilo en rhelp: https://stat.ethz.ch/pipermail/r-help/2011-September/289288.html

En el estado actual de la pregunta, sampsize=c(250000,2000), mientras que yo hubiera pensado que algo como sampsize = c (8000,2000), estaba más en línea con mis sugerencias. Creo que está creando muestras donde no tiene ninguno de los grupos que se muestrearon solo con 2000.

Estoy utilizando bosques aleatorios en un problema de big data, que tiene una clase de respuesta muy desequilibrada, así que leí la documentación y encontré los siguientes parámetros:

strata sampsize

La documentación de estos parámetros es escasa (o no tuve la suerte de encontrarla) y realmente no entiendo cómo implementarla. Estoy usando el siguiente código:

randomForest(x=predictors, y=response, data=train.data, mtry=lista.params[1], ntree=lista.params[2], na.action=na.omit, nodesize=lista.params[3], maxnodes=lista.params[4], sampsize=c(250000,2000), do.trace=100, importance=TRUE)

La respuesta es una clase con dos valores posibles, el primero aparece con más frecuencia que el segundo (10000: 1 o más)

El list.params es una lista con diferentes parámetros (duh! Lo sé ...)

Bueno, la pregunta (de nuevo) es: ¿Cómo puedo usar el parámetro ''estratos''? Estoy usando sampsize correctamente?

Y finalmente, a veces me sale el siguiente error:

Error in randomForest.default(x = predictors, y = response, data = train.data, : Still have fewer than two classes in the in-bag sample after 10 attempts.

Lo siento si estoy haciendo tantas preguntas (y tal vez estúpidas) ...


Estoy bastante seguro de que no estoy de acuerdo con la idea de eliminar las observaciones de su muestra.

En su lugar, podría considerar usar una muestra estratificada para establecer un porcentaje fijo de cada clase cada vez que se vuelva a muestrear. Esto se puede hacer con el paquete Caret. De esta manera, no omitirá las observaciones al reducir el tamaño de su muestra de entrenamiento. No le permitirá representar en exceso sus clases, pero se asegurará de que cada submuestra tenga una muestra representativa.

Aquí hay un ejemplo que encontré:

len_pos <- nrow(example_dataset[example_dataset$target==1,]) len_neg <- nrow(example_dataset[example_dataset$target==0,]) train_model <- function(training_data, labels, model_type, ...) { experiment_control <- trainControl(method="repeatedcv", number = 10, repeats = 2, classProbs = T, summaryFunction = custom_summary_function) train(x = training_data, y = labels, method = model_type, metric = "custom_score", trControl = experiment_control, verbose = F, ...) } # strata refers to which feature to do stratified sampling on. # sampsize refers to the size of the bootstrap samples to be taken from each class. These samples will be taken as input # for each tree. fit_results <- train_model(example_dataset , as.factor(sprintf("c%d", as.numeric(example_dataset$target))) ,"rf" ,tuneGrid = expand.grid(mtry = c( 3,5,10)) ,ntree=500 ,strata=as.factor(example_dataset$target) ,sampsize = c(''1''=as.integer(len_pos*0.25),''0''=as.integer(len_neg*0.8)) )


Hay algunas opciones.

Si tiene muchos datos, reserve una muestra aleatoria de los datos. Construya su modelo en un conjunto, luego use el otro para determinar un corte adecuado para las probabilidades de clase utilizando una curva ROC.

También puede aumentar la muestra de los datos en la clase minoritaria. El algoritmo SMOTE podría ayudar (consulte la referencia a continuación y el paquete DMwR para una función).

También puedes utilizar otras técnicas. rpart() y algunas otras funciones pueden permitir diferentes costos en los errores, por lo que podría favorecer más a la clase minoritaria. Puede empaquetar este tipo de modelo rpart() para aproximarse a lo que está haciendo un bosque aleatorio.

ksvm() en el paquete kernlab también puede usar costos desequilibrados (pero las estimaciones de probabilidad ya no son buenas cuando haces esto). Muchos otros paquetes tienen argumentos para establecer los antecedentes. También puede ajustar esto para poner más énfasis en la clase minoritaria.

Un último pensamiento: maximizar los modelos en función de la precisión no lo llevará a ningún lado (puede obtener un 99.99% de descuento). El cursor puede sintonizar modelos basados ​​en la estadística Kappa, que es una opción mucho mejor en su caso.


Lo sentimos, no sé cómo publicar un comentario sobre la respuesta anterior, así que crearé una respuesta por separado.

Supongo que el problema se debe a un alto desequilibrio del conjunto de datos (hay muy pocos casos de una de las clases). Para cada árbol en RF, el algoritmo crea una muestra bootstrap, que es un conjunto de entrenamiento para este árbol. Y si tiene muy pocos ejemplos de una de las clases en su conjunto de datos, entonces el muestreo de inicio seleccionará ejemplos de una sola clase (clase principal). Y así, el árbol no puede crecer en una sola clase de ejemplos. Parece que hay un límite en 10 intentos de muestreo fallidos. Así que la propuesta de DWin para reducir el grado de desequilibrio a valores más bajos (1: 100 o 1:10) es la más razonable.