用于 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的主要内容,如果未能解决你的问题,请参考以下文章