รวมถึงเงื่อนไขการโต้ตอบในป่าสุ่ม


15

สมมติว่าเรามีคำตอบ Y และตัวทำนาย X1, .... , Xn ถ้าเราพยายามทำให้พอดีกับ Y ผ่านโมเดลเชิงเส้นของ X1, .... , Xn และมันก็เกิดขึ้นที่ความสัมพันธ์ที่แท้จริงระหว่าง Y และ X1, ... , Xn ไม่เชิงเส้นเราอาจจะสามารถ เพื่อแก้ไขตัวแบบโดยการแปลง X ของมันให้เข้ากับโมเดล ยิ่งกว่านั้นถ้ามันเกิดขึ้นเมื่อ X1, ... , XN ไม่ได้ส่งผลกระทบต่อคุณสมบัติที่เป็นอิสระของ y อื่น ๆ เราก็อาจจะสามารถปรับปรุงรูปแบบโดยรวมถึงเงื่อนไขการโต้ตอบ x1 * x3 หรือ x1 * x4 * x7 หรืออะไรทำนองนั้น ดังนั้นในกรณีเชิงเส้นเงื่อนไขการโต้ตอบอาจนำมาซึ่งมูลค่าโดยการแก้ไขการไม่เป็นเชิงเส้นหรือการละเมิดความเป็นอิสระระหว่างการตอบสนองและคุณลักษณะ

อย่างไรก็ตามป่าสุ่มไม่ได้ตั้งสมมติฐานเหล่านี้ การรวมคำศัพท์ในการโต้ตอบมีความสำคัญหรือไม่เมื่อปรับป่าที่เหมาะสม หรือจะรวมถึงข้อกำหนดของแต่ละบุคคลและการเลือกพารามิเตอร์ที่เหมาะสมจะช่วยให้ป่าสุ่มจับความสัมพันธ์เหล่านี้?

คำตอบ:


15

แม้ว่าวิศวกรรมคุณลักษณะเป็นสิ่งสำคัญมากในชีวิตจริงต้นไม้ (และป่าสุ่ม) x*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"))

ป้อนคำอธิบายรูปภาพที่นี่


4
ดีมาก. คุณมีกระดาษที่คุณสามารถแนะนำเกี่ยวกับเรื่องนี้หรือไม่? ขอบคุณ
steinbock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.