Inclusion de termes d'interaction dans la forêt aléatoire

15

Supposons que nous ayons une réponse Y et des prédicteurs X1, ...., Xn. Si nous devions essayer d'ajuster Y via un modèle linéaire de X1, ...., Xn, et il se trouve que la vraie relation entre Y et X1, ..., Xn n'était pas linéaire, nous pourrions être en mesure pour fixer le modèle en transformant les X en quelque sorte, puis en ajustant le modèle. De plus, s'il arrivait que X1, ..., XN n'affecte pas y indépendamment des autres fonctionnalités, nous pourrions également être en mesure d'améliorer le modèle en incluant des termes d'interaction, x1 * x3 ou x1 * x4 * x7 ou quelque chose de similaire. Ainsi, dans le cas linéaire, les termes d'interaction peuvent apporter de la valeur en corrigeant les violations de non-linéarité ou d'indépendance entre la réponse et les caractéristiques.

Cependant, Random Forests ne fait pas vraiment ces hypothèses. L'inclusion de termes d'interaction est-elle importante lors de l'ajustement d'une forêt aléatoire? Ou l'inclusion des termes individuels et le choix des paramètres appropriés permettront-ils aux forêts aléatoires de saisir ces relations?

mt88
la source

Réponses:

15

Bien que l'ingénierie des fonctionnalités soit très importante dans la vie réelle, les arbres (et les forêts aléatoires) sont très bons pour trouver les termes d'interaction du formulaire x*y. Voici un exemple de jouet d'une régression avec une interaction bidirectionnelle. Un modèle linéaire naïf est comparé à un arbre et un sac d'arbres (ce qui est une alternative plus simple à une forêt aléatoire).

Comme vous pouvez le voir, l'arbre en soi est assez bon pour trouver l'interaction mais le modèle linéaire n'est pas bon dans cet exemple.

# 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"))

entrez la description de l'image ici

Flet
la source
4
Très agréable. Avez-vous un article que vous pourriez recommander sur le sujet? Merci
Steinbock