randomForest 与 randomForestSRC 差异

机器算法验证 r 随机森林
2022-03-15 22:34:05

Breiman (2001) 介绍了两个流行的 R 包来构建随机森林:randomForest 和 randomForestSRC。即使我尝试使用相同的输入参数,我也注意到两个包之间在准确性方面存在微小但显着的差异。我知道我们希望随机森林略有不同,但在下面的示例中,randomForestSRC 包始终优于 randomForest 包。我猜还有其他例子可以证明 randomForest 更胜一筹。有人可以解释为什么这些包提供不同的预测吗?有没有办法使用相同的方法为两个包生成随机森林?

在示例中,没有丢失数据,所有值都是不同的,mtry=1,并且树一直生长到 nodesplit=5。我相信也使用了相同的引导方法和拆分规则。增加模拟数据集中的 ntree 或观察数不会改变两个包之间的相对差异。

library(randomForest)
library(randomForestSRC)

set.seed(130948) #Other seeds give similar comparative results
x1<-runif(1000)
y<-rnorm(1000,mean=x1,sd=.3)
data<-data.frame(x1=x1,y=y)

#Compare MSE using OOB samples based on output
(modRF<-randomForest(y~x1,data=data,ntree=500,nodesize=5))
(modRFSRC<-rfsrc(y~x1,data=data,ntree=500,nodesize=5))

#Compare MSE using a test sample
x1new<-runif(10000)
ynew<-rnorm(10000,mean=x1new,sd=.3)
newdata<-data.frame(x1=x1new,y=ynew)

mean((predict(modRF,newdata=newdata)-newdata$y)^2) #MSE using randomForest
    mean((predict(modRFSRC,newdata=newdata)$predicted-newdata$y)^2) #MSE using randomForestSRC
2个回答

包产生不同结果的原因之一是节点大小在内部实现的方式。在 randomForest 中,该值似乎是一个严格的下限。在 randomForestSRC 中,虽然我们(很遗憾)没有记录其中的细微之处,但我们不会尝试在一个节点中没有至少 2 * 个节点大小的副本的情况下拆分一个节点。但是当我们这样做时,它可能会导致一个女儿 <nodesize,而另一个女儿 >= nodesize。我们可以说的是,我们在森林中的“平均”终端节点的大小 = 节点大小。结果是我们可以在“相同”设置下种植比 RF 略好的树。

如果您设置 nodesize = 1 以避免此问题,并通过使用多个模拟生长多个森林来适应蒙特卡洛效应,您会发现两个包的 MSE 是一致的。

我很喜欢randomForestSRC它有一些非常好的情节和诊断。

如何实现算法有很多选择。例如,查看帮助页面,rfsrc有一个splitrule,其中“默认规则是加权均方误差拆分 mse”。怎么randomForest做?它们每个都可以控制树的大小,但有两种不同的方式:一种是指定最大叶子数,另一种是指定最大深度。有几十个这样的选择,其中一些作为参数公开(我提到的两个),但很多不是。

所以我不能确切地告诉你为什么它们会产生不同的结果,但随机森林不是像 OLS 这样的封闭形式,也不是优化 (MLE) 过程。它本质上更具算法性,因此没有数学上的理由会迫使他们同意。

你为什么要问?您只是在寻找解释吗?您关于强制相同答案的问题让我认为您正在做速度基准测试,并希望比较速度以获得完全相同的答案。或者更明确的东西。

编辑:好的,根据您的评论,我建议您将问题更改为关于悖论并记录您所做的事情和结果。

我的猜测是,就 RV 实际上有助于结果而言,这是因为添加 RV 可能会削弱 RF 更喜欢将连续或分类变量拆分为多个级别的影响。如果是这样,尝试具有零(通常,确定性)和非零(随机拆分)的 RVrandomForestSRC可能split会说明这一点。