2012-02-13 90 views
8

我正在試驗R和randomForest包,我有一些SVM和神經網絡的經驗。 我的第一個測試是嘗試並回歸:sin(x)+高斯噪聲。 使用神經網絡和svm,我獲得了sin(x)的一個「相對」很好的近似值,所以噪聲被濾除,學習算法不會過度擬合。 (爲體面的參數) 當在randomForest上做同樣的事情時,我有一個完全過度的解決方案。 我只是使用(R 2.14.0,試圖在2.14.1過,以防萬一):RandomResorest R中的迴歸

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) 

我想有一個隨機森林魔法選項,使其正常工作,我嘗試了一些,但我沒有找到正確的拉桿...

回答

3

您可以使用限制樹的大小, (如手冊中的示例所示)。

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

這是我嘗試的選項之一,它給出了稍微好一點的結果,但它仍然看起來非常糟糕,與svm和nn相比...必須有更好的選項... – user1206729 2012-02-14 13:42:34

+2

有趣的事情之一機器學習是沒有一種萬能的方法。某些類型的算法適用於不同類型的數據。不幸的是,我還沒有找到一個資料來源概述哪種方法最適合哪些數據集,因此幾乎完全依賴於試驗和錯誤。 – screechOwl 2012-04-25 15:45:48

1

可以做得更好(RMSE〜0.04,$ R^2 $> 0.99),通過小樣本或bites訓練個別樹木Breiman稱他們

既然有顯著量訓練數據中的噪聲,這個問題實際上是關於平滑而不是泛化。在一般的機器學習術語中,這需要越來越正規化。對於整體學習者來說,這意味着交易的多樣性。

隨機森林的多樣性可以通過減少每個分割的候選特徵(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 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

我的直覺是:

  • 如果你有一個簡單的決策樹來擬合1維曲線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) 

注意RMSE如果你取N變小 '= 10 * N和n'= 10 * N。