4 votos

Optimización de un modelo Random Forest

Estoy entrenando un modelo de regresión Random Forests en R utilizando el randomForest paquete. Mi número total de variables, $M$ es 30, y el tamaño de mi muestra de entrenamiento $N$ tiene más de 10.000 observaciones. El modelo, en general, ofrece resultados razonables (en comparación con los hallazgos en la literatura) en términos de importancia de las variables y la interacción no lineal entre las variables, con un rendimiento general decente (~80% de var explicada - no creo que haya un valor umbral que determine bueno/no bueno, por favor, corrígeme si me equivoco).

Ahora estoy afinando el modelo para conseguir el mayor rendimiento posible actuando sobre dos parámetros: número de árboles y número de variables por árbol. Citando a Breiman & Cutler's sitio web : "...se demostró que la tasa de error del bosque depende de dos cosas:

  • La correlación entre dos árboles cualesquiera del bosque.
  • La fuerza de cada uno de los árboles del bosque.

Reducir $m$ [Número de variables por árbol, mtry en R ] reduce tanto la correlación como la fuerza. Si se aumenta, se incrementan ambas. En algún punto intermedio se encuentra un rango "óptimo" de $m$ - normalmente bastante amplia. Utilizando la tasa de error oob se puede encontrar rápidamente un valor de m en el rango".

El modelo es poco sensible a los cambios en el número de árboles, estabilizándose a partir de cierto umbral (como suele ocurrir con la RF - véase también "¿Cuántos árboles en un bosque aleatorio?" - Oshiro et al. 2012).

En cuanto al número de variables por árbol, randomForest para la regresión utiliza un valor por defecto $m=\frac{M}{3}$ (lo cual es coherente con la literatura - véase, por ejemplo, "The Elements of Statistical Learning" - Friedman et al 2001, cap. 15). He utilizado el tuneRF para calcular la sensibilidad del modelo a los cambios en m pero este operador es bastante inestable (si se ejecuta varias veces, los resultados son siempre diferentes, incluso si las semillas se establecen set.seed(1234567) ).

Esto se discutió también en otro post sobre StackOverflow pero mi pregunta es más bien desde el punto de vista teórico. He sintonizado manualmente el mtry y encontré el que minimiza mi Mean of squared residuals y maximiza mi % Var explained pero está bastante lejos de la norma $m=\frac{M}{3}$ . Además, los resultados de mi modelo son sensibles a las variaciones de mtry (es decir, incluso fijando las semillas a un valor específico para lograr ajustes reproducibles del modelo, para cada mtry importancia de la variable de valor cambia bastante radicalmente). El aumento de la mtry aumenta la correlación interna de cada árbol específico: ¿cómo es posible que duplicar el valor por defecto mtry ¿tengo una mejora general? ¿Podría estar esto sesgado por la multicolinealidad dentro de los árboles? En general, me cuesta encontrar el "punto intermedio" al que se referían Braiman y Cutler.

Cualquier idea de practicantes más experimentados (es mi primera RF) sería muy apreciada.

¿Podría alguien explicarme también por qué la importancia relativa de las variables puede ser tan radicalmente diferente cambiando el mtry ¿incluso sólo por 1 unidad? Siendo el modelo un conjunto de procesos aleatorios, ¿no deberían converger los resultados? Gracias.

6voto

Mirko Friedenhagen Puntos 304

con un rendimiento general decente (~80% var explicado - no creo que que haya un valor umbral que determine si es bueno o no, por favor corregirme si me equivoco).

No creas que has cometido un error, pero comprueba tu código de todos modos. Por mi propia experiencia y por preguntas anteriores en este foro, es muy común que los nuevos usuarios de RF produzcan una validación cruzada fuera de bolsa (OOB-CV) demasiado confiada.

OOB es el régimen de validación cruzada, al igual que leave-one-out o 10fold CV o algún régimen anidado. Cualquier validación cruzada se calcula haciendo coincidir la predicción de las observaciones no utilizadas en el conjunto de entrenamiento. OOB es bueno para los bosques aleatorios porque se obtiene de forma gratuita sin tiempo de ejecución adicional, porque para cualquier observación en el conjunto de entrenamiento, hay un conjunto de árboles que fue entrenado de forma interdependiente de las observaciones. La varianza explicada es una métrica para calificar el rendimiento de un modelo en un régimen de CV determinado. Usted debe elegir o definir la métrica que le resulte más útil, como principiante, limítese a la varianza explicada o al error cuadrático medio.

library(randomForest)

N=2000
M=6
X = data.frame(replicate(M,rnorm(N)))
y = with(X,X1*X2+rnorm(N))
rf = randomForest(X,y)
print(rf) # here's the printed OOB performance
Call:
 randomForest(x = X, y = y) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 2

          Mean of squared residuals: 1.281954
                    % Var explained: 32.5
tail(rf$rsq,1) #can also be fetched from here
[1] 0.325004
rf$predicted # OOB CV predictions
predict(rf)  # same OOB predictions
predict(rf,X) #oh no this is training predictions, never do that

#wow what a performance, sadly it is over-confident
1 - sum((predict(rf,X)-y)^2 )/sum((y-mean(y))^2) 
[1] 0.869875
#this is the OOB performance as calculated within the package
1 - sum((predict(rf  )-y)^2 )/sum((y-mean(y))^2)

En segundo lugar, si se ajusta por OOB-CV, el OOB-CV final del modelo de rf elegido ya no es una estimación insesgada del rendimiento del modelo. Para proceder de forma muy exhaustiva, necesitaría una validación cruzada repetida externa. Sin embargo, si el rendimiento de su modelo ya explica el 80% de la varianza y sólo está ajustando mtry, no espero que el OOB-CV esté muy equivocado. Tal vez un 5% peor... [editar: con 5% no estoy hablando de cuánto ajuste mtry cambiará el rendimiento de OOB-CV. Digo que OOB-CV sugiere, por ejemplo, un rendimiento del 83%, pero esta estimación ya no es del todo fiable. Si se estimara el rendimiento mediante la repetición de 10outerfold-10innerfold-10 se podría encontrar un rendimiento del 78%].

¿Cómo es posible que la duplicación del valor por defecto mtry Tengo una mejora general mejora [del rendimiento del modelo medido por OOB-CV]?

Sí, es muy posible. Los valores de 'mtry' se cierran $M$ hará que el proceso de crecimiento del árbol sea más codicioso. Utilizará primero la(s) variable(s) dominante(s) y explicará la mayor parte posible del objetivo y se dividirá por las variables restantes hacia abajo en el árbol. Los valores altos de mtry dan árboles con un sesgo bajo. Para conjuntos de entrenamiento con un bajo componente de ruido, tiene sentido. Su conjunto de entrenamiento puede contener simplemente un pequeño conjunto de variables de alta calidad y algunos restos. En ese caso, un mtry alto tiene sentido. Si el conjunto de entrenamiento contiene un conjunto de variables ruidosas en su mayoría redundantes, un mtry bajo garantizaría la confianza en todas ellas de manera uniforme.

¿Podría alguien explicarme también por qué la variable importancia relativa puede ser tan radicalmente diferente cambiando el mtry incluso sólo por 1 unidad?

En primer lugar, el bosque aleatorio no es determinista y la importancia de las variables puede variar. Por supuesto, puede hacer que la importancia de las variables converja haciendo crecer un número muy alto de árboles o repitiendo el entrenamiento del modelo suficientes veces. Asegúrese de utilizar únicamente medidas de importancia de variables basadas en la permutación, la importancia basada en la función de pérdida (gini o residuos cuadrados, llamados tipo=2 en randomForest) no es realmente recomendable.

Si mtry=1 obligas al modelo a utilizar todas las variables por igual y la importancia del modelo tiende a igualarse. Si mtry=$M$ su modelo utilizará en primer lugar las variables dominantes y se basará mucho más en ellas, la importancia de las variables estará distribuida de forma relativamente más desigual.

Si se realiza un análisis de sensibilidad, se observará que las predicciones del modelo son más sensibles a las variables dominantes, cuando mtry es relativamente alto. Este es un ejemplo de cómo la estructura del modelo se ve afectada por mtry . La figura es del apéndice de mi tesis . En resumen, es un modelo de bosque aleatorio para predecir la solubilidad molecular en función de algunos descriptores moleculares estándar. En este caso, utilizo ForestFloor para visualizar la estructura del modelo. Observe cuando mtry=M=12 el modelo entrenado se basa principalmente en la variable dominante SlogP, mientras que si mtry=1, el modelo entrenado se basa casi por igual en SlogP, SMR y Peso. enter image description here

Otros enlaces:

Una pregunta sobre el bosque aleatorio dinámico

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X