![](/img/trans.png)
[英]Is Gradient Boosting regression be more accurate (lower MSE) than the random forest?
[英]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$predicted
和model$test$predicted
在R中計算的結果。
因此,我的問題是:
1-樹的預測是否以某種方式累積? 還是它們彼此獨立? (我以為他們是獨立的)
2-是否將最后一棵樹視為所有其他樹的平均值?
3-為什么MSE和%var解釋的RF模型(在調用model
時顯示在主板上)與第500個樹中的model
相同(請參閱表的第一行)? 向量model$mse
或model$rsq
包含累積值?
在最后一次編輯后,我發現了來自Andy Liaw(軟件包的創建者之一)的帖子,其中說MSE和%var的解釋實際上是累積的!: https : //stat.ethz.ch/pipermail/r-help/ 2004-April / 049943.html 。
不確定我了解您的問題是什么; 我還是試試看...
1-樹的預測是否以某種方式累積? 還是它們彼此獨立? (我以為他們是獨立的)
您的想法正確; 樹木彼此獨立,因此它們的預測確實是獨立的。 實際上,這是RF模型的關鍵優勢,因為它允許並行實現。
2-是否將最后一棵樹視為所有其他樹的平均值?
沒有 如上所述, 所有樹木都是獨立的。
3-如果每棵樹都有預測,那么我如何獲得所有樹的矩陣,因為我需要為森林解釋MSE和%var?
鑒於上面的代碼,這就是您真正開始不清楚的地方。 您說您需要的MSE和r2正是您在mseY
和r2
中已經計算的:
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解釋也是如此。
最肯定不是 : (請參見下面的UPDATE)我在實踐中從未見過任何用處(類似於model$mse
是一個長度等於樹數(此處為500)的向量,其中包含每棵樹的MSE;model$rsq
):
length(model$mse)
[1] 500
length(model$rsq)
[1] 500
更新 :對OP本身表示model$rsq
(請參閱評論),他發現model$mse
和model$rsq
數量確實是累積的 (!); 由軟件包維護者Andy Liaw從一個舊的(2004)線程中提取,從RandomForest中提取了MSE和%方差 :
幾種方法:
- 閱讀?randomForest,尤其是“ Value”部分。
- 查看str(myforest.rf)。
- 查看print.randomForest。
如果森林中有100棵樹,則mse和rsq是分別具有100個元素的向量,第i個元素是由前i個樹組成的森林的mse(或rsq)。 因此,最后一個元素是整個森林的mse(或rsq)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.