Termasuk Ketentuan Interaksi di Hutan Acak

15

Misalkan kita memiliki respons Y dan prediktor X1, ...., Xn. Jika kita mencoba mencocokkan Y melalui model linier X1, ...., Xn, dan kebetulan saja bahwa hubungan yang benar antara Y dan X1, ..., Xn tidak linier, kita mungkin dapat untuk memperbaiki model dengan mengubah X entah bagaimana dan kemudian menyesuaikan model. Selain itu, jika kebetulan bahwa X1, ..., XN tidak memengaruhi Anda secara independen dari fitur-fitur lain, kami juga mungkin dapat meningkatkan model dengan memasukkan istilah interaksi, x1 * x3 atau x1 * x4 * x7 atau semacamnya. Jadi dalam kasus linear, istilah interaksi mungkin memberikan nilai dengan memperbaiki pelanggaran non-linearitas atau independensi antara respons dan fitur.

Namun, Random Forest tidak benar-benar membuat asumsi ini. Apakah memasukkan istilah interaksi penting ketika memasang Hutan Acak? Atau akankah hanya memasukkan ketentuan individual dan memilih parameter yang sesuai memungkinkan Hutan Acak menangkap hubungan ini?

mt88
sumber

Jawaban:

15

Meskipun rekayasa fitur sangat penting dalam kehidupan nyata, pohon (dan hutan acak) sangat baik dalam menemukan istilah interaksi bentuk x*y. Berikut adalah contoh mainan dari regresi dengan interaksi dua arah. Model linear naif dibandingkan dengan pohon dan sekantong pohon (yang merupakan alternatif yang lebih sederhana daripada hutan acak).

Seperti yang Anda lihat, pohon itu sendiri cukup bagus dalam menemukan interaksi tetapi model linier tidak baik dalam contoh ini.

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

masukkan deskripsi gambar di sini

Flounderer
sumber
4
Sangat bagus. Apakah Anda punya kertas yang bisa Anda rekomendasikan tentang masalah ini? Terima kasih
steinbock