Bao gồm các điều khoản tương tác trong rừng ngẫu nhiên


15

Giả sử chúng ta có đáp ứng Y và các yếu tố dự đoán X1, ...., Xn. Nếu chúng ta cố gắng điều chỉnh Y thông qua mô hình tuyến tính của X1, ...., Xn và điều đó đã xảy ra rằng mối quan hệ thực sự giữa Y và X1, ..., Xn không phải là tuyến tính, chúng ta có thể có thể để sửa mô hình bằng cách chuyển đổi X bằng cách nào đó và sau đó khớp mô hình. Ngoài ra, nếu X1, ..., XN không ảnh hưởng đến y độc lập với các tính năng khác, chúng tôi cũng có thể cải thiện mô hình bằng cách bao gồm các điều khoản tương tác, x1 * x3 hoặc x1 * x4 * x7 hoặc một cái gì đó tương tự. Vì vậy, trong trường hợp tuyến tính, các thuật ngữ tương tác có thể mang lại giá trị bằng cách sửa các vi phạm phi tuyến tính hoặc độc lập giữa phản hồi và các tính năng.

Tuy nhiên, Rừng ngẫu nhiên không thực sự đưa ra những giả định này. Là bao gồm các điều khoản tương tác quan trọng khi phù hợp với Rừng ngẫu nhiên? Hoặc sẽ chỉ bao gồm các điều khoản riêng lẻ và chọn các tham số phù hợp cho phép Rừng ngẫu nhiên nắm bắt các mối quan hệ này?

Câu trả lời:


15

Mặc dù kỹ thuật tính năng rất quan trọng trong cuộc sống thực, nhưng cây (và rừng ngẫu nhiên) rất giỏi trong việc tìm kiếm các điều khoản tương tác của biểu mẫu x*y. Dưới đây là một ví dụ đồ chơi về hồi quy với tương tác hai chiều. Một mô hình tuyến tính ngây thơ được so sánh với một cái cây và một túi cây (là một thay thế đơn giản hơn cho một khu rừng ngẫu nhiên.)

Như bạn có thể thấy, bản thân cây khá tốt trong việc tìm kiếm sự tương tác nhưng mô hình tuyến tính không tốt trong ví dụ này.

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

nhập mô tả hình ảnh ở đây


4
Rất đẹp. Bạn có một bài báo mà bạn có thể giới thiệu về chủ đề này? Cảm ơn
steinbock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.