임의 포리스트에 상호 작용 용어 포함


15

반응 Y와 예측 변수 X1, ...., Xn이 있다고 가정합니다. X1, ...., Xn의 선형 모델을 통해 Y를 맞추려고했는데 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.