Processing math: 100%

17 votos

R: ¿Qué tengo que ver en parte a la dependencia de las parcelas de gbm y RandomForest?

En realidad, pensé que había entendido lo que se puede mostrar con un parcial de dependencia de la trama, pero usando un simple ejemplo hipotético, me tiene bastante intrigado. En el siguiente trozo de código que me genera tres variables independientes (un, b, c) y una variable dependiente (y) con c muestran una estrecha relación lineal con y, mientras que un y b son no correlacionados con y. Hago un análisis de regresión con una impulsada árbol de regresión utilizando el paquete R gbm:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
par(mfrow = c(2,2))
plot(gbm.gaus, i.var = 1)
plot(gbm.gaus, i.var = 2)
plot(gbm.gaus, i.var = 3)

No es de extrañar que, para las variables de un y b, la dependencia parcial de las parcelas de rendimiento de líneas horizontales alrededor de la media de una. Lo que me rompecabezas es la representación gráfica para la variable c. Puedo obtener líneas horizontales para los rangos c < 40 y c > 60 y el eje y está restringida a valores cercanos a la media de y. Desde un y b son completamente independientes de y (y por lo tanto de importancia variable en el modelo es el 0), yo esperaba que c mostraría parcial de la dependencia a lo largo de todo su rango en lugar de que la forma sigmoidea de una muy restringido el rango de sus valores. He tratado de encontrar información en Friedman (2001) "Codiciosos aproximación de funciones: un gradiente de impulsar la máquina" y en Hastie et al. (2011) "Elementos de Estadística de Aprendizaje", pero mis habilidades matemáticas son demasiado bajos como para comprender todas las ecuaciones y fórmulas en el mismo. Por lo tanto mi pregunta: ¿Qué determina la forma de la dependencia parcial de la parcela para la variable c? (Por favor explique en palabras comprensibles para un no-matemático!)

AÑADIDO el 17 de abril de 2014:

Mientras se espera una respuesta, he utilizado el mismo ejemplo, los datos para un análisis con R-package randomForest. El parcial de la dependencia de las parcelas de randomForest se asemejan mucho más a lo que yo esperaba desde el gbm parcelas: el parcial de la dependencia de las variables explicativas de un y b varían de forma aleatoria y en torno a 50, mientras que la variable explicativa c muestra parcial de la dependencia en toda su gama (y para casi todo el rango de y). ¿Cuáles podrían ser las razones para estas diferentes formas de la dependencia parcial de las parcelas en gbm y randomForest?

partial plots of gbm and randomForest

Aquí el código modificado que compara las parcelas:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")

library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")

library(randomForest)
rf.model <- randomForest(y ~ a + b + c, data = Data)

x11(height = 8, width = 5)
par(mfrow = c(3,2))
par(oma = c(1,1,4,1))
plot(gbm.gaus, i.var = 1)
partialPlot(rf.model, Data[,2:4], x.var = "a")
plot(gbm.gaus, i.var = 2)
partialPlot(rf.model, Data[,2:4], x.var = "b")
plot(gbm.gaus, i.var = 3)
partialPlot(rf.model, Data[,2:4], x.var = "c")
title(main = "Boosted regression tree", outer = TRUE, adj = 0.15)
title(main = "Random forest", outer = TRUE, adj = 0.85)

8voto

Pasé algún tiempo a escribir mi propia "parcial.función-plotter" antes de que me di cuenta de que ya estaba incluido en el R randomForest de la biblioteca.

[EDITAR ...pero luego me pasó un año haciendo el CRAN paquete forestFloor, que no es en mi opinión mucho mejor que la clásica parcial de la dependencia de las parcelas]

Parcial.la función de la trama son grandes en instancias como esta simulación de ejemplo se muestran aquí, donde la variable que explica no interactúan con otras variables. Si cada explicando variable contribuyen de forma aditiva a la de destino-Y por alguna función desconocida, este método es ideal para mostrar a la estimada oculto de la función. A menudo veo que tal aplanamiento en las fronteras de funciones parciales.

Algunas de las razones: randomForsest tiene un argumento llamado 'nodesize=5', que significa que ningún árbol se subdividen a un grupo de 5 miembros o menos. Por lo tanto, cada uno de los árboles no pueden distinguir con más precisión. Embolsado/arranque de la capa de ensemple suaviza por la votación de los muchos pasos de las funciones de los árboles individuales - pero sólo en la mitad de la región de datos. Llegando a las fronteras de los datos representados espacio, la "amplitud" de la parcial.la función va a caer. Configuración de nodesize=3 y/o obtener más observaciones en comparación con el ruido puede reducir esta frontera nivelado efecto... Cuando la relación señal a ruido cae en general en bosque aleatorio de las predicciones de la escala se condensa. Así, las predicciones no son absolutamente términos precisos, pero sólo se correlacionó linealmente con el objetivo. Usted puede ver los valores de a y b como ejemplos de extremadamente baja relación señal a ruido, y por lo tanto estas funciones parciales son muy planas. Es una buena característica de bosque aleatorio que ya desde el rango de las predicciones de conjunto de entrenamiento puede adivinar lo bien que el modelo está realizando. OOB.predicciones es bueno también..

aplanamiento de parcial de la parcela de regiones en las que no hay datos razonables: Como bosque aleatorio y CESTA de datos basada en modelos, personalmente, me gusta el concepto de que estos modelos no extrapolar. Por lo tanto la predicción de c=500 o c=1100 es exactamente igual a c=100, o en la mayoría de los casos también c=98.

Aquí es un ejemplo de código con la frontera de acoplamiento es reducida:

No he probado el gbm paquete...

aquí hay algunos ilustrativos código basado en el eaxample...

#more observations are created...
a <- runif(5000, 1, 100)
b <- runif(5000, 1, 100)
c <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
y <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
par(mfrow = c(1,3))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(randomForest)
#smaller nodesize "not as important" when there number of observartion is increased
#more tress can smooth flattening so boundery regions have best possible signal to             noise, data specific how many needed

plot.partial = function() {
partialPlot(rf.model, Data[,2:4], x.var = "a",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "b",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "c",xlim=c(1,100),ylim=c(1,100))
}

#worst case! : with 100 samples from Data and nodesize=30
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=30)
plot.partial()

#reasonble settings for least partial flattening by few observations: 100 samples and nodesize=3 and ntrees=2000
#more tress can smooth flattening so boundery regions have best possiblefidelity
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=5,ntress=2000)
plot.partial()

#more observations is great!
rf.model <- randomForest(y ~ a + b + c,
 data = Data[sample(5000,5000),],
 nodesize=5,ntress=2000)
plot.partial()

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