随机森林调整 - 树深度和树数

random forest tuning - tree depth and number of trees

我有关于调整随机森林分类器的基本问题。树的数量和树的深度之间有什么关系吗?树的深度是否必须小于树的数量?

对于大多数实际问题,我同意蒂姆的观点。

然而,其他参数确实会影响集成误差何时作为添加树的函数收敛。我想限制树的深度通常会使整体收敛得早一点。我很少 fiddle 树深度,因为虽然计算时间减少了,但它不会带来任何其他好处。降低 bootstrap 样本大小都会减少 运行 时间和较低的树相关性,因此通常在可比较的 run-time 下具有更好的模型性能。 一个没有提到的技巧:当 RF 模型解释的方差低于 40%(看似嘈杂的数据)时,可以将样本量降低到 ~10-50% 并将树增加到例如5000(通常不必要的很多)。集成误差稍后将作为树的函数收敛。但是,由于较低的树相关性,模型变得更加稳健并且将达到较低的 OOB 错误水平收敛平台。

你看到下面的 samplesize 给出了最好的长 运行 收敛,而 maxnodes 从较低的点开始但收敛较少。对于这种嘈杂的数据,限制 maxnodes 仍然比默认 RF 更好。对于低噪声数据,通过降低 maxnodes 或样本大小来减少方差不会由于 lack-of-fit.

而增加偏差

对于许多实际情况,如果您只能解释 10% 的方差,您会直接放弃。因此默认 RF 通常很好。如果您是量化分析师,可以在数百或数千个头寸上下注,5-10% 的解释方差就很棒了。

绿色曲线是最大节点,有点像树的深度,但不完全是。

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")

的确,通常更多的树会导致更好的准确性。然而,更多的树也意味着更多的计算成本,并且在一定数量的树之后,改进可以忽略不计。 Oshiro 等人的一篇文章。 (2012) 指出,基于他们对 29 个数据集的测试,在 128 棵树之后没有显着改善(这与 Soren 的图表一致)。

关于树的深度,标准随机森林算法在不修剪的情况下生长出完整的决策树。单个决策树确实需要修剪以克服过度拟合问题。然而,在随机森林中,通过随机选择变量和 OOB 动作消除了这个问题。

参考: Oshiro, T.M., Perez, P.S.和 Baranauskas,J.A.,2012 年 7 月。随机森林中有多少棵树?在 MLDM(第 154-168 页)中。

我同意 Tim 的观点,即树的数量和树的深度之间没有拇指比。通常,您需要尽可能多的树来改进您的模型。更多的树也意味着更多的计算成本,并且在一定数量的树之后,改进可以忽略不计。如下图所示,一段时间后,即使我们增加树的数量,错误率也没有显着改善。

树的深度意味着你想要的树的长度。较大的树可以帮助您传达更多信息,而较小的树会提供不太精确的信息 info.So 深度应该足够大以将每个节点拆分为您想要的观察数量。

下面是 Iris 数据集的短树(叶节点=3)和长树(叶节点=6)的示例:与长树(叶节点= 6).

短树(叶节点=3):

长树(叶节点=6):

这完全取决于你的数据集。

我有一个例子,我在成人收入数据集上构建随机森林分类器并减少树的深度(从 42 到 6)提高了模型的性能。减少树深度的副作用是 How can I reduce the long feature vector which is a list of double values? 模型大小(保存后在 RAM 和磁盘中 space)

关于树的数量,我在 OpenML-CC18 基准测试中对 72 个分类任务进行 experiment,我发现:

  • 数据行越多,需要的树越多,
  • 最佳性能是通过以 1 树精度调整树的数量获得的。训练大型随机森林(例如 1000 棵树),然后使用验证数据找到最佳树数。