Einschließlich Interaktionsbegriffe in zufälliger Gesamtstruktur

15

Angenommen, wir haben eine Antwort Y und Prädiktoren X1, ...., Xn. Wenn wir versuchen würden, Y über ein lineares Modell von X1, ..., Xn anzupassen, und es wäre einfach so, dass die wahre Beziehung zwischen Y und X1, ..., Xn nicht linear wäre, könnten wir in der Lage sein um das Modell zu reparieren, indem man die X irgendwie transformiert und dann das Modell anpasst. Darüber hinaus könnten wir das Modell möglicherweise verbessern, indem wir die Interaktionsterme x1 * x3 oder x1 * x4 * x7 einbeziehen, wenn X1, ..., XN y nicht unabhängig von den anderen Features beeinflusst oder so ähnlich. Im linearen Fall können Interaktionsterme einen Wert bringen, indem Verstöße gegen die Nichtlinearität oder Unabhängigkeit zwischen der Antwort und den Merkmalen behoben werden.

Zufällige Wälder gehen jedoch nicht wirklich von diesen Annahmen aus. Ist das Einbeziehen von Interaktionsbegriffen wichtig, wenn Sie einen zufälligen Wald anpassen? Oder können zufällige Wälder nur die einzelnen Begriffe einbeziehen und geeignete Parameter auswählen, um diese Beziehungen zu erfassen?

mt88
quelle

Antworten:

15

Obwohl Feature-Engineering im wirklichen Leben sehr wichtig ist, können Bäume (und zufällige Wälder) sehr gut Interaktionsterme der Form finden x*y. Hier ist ein Spielzeugbeispiel für eine Regression mit einer wechselseitigen Interaktion. Ein naives lineares Modell wird mit einem Baum und einer Baumtüte verglichen (was eine einfachere Alternative zu einem zufälligen Wald darstellt).

Wie Sie sehen, kann der Baum die Wechselwirkung ziemlich gut finden, aber das lineare Modell ist in diesem Beispiel nicht gut.

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

Bildbeschreibung hier eingeben

Flunder
quelle
4
Sehr schön. Haben Sie einen Artikel, den Sie zu diesem Thema empfehlen könnten? Danke
Steinbock