在R中进行回归的随机森林

8
我正在使用R和randomForest包进行实验,我有一些支持向量机和神经网络的经验。我的第一个测试是尝试回归: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个回答

4
你可以使用maxnodes来限制树的大小,就像手册中的示例一样。
r <- randomForest(Y~.,data=mat, maxnodes=10)
plot(x,predict(r,mat),col="green")
points(x,y)

那是我尝试过的其中一种选项,它给出了稍微好一些的结果,但与支持向量机和神经网络相比仍然很差...肯定还有更好的选项组合... - user1206729
2
机器学习的有趣之处在于没有一种适用于所有情况的方法。不同类型的算法适用于不同类型的数据。不幸的是,我还没有找到一个指明哪种方法最适合哪种数据集的来源,因此几乎完全依赖试错。 - screechOwl

1
你可以通过在小样本或者bite(Breiman所说的)上训练单个树来取得更好的效果(rmse ~ 0.04,$R^2$ > 0.99)。由于训练数据中存在大量噪音,因此这个问题实际上是关于平滑而不是泛化。从一般的机器学习术语来看,这需要增加正则化。对于集成学习器来说,这意味着要以多样性为代价来换取强度。
随机森林的多样性可以通过减少每个分割点的候选特征数量(R中的mtry)或每个树的训练集(R中的sampsize)来增加。由于只有一个输入维度,mtry没有帮助,只能使用sampsize。这导致RMSE比默认设置提高了3.5倍,并且比嘈杂的训练数据本身提高了6倍以上。由于增加多样性意味着增加个体学习器预测的方差,我们还需要增加树的数量来稳定集成预测。
小包,多树 :: 均方根误差 = 0.04:
>sd(predict(randomForest(Y~.,data=mat, sampsize=60, nodesize=2,
                         replace=FALSE, ntree=5000),
            mat)
    - sin(x))
[1] 0.03912643

默认设置 :: 均方根误差=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

0

我的直觉是:

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

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

因此,我建议您调整节点大小参数。如果您有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会变小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接