18 votos

Inclusión de términos de interacción en los bosques aleatorios

Supongamos que tenemos una respuesta Y y unos predictores X1,....,Xn. Si intentamos ajustar Y mediante un modelo lineal de X1,....,Xn, y resulta que la verdadera relación entre Y y X1,...,Xn no es lineal, podríamos arreglar el modelo transformando las X de alguna manera y ajustando el modelo. Además, si resulta que las X1,...,XN no afectan a Y independientemente de las otras características, también podríamos mejorar el modelo incluyendo términos de interacción, x1*x3 o x1*x4*x7 o algo parecido. Así, en el caso lineal, los términos de interacción podrían aportar valor al corregir la no linealidad o las violaciones de la independencia entre la respuesta y las características.

Sin embargo, los bosques aleatorios no hacen realmente estas suposiciones. ¿Es importante incluir términos de interacción cuando se ajusta un Bosque Aleatorio? ¿O simplemente incluir los términos individuales y elegir los parámetros adecuados permitirá a los Bosques Aleatorios capturar estas relaciones?

21voto

Ankur Loriya Puntos 160

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 . He aquí un ejemplo de juguete de una regresión con una interacción bidireccional. Se compara un modelo lineal ingenuo con un árbol y una bolsa de árboles (que es una alternativa más sencilla a un bosque aleatorio).

Como puede ver, el árbol por 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"))

enter image description here

6 votos

Muy bonito. ¿Tiene algún documento que pueda recomendar sobre el tema? Gracias

3 votos

Por si alguien más está buscando documentos sobre este tema, he aquí un estudio empírico lo que sugiere que es posible que la RF no detecte las interacciones en la medida en que se dice que lo hace, al menos aquí en CV

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