如何在 R 中执行随机森林/交叉验证

Posted

技术标签:

【中文标题】如何在 R 中执行随机森林/交叉验证【英文标题】:How to perform random forest/cross validation in R 【发布时间】:2013-11-14 15:01:10 【问题描述】:

我无法找到对我正在尝试生成的回归随机森林模型执行交叉验证的方法。

所以我有一个数据集,其中包含 1664 个解释变量(不同的化学性质)和一个响应变量(保留时间)。我正在尝试生成回归随机森林模型,以便能够根据保留时间预测某物的化学性质。

ID  RT (seconds)    1_MW    2_AMW   3_Sv    4_Se
4281    38  145.29  5.01    14.76   28.37
4952    40  132.19  6.29    11  21.28
4823    41  176.21  7.34    12.9    24.92
3840    41  174.24  6.7 13.99   26.48
3665    42  240.34  9.24    15.2    27.08
3591    42  161.23  6.2 13.71   26.27
3659    42  146.22  6.09    12.6    24.16

这是我拥有的表格的一个示例。我想基本上针对 1_MW 等(最多 1664 个变量)绘制 RT,所以我可以找到这些变量中哪些是重要的,哪些不是。

我愿意:-

r = randomForest(RT..seconds.~., data = cadets, importance =TRUE, do.trace = 100)
varImpPlot(r)

它告诉我哪些变量很重要,哪些不重要,这很好。但是,我希望能够对我的数据集进行分区,以便对其执行交叉验证。我找到了一个在线教程,解释了如何做到这一点,但针对的是分类模型而不是回归。

我知道你这样做:-

k = 10
n = floor(nrow(cadets)/k)
i = 1
s1 = ((i-1) * n+1)
s2 = (i * n)
subset = s1:s2

定义要进行多少次交叉折叠,以及每个折叠的大小,并设置子集的起始值和结束值。但是,我不知道以后该怎么办。我被告知要循环,但老实说我不知道​​该怎么做。我也不知道如何将验证集和测试集绘制到同一张图上以描绘准确度/错误水平。

如果您能帮我解决这个问题,我将不胜感激,谢谢!

【问题讨论】:

如果您仍然对 R 中的 CV 感兴趣,至少有一对:caret 和 cvTools 【参考方案1】:

来自source:

袋外 (oob) 误差估计

在随机森林中,不需要交叉验证或单独的 测试集以获得测试集误差的无偏估计。它是 内部估计,在运行期间...

特别是,如果newdata 没有给出,predict.randomForest 返回袋外预测。

【讨论】:

【参考方案2】:

作为 topchef pointed out,交叉验证并不是防止过度拟合的必要条件。这是随机森林算法的一个很好的特性。

听起来您的目标是特征选择,交叉验证对此仍然有用。查看 randomForest 包中的 rfcv() 函数。文档指定了数据框和向量的输入,因此我将从使用您的数据创建它们开始。

set.seed(42)
x <- cadets
x$RT..seconds. <- NULL
y <- cadets$RT..seconds.

rf.cv <- rfcv(x, y, cv.fold=10)

with(rf.cv, plot(n.var, error.cv))

【讨论】:

这个函数真的做交叉验证吗?它不是显示与使用的变量数量有关的错误吗?

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

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

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

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

Spark 随机森林交叉验证错误

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

r语言randomforest包下载不了