在随机森林中包含交互项

机器算法验证 机器学习 随机森林
2022-02-12 22:19:32

假设我们有一个响应 Y 和预测变量 X1,....,Xn。如果我们试图通过 X1,....,Xn 的线性模型来拟合 Y,而恰好 Y 和 X1,...,Xn 之间的真实关系不是线性的,我们也许可以通过以某种方式转换 X 然后拟合模型来修复模型。此外,如果碰巧 X1,...,XN 不影响 y 独立于其他特征,我们还可以通过包含交互项 x1*x3 或 x1*x4*x7 来改进模型或类似的东西。因此,在线性情况下,交互项可能会通过修复响应和特征之间的非线性或独立性冲突来带来价值。

然而,随机森林并没有真正做出这些假设。在拟合随机森林时包括交互项重要吗?还是仅仅包括单个术语并选择适当的参数就可以让随机森林捕捉这些关系?

1个回答

尽管特征工程在现实生活中非常重要,但树(和随机森林)非常擅长寻找形式的交互项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"))

在此处输入图像描述