我认为您的问题很有趣,我花了一些时间研究随机森林(RF)模型拟合的有效映射曲率。RF 可以根据情况捕获一些交互顺序。x1 * x2 是双向交互,依此类推...您没有写出分类预测变量有多少级别。这很重要。对于连续变量(许多级别),通常只能捕获多个局部双向交互。问题是,RF 模型本身只拆分而不转换数据。因此,RF 受困于局部单变量拆分,这对于吸引交互来说不是最佳的。因此,与深度学习相比,RF 相当浅。在幽灵的另一端是二进制特征。我不知道射频能走多深,所以我运行了一个网格搜索模拟。RF 似乎可以捕获多达 4-8 个二进制特征的交互顺序。我使用 12 个二进制变量和 100 到 15000 个观察值。例如对于四阶交互,预测向量 y 是:
orderOfInteraction = 4
y = factor(apply(X[,1:orderOfInteraction],1,prod))
其中 X 的任何元素是 -1 或 1,并且 X 的前四个变量列的乘积是预测。所有四个变量都是完全互补的。因此,没有主效应、二阶或三阶效应。因此,OOB 预测误差将仅反映 RF 对 N 阶交互作用的吸引力。
使 RF 吸引更高阶交互的因素:大量观察、变量级别少、变量少
RF 吸引高阶的限制因素:与上述相反,有限的样本大小、有限的最大节点和冗余/足够的低阶信息。
最后一个意思是,如果 RF 可以在低阶交互中找到相同的信息,那么可以说,没有必要再深入了。信息甚至可能不是多余的。RF 必须足以做出正确的二进制预测。
随机森林的深度:OOB err.rate vs. 观察 vs. 交互顺序

rm(list=ls())
library(randomForest)
library(parallel)
library(rgl)
simulate.a.forest = function(std.pars,ite.pars) {
#Merge standard parameters with iterated parameters
run.pars = c(std.pars,ite.pars)
#simulate data of a given order
X = replicate(run.pars$vars,sample(c(-1,1),run.pars$obs,replace=T))
y = factor(apply(X[,1:run.pars$intOrder],1,prod))
#run forest with run.pars, pars with wrong name is ignored
rfo = do.call(randomForest, run.pars)
#Fetch OOB error.rate and return
out = rev(rfo$err.rate[,1])[1] #fetch error rate from object
names(out) = paste(ite.pars,collapse="-")[1]
return(out)
}
## Lets try some situations (you can also pass arguments to randomForest here)
intOrders = c(2,3,4,5,6,12) #hidden signal is a N-way interaction of Nth order
obss = c(100,500,1000,3500,7000,15000) #available observations
## Produce list of all possible combinations of parameters
ite.pars.matrix = expand.grid(intOrder=intOrders,obs=obss)
n.runs = dim(ite.pars.matrix)[1]
ite.pars.list = lapply(1:n.runs, function(i) ite.pars.matrix[i,])
i=1 ##for test-purposes
out = mclapply(1:n.runs, function(i){
#line below can be run alone without mclapply to check for errors before going multicore
out = simulate.a.forest(std.pars=alist(x=X,y=y,
ntree=250,
vars=12),
#sampsize=min(run.pars$obs,2000)),
ite.pars=ite.pars.list[[i]])
return(out)
})
##view grid results
persp3d(x = intOrders,xlab="Nth order interaction",
y = log(obss,base=10),ylab="10log(observations)",
z = matrix(unlist(out),nrow=length(intOrders)),zlab="OOB prediction error, binary target",
col=c("grey","black"),alpha=.2)
rgl.snapshot(filename = "aweSomePlot.png", fmt = "png", top = TRUE)