我正在尝试使用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中有一个神奇的选项可以使它正常工作,我尝试了一些,但我找不到合适的杠杆来拉...
答案 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)的良好近似值,您需要在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会变小。