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?

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


4
Très agréable. Avez-vous un article que vous pourriez recommander sur le sujet? Merci
Steinbock
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.