8

我正在试验 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 中有一个神奇的选项可以让它正常工作,我尝试了一些,但我没有找到合适的拉杆......

4

3 回答 3

3

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

r <- randomForest(Y~.,data=mat, maxnodes=10)
plot(x,predict(r,mat),col="green")
points(x,y)
于 2012-02-13T12:50:38.477 回答
1

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

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

mtry通过减少每个分割的候选特征数量(在 R 中)或每棵树的训练集(在 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
于 2016-03-29T23:24:18.830 回答
0

我的直觉是:

  • 如果您有一个简单的决策树来拟合一维曲线 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 会变小。

于 2017-10-13T11:31:07.617 回答