R中的随机森林交叉验证

Posted

技术标签:

【中文标题】R中的随机森林交叉验证【英文标题】:Random Forest Crossvalidation in R 【发布时间】:2015-10-16 16:53:49 【问题描述】:

我正在研究 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)

我在网上找到了插入符号中的函数rfcv,但我不确定它是如何工作的。任何人都可以帮助使用此功能或提出一种更简单的方法来实现交叉验证。你能用随机森林包代替插入符号吗?

【问题讨论】:

我的理解是,正确构建的随机森林模型不需要交叉验证,因为森林中的每棵树都是用袋外样本构建的,并与未使用的剩余样本进行检查。为什么要交叉验证? 我的数据集的大小有点小,大约 50 个特征和 10000 个样本。数据集也非常不平衡,只有 200 个样本总数对应于 1 类,其余的对应于 2 类。所有这些都没有提到我必须单独保留 30% 的数据,以便用看不见的数据测试最终模型。我想使用 k 折交叉验证通过更好地选择特征来提高模型性能。 我认为您不了解随机森林的基本前提。您的数据集不小;我花了数年时间对药物数据进行射频分析,比您的数据集 一个数量级,从来没有遇到过问题。您通常交叉验证 RF 模型;用于构建森林的算法隐含地为您执行此操作。 对于不平衡的数据,默认的 RF OOB-CV 可能不令人满意,因为模型很容易只预测最流行的类别。我建议使用分层或分类权重选项。使用经过交叉验证的 AUC 来决定哪些设置对您的目标有希望。 嗨,Soren,据我所知,我正在使用 Strata。如果未指定 Strata,Strata 和 sampsize 结合使用,将使用类标签“as.factor(sickrabbit)”。 【参考方案1】:

您无需交叉验证随机森林模型。你被 randomForest 包卡住了,因为它不是为此而设计的。

这是来自Breiman's official documentation的sn-p:

在随机森林中,无需交叉验证或单独的测试集即可获得测试集误差的无偏估计。在运行期间内部估计如下:

每棵树都是使用与原始数据不同的引导样本构建的。大约三分之一的案例被排除在 bootstrap 样本之外,并且没有用于第 k 树的构建。

将第k棵树构造中遗漏的每个案例放到第k棵树下,得到一个分类。以这种方式,在大约三分之一的树中为每个案例获得一个测试集分类。在运行结束时,将 j 设为每次 case n 为 oob 时获得最多选票的类。 j 不等于 n 的真实类别在所有情况下的平均比例是 oob 误差估计。这已在许多测试中证明是公正的。

【讨论】:

非常感谢您的帖子。这是一个非常清楚的解释。

以上是关于R中的随机森林交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

是否有必要同时运行具有交叉验证的随机森林

Spark 随机森林交叉验证错误

树的随机森林数和交叉验证

sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)

如何在 scikit-learn 中执行随机森林模型的交叉验证?

随机森林怎样才能高耗时?