用于 R 中回归的 RandomForest

Posted

技术标签:

【中文标题】用于 R 中回归的 RandomForest【英文标题】:RandomForest for Regression in R 【发布时间】:2012-03-04 20:35:20 【问题描述】:

我正在试验 R 和 randomForest 包,我对 SVM 和神经网络有一些经验。 我的第一个测试是尝试回归:sin(x)+gaussian noise。 使用神经网络和 svm,我获得了 sin(x) 的“相对”好的近似值,因此噪声被滤除并且学习算法不会过拟合。 (对于体面的参数) 在 randomForest 上做同样的事情时,我有一个完全过拟合的解决方案。 我只是使用(R 2.14.0,也在 2.14.1 上尝试过,以防万一):

library("randomForest")
x<-seq(-3.14,3.14,by=0.00628)
noise<-rnorm(1001)
y<-sin(x)+noise/4
mat<-matrix(c(x,y),ncol=2,dimnames=list(NULL,c("X","Y")))
plot(x,predict(randomForest(Y~.,data=mat),mat),col="green")
points(x,y)

我猜 randomForest 中有一个神奇的选项可以让它正常工作,我尝试了一些但我没有找到合适的拉杆......

【问题讨论】:

【参考方案1】:

您可以使用maxnodes 来限制树的大小, 如手册中的示例。

r <- randomForest(Y~.,data=mat, maxnodes=10)
plot(x,predict(r,mat),col="green")
points(x,y)

【讨论】:

这是我尝试过的选项之一,它给出了稍微好一点的结果,但与 svm 和 nn 相比,它似乎仍然很糟糕......必须有一组更好的选项......跨度> 机器学习的一个有趣之处在于,没有一种万能的方法。某些类型的算法更适合不同类型的数据。不幸的是,我还没有找到概述哪种方法最适合哪种数据集的来源,因此几乎完全依赖于反复试验。【参考方案2】:

通过在小样本或 bites 上训练单个树(正如 Breiman 所说的那样),您可以做得更好(rmse ~ 0.04, $R^2$ > 0.99)

由于训练数据中存在大量噪声,这个问题实际上是关于平滑而不是泛化。在一般机器学习方面,这需要增加正则化。对于集成学习者来说,这意味着用实力换取多样性。

可以通过减少每个分割的候选特征数量(R 中的mtry)或每棵树的训练集(R 中的sampsize)来增加随机森林的多样性。由于只有 1 个输入尺寸,mtry 没有帮助,留下sampsize。这导致 RMSE 比默认设置提高了 3.5 倍,并且比嘈杂的训练数据本身提高了 6 倍以上。由于增加的多样性意味着个体学习者预测的方差增加,我们还需要增加树的数量来稳定集成预测。

小袋子,更多树 :: rmse = 0.04:

>sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2,
                         replace=FALSE, ntree=5000),
            mat)
    - sin(x))
[1] 0.03912643

默认设置 :: rmse=0.14:

> sd(predict(randomForest(Y~.,data=mat),mat) - sin(x))
[1] 0.1413018

由于训练集中的噪声导致的错误 :: rmse = 0.25

> sd(y - sin(x))
[1] 0.2548882

由于噪声引起的错误当然是显而易见的

noise<-rnorm(1001)
y<-sin(x)+noise/4

在上面,评估是针对训练集进行的,就像在原始问题中一样。由于问题是平滑而不是泛化,这并不像看起来那么令人震惊,但令人欣慰的是,现成的评估显示出相似的准确性:

> sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2,
                          replace=FALSE, ntree=5000))
     - sin(x))
[1] 0.04059679

【讨论】:

【参考方案3】:

我的直觉是:

如果您有一个简单的决策树来拟合一维曲线 f(x),则相当于拟合楼梯函数(不一定具有等间距的跳跃) 使用随机森林,您可以对阶梯函数进行线性组合

要使楼梯函数成为 f(x) 的良好近似值,您需要在 x 轴上有足够的步长,但每一步都应包含足够多的点,以便它们的均值是 f(x) 的良好近似值且受影响较小通过噪音。

所以我建议你调整 nodesize 参数。如果您有 1 个决策树和 N 个点,并且 nodesize=n,那么您的楼梯函数将有 N/n 个步骤。 n 太小会导致过拟合。我用 n~30 (RMSE~0.07) 得到了不错的结果:

r <- randomForest(Y~.,data=mat, nodesize=30)
plot(x,predict(r,mat),col="green")
points(x,y)

请注意,如果您采用 N'=10*N 和 n'=10*n,则 RMSE 会变小。

【讨论】:

以上是关于用于 R 中回归的 RandomForest的主要内容,如果未能解决你的问题,请参考以下文章

R 与 scikit-learn 中用于线性回归 R2 的交叉验证

用于简单回归的 R 循环

r R中的自定义评估回归模型脚本用于Azure机器学习

R语言广义线性模型Logistic回归案例代码

R语言在逻辑回归中求R square R方

在R中logistic回归,对新的数据做预测出现新的层次,怎么办