我有关于调整随机森林分类器的基本问题.树木的数量与树木深度之间是否有任何关系?树深度是否必须小于树木的数量?
Sor*_*ing 17
对于大多数实际问题,我同意蒂姆的观点.
然而,其他参数确实影响集合误差何时收敛作为添加树的函数.我想限制树的深度通常会使整体收敛得更早.我很少会使用树深度,就像计算时间降低一样,它不会给出任何其他奖励.降低bootstrap样本大小既可以降低运行时间,又可以降低树相关性,因此在相当的运行时间内通常可以获得更好的模型性能.一个没有提到的技巧:当RF模型解释方差低于40%(看似有噪声的数据)时,可以将样本量降低到~10-50%并将树木增加到例如5000(通常不需要很多).集合误差将在以后作为树的函数收敛.但是,由于较低的树相关性,模型变得更加稳健并且将达到较低的OOB误差水平收敛平台.
你看下面的samplesize给出了最好的长期收敛,而maxnodes从较低点开始但收敛较少.对于这种噪声数据,限制maxnodes仍然优于默认RF.对于低噪声数据,通过降低最大节点或样本大小来减小方差不会因缺乏拟合而导致偏差增加.
对于许多实际情况,如果你只能解释10%的方差,你就会放弃.因此默认RF通常很好.如果您的定量,可以在数百或数千个位置下注,5-10%解释方差是很棒的.
绿色曲线是maxnodes哪种树深度但不完全.
library(randomForest)
X = data.frame(replicate(6,(runif(1000)-.5)*3))
ySignal = with(X, X1^2 + sin(X2) + X3 + X4)
yNoise = rnorm(1000,sd=sd(ySignal)*2)
y = ySignal + yNoise
plot(y,ySignal,main=paste("cor="),cor(ySignal,y))
#std RF
rf1 = randomForest(X,y,ntree=5000)
print(rf1)
plot(rf1,log="x",main="black default, red samplesize, green tree depth")
#reduced sample size
rf2 = randomForest(X,y,sampsize=.1*length(y),ntree=5000)
print(rf2)
points(1:5000,rf2$mse,col="red",type="l")
#limiting tree depth (not exact )
rf3 = randomForest(X,y,maxnodes=24,ntree=5000)
print(rf2)
points(1:5000,rf3$mse,col="darkgreen",type="l")
Run Code Online (Sandbox Code Playgroud)
小智 11
确实,通常更多的树将产生更好的准确性.然而,更多的树也意味着更多的计算成本,并且在一定数量的树之后,这种改进可以忽略不计.Oshiro等人的一篇文章.(2012)指出,基于他们对29个数据集的测试,在128棵树之后没有显着的改进(这与Soren的图形一致).
关于树深度,标准随机森林算法在没有修剪的情况下生长完整的决策树.单个决策树确实需要修剪以克服过度拟合问题.但是,在随机森林中,通过随机选择变量和OOB操作来消除此问题.
参考文献:Oshiro,TM,Perez,PS和Baranauskas,JA,2012,July.随机森林中有多少棵树?在MLDM(第154-168页).
Ash*_*and 10
我同意 Tim 的观点,即树的数量和树的深度之间没有拇指比。通常,您需要尽可能多的树来改进您的模型。更多的树也意味着更多的计算成本,并且在一定数量的树之后,改进可以忽略不计。如下图所示,经过一段时间后,即使我们增加树的数量,错误率也没有显着改善。
树的深度意味着你想要的树的长度。较大的树可以帮助您传达更多信息,而较小的树会提供不太精确的信息。因此深度应该足够大以将每个节点拆分为您想要的观察数量。
下面是 Iris 数据集的短树(叶节点 = 3)和长树(叶节点 = 6)的示例:与长树(叶节点 = 6)相比,短树(叶节点 = 3)提供的信息不太精确。
短树(叶节点=3):
长树(叶节点=6):