usos indice gini forest for dummies como bosques aplicar aleatorios r statistics machine-learning regression random-forest

indice - establecer valores para ntree y mtry para el modelo de regresión de bosque aleatorio



random forest regression (5)

Estoy usando el paquete R randomForest para hacer una regresión en algunos datos biológicos. Mi tamaño de datos de entrenamiento es 38772 X 201 .

Me preguntaba: ¿cuál sería un buen valor para la cantidad de árboles ntree y el número de variables por nivel? ¿Hay una fórmula aproximada para encontrar dichos valores de parámetros?

Cada fila en mis datos de entrada es de 200 caracteres que representan la secuencia de aminoácidos, y quiero construir un modelo de regresión para usar dicha secuencia con el fin de predecir las distancias entre las proteínas.


¿Podría este papel ayudar? Limitar el número de árboles en bosques aleatorios

Abstracto. El objetivo de este trabajo es proponer un procedimiento simple que a priori determine un número mínimo de clasificadores para combinar con el fin de obtener un nivel de precisión de predicción similar al obtenido con la combinación de conjuntos más grandes. El procedimiento se basa en la prueba de significación no paramétrica de McNemar. Conocer a priori el tamaño mínimo del conjunto clasificador que ofrece la mejor precisión de predicción, constituye una ganancia en tiempo y costos de memoria, especialmente para grandes bases de datos y aplicaciones en tiempo real. Aquí aplicamos este procedimiento a cuatro sistemas clasificadores múltiples con árbol de decisión C4.5 (Breiman''s Bagging, subespacios aleatorios de Ho, su combinación etiquetada ''Bagfs'' y bosques aleatorios de Breiman) y cinco grandes bases de datos de referencia. Vale la pena notar que el procedimiento propuesto puede extenderse fácilmente a otros algoritmos de aprendizaje base además de un árbol de decisión también. Los resultados experimentales mostraron que es posible limitar significativamente la cantidad de árboles. También demostramos que la cantidad mínima de árboles necesarios para obtener la mejor precisión de predicción puede variar de un método de combinación clasificador a otro

Nunca usan más de 200 árboles.


El valor predeterminado para mtry es bastante sensible, por lo que no es realmente necesario ensuciarlo. Hay una función tuneRF para optimizar este parámetro. Sin embargo, tenga en cuenta que puede causar un sesgo.

No hay optimización para la cantidad de repeticiones de arranque. A menudo empiezo con ntree=501 y luego trazo el objeto de bosque aleatorio. Esto le mostrará la convergencia de error basada en el error OOB. Desea suficientes árboles para estabilizar el error, pero no tantos que correlacione el conjunto, lo que conduce a un sobreajuste.

Aquí está la advertencia: las interacciones variables se estabilizan a un ritmo más lento que el error, por lo tanto, si tiene una gran cantidad de variables independientes, necesita más repeticiones. Mantendría el ntree en un número impar para que se puedan romper los lazos.

Para las dimensiones de tu problema, comenzaría ntree=1501 . También recomendaría mirar uno de los enfoques de selección de variables publicados para reducir el número de sus variables independientes.


La respuesta corta es no.

La función randomForest por supuesto tiene valores predeterminados para ntree y mtry . El valor predeterminado para mtry es a menudo (aunque no siempre) razonable, mientras que, en general, la gente querrá aumentar ntree desde su valor predeterminado de 500 un poco.

El valor "correcto" para ntree generalmente no es una gran preocupación, ya que será bastante evidente con un pequeño cambio que las predicciones del modelo no cambiarán mucho después de un cierto número de árboles.

Puede gastar (leer: desperdicio) mucho tiempo mtry cosas como mtry (y sampsize y maxnodes y nodesize etc.), probablemente para algún beneficio, pero en mi experiencia no es mucho. Sin embargo, cada conjunto de datos será diferente. A veces puede ver una gran diferencia, a veces ninguna.

El paquete caret tiene un train función muy general que le permite hacer una simple búsqueda de grillas sobre valores de parámetros como mtry para una amplia variedad de modelos. Mi única advertencia es que hacer esto con conjuntos de datos bastante grandes es probable que lleve bastante tiempo, así que ten cuidado con eso.

Además, de alguna manera, olvidé que el paquete ranfomForest tiene una función tuneRF que es específicamente para buscar el valor "óptimo" para mtry .


Un buen truco que uso es comenzar primero con la raíz cuadrada del número de predictores y tapar ese valor para "mtry". Por lo general, tiene el mismo valor que elegiría la función tunerf en un bosque aleatorio.


Utilizo el siguiente código para verificar la precisión mientras juego con ntree y mtry (cambie los parámetros):

results_df <- data.frame(matrix(ncol = 8)) colnames(results_df)[1]="No. of trees" colnames(results_df)[2]="No. of variables" colnames(results_df)[3]="Dev_AUC" colnames(results_df)[4]="Dev_Hit_rate" colnames(results_df)[5]="Dev_Coverage_rate" colnames(results_df)[6]="Val_AUC" colnames(results_df)[7]="Val_Hit_rate" colnames(results_df)[8]="Val_Coverage_rate" trees = c(50,100,150,250) variables = c(8,10,15,20) for(i in 1:length(trees)) { ntree = trees[i] for(j in 1:length(variables)) { mtry = variables[j] rf<-randomForest(x,y,ntree=ntree,mtry=mtry) pred<-as.data.frame(predict(rf,type="class")) class_rf<-cbind(dev$Target,pred) colnames(class_rf)[1]<-"actual_values" colnames(class_rf)[2]<-"predicted_values" dev_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1)) dev_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1)) pred_prob<-as.data.frame(predict(rf,type="prob")) prob_rf<-cbind(dev$Target,pred_prob) colnames(prob_rf)[1]<-"target" colnames(prob_rf)[2]<-"prob_0" colnames(prob_rf)[3]<-"prob_1" pred<-prediction(prob_rf$prob_1,prob_rf$target) auc <- performance(pred,"auc") dev_auc<-as.numeric([email protected]) pred<-as.data.frame(predict(rf,val,type="class")) class_rf<-cbind(val$Target,pred) colnames(class_rf)[1]<-"actual_values" colnames(class_rf)[2]<-"predicted_values" val_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1)) val_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1)) pred_prob<-as.data.frame(predict(rf,val,type="prob")) prob_rf<-cbind(val$Target,pred_prob) colnames(prob_rf)[1]<-"target" colnames(prob_rf)[2]<-"prob_0" colnames(prob_rf)[3]<-"prob_1" pred<-prediction(prob_rf$prob_1,prob_rf$target) auc <- performance(pred,"auc") val_auc<-as.numeric([email protected]) results_df = rbind(results_df,c(ntree,mtry,dev_auc,dev_hit_rate,dev_coverage_rate,val_auc,val_hit_rate,val_coverage_rate)) } }