¿Puesto que la RF puede manejar linealidad pero no proporciona coeficientes, sería buena idea usar Random Forest para recoger las características más importantes y luego conecte esas características en un modelo de regresión lineal múltiple con el fin de obtener los coeficientes?
Respuestas
¿Demasiados anuncios?Desde RF puede manejar la no-linealidad, pero no puede proporcionar coeficientes, sería prudente usar el Bosque Aleatorio para reunir las Características más importantes y, a continuación, enchufe de esas características en un modelo de Regresión Lineal Múltiple para explicar sus signos?
Interpreto la OP es una frase que pregunta significa que el OP quiere entender la conveniencia de que el siguiente análisis de tuberías:
- Ajuste de un bosque al azar a algunos datos
- Por alguna métrica de la variable importancia de (1), seleccionar un subconjunto de características de alta calidad.
- El uso de las variables de (2), la estimación de un modelo de regresión lineal. Esto le dará OP acceso a los coeficientes que OP notas de RF no puede proporcionar.
- Desde el modelo lineal en (3), cualitativamente interpretar los signos de los coeficientes estimados.
No creo que esta tubería lograr lo que te gustaría. Las Variables que son importantes en el bosque aleatorio, no necesariamente tienen ningún tipo de forma lineal aditivo relación con el resultado. Este comentario no debería ser sorprendente: es lo que hace al azar bosque de manera efectiva en el descubrimiento de relaciones no lineales.
He aquí un ejemplo. He creado un problema de clasificación con 10 de ruido características, dos de "la señal", y una circular en la decisión de la frontera.
set.seed(1) N <- 500 x1 <- rnorm(N, sd=1.5) x2 <- rnorm(N, sd=1.5) y <- apply(cbind(x1, x2), 1, function(x) (x%*%x)<1) plot(x1, x2, col=ifelse(y, "red", "blue")) lines(cos(seq(0, 2*pi, len=1000)), sin(seq(0, 2*pi, len=1000)))
Y cuando aplicamos el modelo RF, no nos sorprende encontrar que estas características son fácilmente elegido como importante por el modelo. (NOTA: este modelo no está sintonizado en todos.)
x_junk <- matrix(rnorm(N*10, sd=1.5), ncol=10) x <- cbind(x1, x2, x_junk) names(x) <- paste("V", 1:ncol(x), sep="") rf <- randomForest(as.factor(y)~., data=x, mtry=4) importance(rf) MeanDecreaseGini x1 49.762104 x2 54.980725 V3 5.715863 V4 5.010281 V5 4.193836 V6 7.147988 V7 5.897283 V8 5.338241 V9 5.338689 V10 5.198862 V11 4.731412 V12 5.221611
Pero cuando nos vamos abajo-para seleccionar a estas dos características útiles, la resultante modelo lineal es horrible.
summary(badmodel <- glm(y~., data=data.frame(x1,x2), family="binomial"))
La parte importante del resumen es la comparación de los residuales de la desviación y la nula la desviación. Podemos ver que el modelo realiza básicamente nada para "mover" la desviación. Por otra parte, los coeficientes estimados son esencialmente cero.
Call: glm(formula = as.factor(y) ~ ., family = "binomial", data = data.frame(x1, x2)) Deviance Residuals: Min 1Q Median 3Q Max -0.6914 -0.6710 -0.6600 -0.6481 1.8079 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -1.398378 0.112271 -12.455 <2e-16 *** x1 -0.020090 0.076518 -0.263 0.793 x2 -0.004902 0.071711 -0.068 0.946 --- Signif. codes: 0 ‘***' 0.001 ‘**' 0.01 ‘*' 0.05 ‘.' 0.1 ‘ ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 497.62 on 499 degrees of freedom Residual deviance: 497.54 on 497 degrees of freedom AIC: 503.54 Number of Fisher Scoring iterations: 4
Lo que cuentas de la naturaleza de la diferencia entre los dos modelos? Bien, claramente la decisión de la frontera que estamos tratando de aprender no es una función lineal de las dos de la "señal" características. Obviamente, si usted sabía que la forma funcional de la decisión del límite previo a la estimación de la regresión, se podría aplicar algún tipo de transformación para codificar los datos en una forma que la regresión podría descubrir... (Pero nunca he conocido a la forma de la frontera antes de tiempo en cualquier problema de la vida real.) Ya estamos trabajando sólo con dos características de la señal en este caso, una síntesis de conjunto de datos sin ruido en las etiquetas de clase, que el límite entre las clases es muy evidente en nuestra parcela. Pero es menos evidente cuando se trabaja con datos reales en un número realista de las dimensiones.
Por otra parte, en general, bosque aleatorio puede adaptarse a diferentes modelos para diferentes subconjuntos de datos. En un ejemplo más complejo, que no sea obvio lo que está pasando desde una única parcela a todos, y la construcción de un modelo lineal de similar poder de predicción será aún más difícil.
Porque estamos preocupados sólo por dos dimensiones, se puede hacer una predicción de la superficie. Como era de esperar, el modelo aleatorio se entera de que la zona de alrededor del origen es importante.
M <- 100 x_new <- seq(-4,4, len=M) x_new_grid <- expand.grid(x_new, x_new) names(x_new_grid) <- c("x1", "x2") x_pred <- data.frame(x_new_grid, matrix(nrow(x_new_grid)*10, ncol=10)) names(x_pred) <- names(x) y_hat <- predict(object=rf, newdata=x_pred, "vote")[,2] library(fields) y_hat_mat <- as.matrix(unstack(data.frame(y_hat, x_new_grid), y_hat~x1)) image.plot(z=y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), main="RF Prediction surface", xlab="x1", ylab="x2")
Como se deduce de nuestra pésima salida del modelo, la predicción de la superficie para la reducción de la variable del modelo de regresión logística es básicamente plana.
bad_y_hat <- predict(object=badmodel, newdata=x_new_grid, type="response") bad_y_hat_mat <- as.matrix(unstack(data.frame(bad_y_hat, x_new_grid), bad_y_hat~x1)) image.plot(z=bad_y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), main="Logistic regression prediction surface", xlab="x1", ylab="x2")
HongOoi señala que la pertenencia a una clase no es una función lineal de las características, sino que es una función lineal es en virtud de una transformación. Porque la decisión de límite es 1=x21+x22, si tenemos en plaza de estas características, vamos a ser capaces de construir un modelo lineal. Esto es deliberado. Mientras que el modelo RF puede encontrar la señal en esas dos características, sin transformación, el analista tiene que ser más específicas para conseguir útil de forma similar los resultados en el GLM. Tal vez eso es suficiente para el OP: encontrar un útil conjunto de transformaciones para 2 características es más fácil de lo que 12. Pero mi punto es que, incluso si una transformación que se producirá un útil modelo lineal, RF característica de importancia no sugieren la transformación en su propio.
La respuesta por @user777 es fantástico. Además para aquellos que describen por completo los aspectos del problema relacionado con el ajuste del modelo, hay otra razón para no seguir un proceso de múltiples pasos, tales como la ejecución de los bosques aleatorios, lazo, o una red elástica para "aprender", que cuenta para alimentar a los tradicionales de regresión. La regresión lineal no sabría acerca de la penalización que le pasó durante el desarrollo del bosque aleatorio o de otros métodos, y encajaría unpenalized efectos que están mal sesgada a aparecer demasiado fuerte en la predicción de la Y. Esto no sería diferente de ejecutar paso a paso de selección de variables y la presentación de informes el modelo final, sin tomar en cuenta cómo llegó.
Ejecutado adecuadamente un bosque aleatorio aplicado a un problema que es más "random forest adecuado" puede funcionar como un filtro para eliminar el ruido, y hacer que los resultados son más útiles como entrada para otras herramientas de análisis.
Renuncia de responsabilidad:
- Se trata de una "bala de plata"? De ninguna manera. El kilometraje puede variar. Trabaja donde trabaja, y no en otro lugar.
- Hay maneras que usted puede mal erróneamente groseramente uso y obtener respuestas que están en la basura-a-vudú de dominio? youbetcha. Como toda herramienta analítica, tiene límites.
- Si lamer una rana, su aliento huele como a la rana? probablemente. No tengo experiencia.
Tengo que dar un "grito" para mi "píos" hacer de la "Araña". (enlace) Su problema de ejemplo informado de mi enfoque. (enlace) también me encanta Theil-Sen de los peritos, y me gustaría poder dar mi apoyo a Theil y el Senador.
Mi respuesta no es acerca de cómo se equivocan, pero acerca de cómo podría funcionar si lo tienes razón en casi todo. Mientras que yo uso "trivial" de ruido, quiero que usted piense acerca de "no trivial" o "estructura" de ruido.
Uno de los puntos fuertes de un bosque aleatorio es la forma como se aplica a las grandes dimensiones de los problemas. Yo no puedo mostrar 20k columnas (también conocido como un 20k espacio tridimensional) en un lugar limpio manera visual. No es una tarea fácil. Sin embargo, si usted tiene un 20k-dimensional problema, un bosque al azar puede ser una buena herramienta cuando la mayoría de los otros caiga en sus "caras".
Este es un ejemplo de eliminación de ruido de la señal utilizando una muestra aleatoria de bosque.
#housekeeping
rm(list=ls())
#library
library(randomForest)
#for reproducibility
set.seed(08012015)
#basic
n <- 1:2000
r <- 0.05*n +1
th <- n*(4*pi)/max(n)
#polar to cartesian
x1=r*cos(th)
y1=r*sin(th)
#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))
#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)
x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))
#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))
Permítanme describir lo que está pasando aquí. Esta imagen de abajo muestra los datos de entrenamiento para la clase "1". Clase "2" es aleatorio uniforme en el mismo dominio y el rango. Se puede ver que la "información" de "1" es sobre todo una espiral, pero se ha dañado con el material de "2". Tener el 33% de sus datos corruptos pueden ser un problema para muchas herramientas de montaje. Theil-Sen comienza a degradarse en torno al 29%. (enlace)
Ahora separamos la información, sólo tener una idea de lo que el ruido es.
#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4
#assemble data into frame
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")
#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")
#separate class "1" from training data
idx1a <- which(data[,3]==1)
#separate class "1" from the predicted data
idx1b <- which(data2==1)
#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")
Aquí está el montaje de resultado:
Realmente me gusta este porque se puede mostrar tanto las fortalezas y debilidades de un método adecuado para un problema difícil al mismo tiempo. Si usted mira de cerca el centro se puede ver cómo hay menos filtrado. La escala geométrica de información es pequeño y el bosque aleatorio es que faltan. Se dice algo acerca del número de nodos, número de árboles, y la densidad de la muestra para la clase 2. También hay una "brecha" de cerca (-50,-50), y "chorros" en varios lugares. En general, sin embargo, el filtrado es decente.
Comparar vs SVM
Aquí está el código para permitir una comparación con SVM:
#now to fit to svm
fit.svm <- svm(z~., data=data, kernel="radial",gamma=10,type = "C")
x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)
count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){
for (j in 1:length(y5)){
x6[count]<-x5[i]
y6[count]<-y5[j]
count <- count+1
}
}
data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")
data4$z <- predict(fit.svm,newdata=data4)
idx4 <- which(data4$z==1,arr.ind=TRUE)
plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
legend = c("true","from RF","From SVM"),
col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))
Los resultados en la siguiente imagen.
Esta es una manera decente de la SVM. El gris es el dominio asociado con la clase "1" por la SVM. Los puntos azules son las muestras asociadas con la clase "1" por la RF. El RF filtro basado realiza de forma comparable a SVM sin una explícita impuestas. Se puede observar que el "apretado de datos" cerca del centro de la espiral, es mucho más "apretados" resuelto por la RF. También hay "islas" hacia la "cola", donde el RF encuentra la asociación que la SVM no.
Estoy entretenido. Sin tener el fondo, me hizo una de las primeras cosas que hace una muy buena contribución en el campo. El autor original utilizado de referencia "distribución" (enlace, enlace).
EDITAR:
Aplicar BOSQUE aleatorio para este modelo:
Mientras user777 tiene un buen pensamiento sobre un CARRO es el elemento de un bosque aleatorio, la premisa de que el bosque aleatorio es el "conjunto de agregación de la debilidad de los educandos". El CARRO es un conocido débil alumno, pero no es nada remotamente cerca de un "ensemble". El "ensemble" a pesar de que en un bosque aleatorio es la intención "en el límite de un gran número de muestras". La respuesta de user777, en el diagrama de dispersión, utiliza al menos 500 muestras y que dice algo sobre la legibilidad y tamaños de muestra en este caso. El sistema visual humano (en sí mismo un conjunto de alumnos) es un increíble sensor y el procesador de datos y se encuentra que el valor suficiente para facilidad de procesamiento.
Si tomamos incluso la configuración predeterminada de una al azar los bosques de herramienta, se puede observar el comportamiento de la clasificación de error aumenta durante los primeros árboles, y no llega a la de un árbol de nivel hasta el que hay alrededor de 10 árboles. Inicialmente error crece reducción de error se convierte en estable alrededor de 60 árboles. Por estable me refiero
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Si en lugar de mirar el "mínimo débil alumno" nos fijamos en el "mínimo débil conjunto" sugerido por un muy breve heurística para la configuración predeterminada de la herramienta, los resultados son algo diferentes.
Nota, he utilizado "líneas" para dibujar el círculo indica el borde largo de la aproximación. Usted puede ver que es imperfecto, pero mucho mejor que la calidad de un solo alumno.
El muestreo original tiene 88 "interior" de las muestras. Si el tamaño de la muestra se incrementó (permitiendo conjunto de aplicar), a continuación, la calidad de la aproximación también mejora. El mismo número de alumnos con 20.000 muestras de hace un impactante y mejor ajuste.
La calidad muy superior a la entrada de la información también permite la evaluación de un número adecuado de árboles. Inspección de la convergencia sugiere que el 20 árboles es el mínimo número suficiente en este caso en particular, para representar los datos.