簡體   English   中英

隨機森林回歸-累積MSE?

[英]Random forest regression - cumulative MSE?

我是Random Forests的新手,我對回歸有疑問。 我正在使用R包randomForests計算RF模型。

我的最終目標是選擇對預測連續性狀很重要的變量集,因此,我正在計算一個模型,然后刪除平均精度降低幅度最小的變量,然后計算一個新模型,依此類推。 這適用於RF分類,我使用了來自預測(訓練集),開發和驗證數據集的OOB錯誤對模型進行了比較。 現在,通過回歸,我想根據解釋的%variation和MSE比較模型。

我正在評估MSE和%var解釋的結果,當使用model$predicted的預測手動計算時,得到的結果完全相同。 但是,當我執行model$mse ,給出的值對應於最后計算的樹的MSE值,%var解釋也是如此。

例如,您可以在R中嘗試以下代碼:

library(randomForest)
data("iris")
head(iris)

TrainingX<-iris[1:100,2:4] #creating training set - X matrix
TrainingY<-iris[1:100,1]  #creating training set - Y vector

TestingX<-iris[101:150,2:4]  #creating test set - X matrix
TestingY<-iris[101:150,1]  #creating test set - Y vector

set.seed(2)

model<-randomForest(x=TrainingX, y= TrainingY, ntree=500, #calculating model
                    xtest = TestingX, ytest = TestingY)

#for prediction (training set)

pred<-model$predicted

meanY<-sum(TrainingY)/length(TrainingY)

varpY<-sum((TrainingY-meanY)^2)/length(TrainingY)

mseY<-sum((TrainingY-pred)^2)/length(TrainingY)

r2<-(1-(mseY/varpY))*100

#for testing (test set)

pred_2<-model$test$predicted

meanY_2<-sum(TestingY)/length(TestingY)

varpY_2<-sum((TestingY-meanY_2)^2)/length(TestingY)

mseY_2<-sum((TestingY-pred_2)^2)/length(TestingY)

r2_2<-(1-(mseY_2/varpY_2))*100

training_set_mse<-c(model$mse[500], mseY)
training_set_rsq<-c(model$rsq[500]*100, r2)
testing_set_mse<-c(model$test$mse[500],mseY_2)
testing_set_rsq<-c(model$test$rsq[500]*100, r2_2)

c<-cbind(training_set_mse,training_set_rsq,testing_set_mse, testing_set_rsq)
rownames(c)<-c("last tree", "by hand")
c
model

因此,運行此代碼后,您將獲得一個表,其中包含MSE和%var說明(也稱為rsq)的值。 第一行稱為“最后一棵樹”,其中包含森林中第500棵樹的MSE和%var的值。 第二行稱為“手工”,它包含基於向量model$predictedmodel$test$predicted在R中計算的結果。

因此,我的問題是:

1-樹的預測是否以某種方式累積? 還是它們彼此獨立? (我以為他們是獨立的)

2-是否將最后一棵樹視為所有其他樹的平均值?

3-為什么MSE和%var解釋的RF模型(在調用model時顯示在主板上)與第500個樹中的model相同(請參閱表的第一行)? 向量model$msemodel$rsq包含累積值?

在最后一次編輯后,我發現了來自Andy Liaw(軟件包的創建者之一)的帖子,其中說MSE和%var的解釋實際上是累積的!: https : //stat.ethz.ch/pipermail/r-help/ 2004-April / 049943.html

不確定我了解您的問題是什么; 我還是試試看...

1-樹的預測是否以某種方式累積? 還是它們彼此獨立? (我以為他們是獨立的)

您的想法正確; 樹木彼此獨立,因此它們的預測確實是獨立的。 實際上,這是RF模型的關鍵優勢,因為它允許並行實現。

2-是否將最后一棵樹視為所有其他樹的平均值?

沒有 如上所述, 所有樹木都是獨立的。

3-如果每棵樹都有預測,那么我如何獲得所有樹的矩陣,因為我需要為森林解釋MSE和%var?

鑒於上面的代碼,這就是您真正開始不清楚的地方。 您說您需要的MSE和r2正是您在mseYr2中已經計算的:

mseY
[1] 0.1232342

r2
[1] 81.90718

毫不奇怪,這是model報告的值完全相同:

model
# result:

Call:
 randomForest(x = TrainingX, y = TrainingY, ntree = 500) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 0.1232342
                    % Var explained: 81.91

所以我不確定我是否真的能看到您的問題,或者這些值與“所有樹木的矩陣”有什么關系...

但是,當我執行model$mse ,給出的值對應於最后計算的樹的MSE值,%var解釋也是如此。

最肯定不是model$mse是一個長度等於樹數(此處為500)的向量,其中包含每棵樹的MSE; (請參見下面的UPDATE)我在實踐中從未見過任何用處(類似於model$rsq ):

length(model$mse)
[1] 500

length(model$rsq)
[1] 500

更新 :對OP本身表示model$rsq (請參閱評論),他發現model$msemodel$rsq數量確實是累積的 (!); 由軟件包維護者Andy Liaw從一個舊的(2004)線程中提取,從RandomForest中提取了MSE和%方差

幾種方法:

  1. 閱讀?randomForest,尤其是“ Value”部分。
  2. 查看str(myforest.rf)。
  3. 查看print.randomForest。

如果森林中有100棵樹,則mse和rsq是分別具有100個元素的向量,第i個元素是由前i個樹組成的森林的mse(或rsq)。 因此,最后一個元素是整個森林的mse(或rsq)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM