Incluyendo términos de interacción en bosque aleatorio

15

Supongamos que tenemos una respuesta Y y predictores X1, ...., Xn. Si tratamos de ajustar Y a través de un modelo lineal de X1, ..., Xn, y resulta que la verdadera relación entre Y y X1, ..., Xn no era lineal, podríamos ser capaces para arreglar el modelo transformando las X de alguna manera y luego ajustando el modelo. Además, si sucediera que X1, ..., XN no afectó y independientemente de las otras características, también podríamos mejorar el modelo al incluir términos de interacción, x1 * x3 o x1 * x4 * x7 o algo por el estilo. Entonces, en el caso lineal, los términos de interacción pueden aportar valor al corregir las violaciones de no linealidad o independencia entre la respuesta y las características.

Sin embargo, los bosques al azar realmente no hacen estas suposiciones. ¿Es importante incluir términos de interacción cuando se ajusta un bosque aleatorio? ¿O solo incluir los términos individuales y elegir los parámetros apropiados permitirá a Random Forests capturar estas relaciones?

mt88
fuente

Respuestas:

15

Aunque la ingeniería de características es muy importante en la vida real, los árboles (y los bosques aleatorios) son muy buenos para encontrar términos de interacción de la forma x*y. Aquí hay un ejemplo de juguete de una regresión con una interacción bidireccional. Un modelo lineal ingenuo se compara con un árbol y una bolsa de árboles (que es una alternativa más simple a un bosque aleatorio).

Como puede ver, el árbol en sí mismo es bastante bueno para encontrar la interacción, pero el modelo lineal no es bueno en este ejemplo.

# fake data

x <- rnorm(1000, sd=3)
y <- rnorm(1000, sd=3)
z <- x + y + 10*x*y + rnorm(1000, 0, 0.2)
dat <- data.frame(x, y, z)

# test and train split
test <- sample(1:nrow(dat), 200)
train <- (1:1000)[-test]

# bag of trees model function
boot_tree <- function(formula, dat, N=100){
  models <- list()
  for (i in 1:N){
    models[[i]] <- rpart(formula, dat[sample(nrow(dat), nrow(dat), replace=T), ])
  }
  class(models) <- "boot_tree"
  models
}

# prediction function for bag of trees
predict.boot_tree <- function(models, newdat){
  preds <- matrix(0, nc=length(models), nr=nrow(newdat))
  for (i in 1:length(models)){
    preds[,i] <- predict(models[[i]], newdat)
  }
  apply(preds, 1, function(x) mean(x, trim=0.1))
}

## Fit models and predict:

# linear model
model1 <- lm(z ~ x + y, data=dat[train,])
pred1 <- predict(model1, dat[test,])

# tree
require(rpart)
model2 <- rpart(z ~ x + y, data=dat[train,])
pred2 <- predict(model2, dat[test,])

# bag of trees
model3 <- boot_tree("z ~ x+y", dat)
pred3 <- predict(model3, dat[test,])

ylim = range(c(pred1, pred2, pred3))

# plot predictions and true z

plot(dat$z[test], predict(model1, dat[test,]), pch=19, xlab="Actual z",
ylab="Predicted z", ylim=ylim)
points(dat$z[test], predict(model2, dat[test,]), col="green", pch=19)
points(dat$z[test], predict(model3, dat[test,]), col="blue", pch=19)

abline(0, 1, lwd=3, col="orange")

legend("topleft", pch=rep(19,3), col=c("black", "green", "blue"),
legend=c("Linear", "Tree", "Forest"))

ingrese la descripción de la imagen aquí

Flounderer
fuente
44
Muy agradable. ¿Tiene un documento que pueda recomendar sobre el tema? Gracias
steinbock