R中的回归RandomForest

时间:2012-02-13 12:32:45

标签: r regression random-forest

我正在尝试使用R和randomForest Package,我对SVM和神经网络有一些经验。 我的第一个测试是尝试和回归:sin(x)+高斯噪声。 使用神经网络和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中有一个神奇的选项可以使它正常工作,我尝试了一些,但我找不到合适的杠杆来拉...

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

你可以通过训练小样本上的单个树或bites作为布莱曼称之为

来做得更好(rmse~0.04,$ R ^ 2 $> 0.99)

由于训练数据中存在大量噪声,因此这个问题实际上是关于平滑而不是泛化。在一般的机器学习术语中,这需要增加正规化。对于整体学习者而言,这意味着交易力量的多样性。

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

小袋子,更多树木 :: 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

答案 2 :(得分:0)

我的直觉是:

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

对于阶梯函数是f(x)的良好近似值,您需要在x轴上有足够的步长,但每个步骤应包含足够的点,以使它们的平均值是f(x)的良好近似值并且受影响较小靠噪音。

所以我建议你调整nodesize参数。如果你有1个决策树和N个点,并且nodesize = 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会变小。