我有关于调整随机森林分类器的基本问题。树木的数量与树木深度之间是否有任何关系?树深度是否必须小于树木的数量?
答案 0 :(得分:16)
对于大多数实际问题,我同意蒂姆的观点。
然而,其他参数确实会影响集合误差何时收敛作为添加树的函数。我想限制树的深度通常会使整体收敛得更早。我很少会使用树深度,就像计算时间降低一样,它不会给出任何其他奖励。降低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")
答案 1 :(得分:11)
通常,更多树木会产生更好的准确性。然而,更多的树也意味着更多的计算成本,并且在一定数量的树之后,这种改进可以忽略不计。 Oshiro等人的一篇文章。 (2012)指出,基于他们对29个数据集的测试,在128棵树之后没有显着的改进(这与Soren的图形一致)。
关于树深度,标准随机森林算法在没有修剪的情况下生成完整的决策树。单个决策树确实需要修剪以克服过度拟合问题。但是,在随机森林中,通过随机选择变量和OOB操作来消除此问题。
参考: Oshiro,T.M.,Perez,P.S。和Baranauskas,J.A.,2012年7月。随机森林中有多少棵树?在MLDM(第154-168页)中。
答案 2 :(得分:1)
我同意蒂姆的看法,树木数量与树木深度之间没有拇指之比。通常,您需要尽可能多的树以改善模型。更多的树也意味着更多的计算成本,并且在经过一定数量的树之后,这种改进是微不足道的。如下图所示,经过一段时间后,即使我们不增加树木,错误率也没有显着改善。
树的深度表示您想要的树的长度。较大的树可以帮助您传达更多的信息,而较小的树则可以提供较不精确的信息。因此,深度应足够大,以将每个节点拆分为所需的观测数目。
下面是鸢尾花数据集的短树(叶子节点= 3)和长树(叶子节点= 6)的示例:
短树(叶节点= 3):
长树(叶节点= 6):
答案 3 :(得分:0)
这完全取决于您的数据集。
我有一个示例,其中我在“成人收入”数据集上构建了“随机森林”分类器,并将树的深度(从42减少到6)改善了模型的性能。减少树的深度的副作用是How can I reduce the long feature vector which is a list of double values?模型大小(保存后在RAM和磁盘空间中)
关于树的数量,我在experiment上执行了OpenML-CC18基准测试中的72个分类任务,发现: