在R中进行随机森林交叉验证

7

我正在使用R语言开发随机森林模型,并希望为我的模型添加10折交叉验证。但是我在这方面遇到了一些困难。

以下是我的代码示例:

install.packages('randomForest')
library(randomForest)
set.seed(123)
fit <- randomForest(as.factor(sickrabbit) ~ Feature1,..., FeatureN ,data=training1, importance=TRUE,sampsize = c(200,300),ntree=500)

我在网上找到了caret中的函数rfcv,但我不确定它是如何工作的。有人可以帮助解释一下这个函数,或者提出更容易实现交叉验证的方法吗?是否可以使用随机森林包而不是caret来实现呢?


我的理解是,一个正确构建的随机森林模型不需要交叉验证,因为森林中的每棵树都是用袋外样本构建的,并针对未使用的剩余样本进行了检查。你为什么想要进行交叉验证呢? - Tim Biegeleisen
我的数据集有点小,大约50个特征和10000个样本。数据集也非常不平衡,总样本中只有200个对应于类别1,其余的属于类别2。更不用说我还要保留30%的数据用于测试最终模型的未见过的数据。我想使用k折交叉验证来通过更好地选择特征来提高模型性能。 - Rita A. Singer
我认为你不理解随机森林的基本原理。你的数据集并不小;我花了几年时间对比你的数据集小一个数量级的制药数据进行RF分析,从未遇到过问题。通常情况下,你不需要交叉验证RF模型;用于构建森林的算法已经隐式地为你完成了这个过程。 - Tim Biegeleisen
对于不平衡的数据,默认的随机森林(RF)OOB-CV可能不令人满意,因为模型很容易只预测最常见的类别。我建议使用分层(strata)或类别权重(classweight)选项。使用交叉验证的AUC来决定哪些设置对于您的目标是有希望的。 - Soren Havelund Welling
嗨,Soren,据我所知,我正在使用strata。如果未指定strata,则strata和sampsize将一起工作,类标签“as.factor(sickrabbit)”将被使用。 - Rita A. Singer
1个回答

8
您不需要对随机森林模型进行交叉验证。由于randomForest软件包没有设计用于此目的,因此您可能遇到困难。
以下是Breiman官方文档中的一段摘录:
在随机森林算法中,不需要进行交叉验证或单独的测试集来获取测试集误差的无偏估计。它将在运行期间进行内部估计,具体方法如下:
每个树都是使用原始数据的不同自助样本构建的。约有三分之一的实例被留在自助样本之外,并未用于第k棵树的构建。
将在第k棵树的构建过程中留下的每个实例放入第k棵树以获得分类结果。通过这种方式,大约三分之一的树将为每个实例提供一个测试集分类结果。在运行结束时,j被认为是每个n的oob(out-of-bag)投票次数最多的类。在所有案例上平均计算,j不等于n的真实类的比例就是oob误差估计值。在许多测试中,这被证明是无偏的。

1
非常感谢您的帖子。这是一个非常清晰的解释。 - Rita A. Singer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接