2017-12-24 8 views
0

私はいくつかのモデルを比較して、最良のモデルを得ています。今、ランダムフォレストモデルのOOBエラーを取得して、他のモデルの相互検証エラーと比較したいと考えています。比較はできますか?できる場合は、どのようにしてOOBエラーをRコードで取得できますか?ランダムフォレストのOOBを計算するには?

+0

try 'model $ err.rate [、1]' - i番目の要素は、i番目までのすべてのツリーのエラー率(OOB)です。副作用として、OOBはk倍のCVと相関する必要がありますが、モデル間のk倍のCVだけを比較します。 – missuse

+0

@missuseあなたの返信をありがとう!しかし、ランダムフォレストのk-fold cvを計算するにはどうすればよいですか?いくつかの人はrfcv()関数を使用しますが、ランダムフォレストを比較するためにcvエラーを計算するために使用されるようです。しかし、ランダム森林のcv誤差と尾根モデルのcv誤差を比較しなければならない。私に何ができる? – grace

答えて

5

RにおけるランダムフォレストモデルのOOBを取得するために、以下のことができます。

i番目の要素は、(OOB)誤り率である
model$err.rate[,1] 

library(randomForest) 

set.seed(1) 
model <- randomForest(Species ~ ., data = iris) 

OOBエラーがですi番目までのすべての木について。

一つは、それをプロットし、それは、RFモデルに対して定義されたプロット法でOOBと同じであるかどうかを確認することができる:

par(mfrow = c(2,1)) 
plot(model$err.rate[,1], type = "l") 
plot(model) 

enter image description here

OOBはハイパーパラメータmtryntreeをピッキングするために有用であるとk倍CVと相関する必要がありますが、k倍CVでテストされた異なるタイプのモデルとrfを比較するために使用すべきではありません。 OOBはk倍のCVとは対照的に、ほぼ自由であるため、k回実行するのには時間がかかります。

Rのk倍CVを実行する簡単な方法は次のとおり

folds <- sample(1:5, size = nrow(iris), replace = T) #5 fold CV 

をk倍CVを実行するために、ひだ(置き換えるkを有する5(正の整数> 1)定義します

このアプローチは、これは通常、大したことではない、(特に小規模なデータセットのために)同じサイズの折り目を与えることはありません

table(folds) 
#output 
1 2 3 4 5 
30 28 28 33 31 

は、この解決するために:。

folds <- sample(rep(1:5, length.out = nrow(iris)), size = nrow(iris), replace = F) 

table(folds) 
#output 
1 2 3 4 5 
30 30 30 30 30 

4回折りたたみのそれぞれについてモデルを訓練し、5回目の予測を実行します。ここでは、予測と実際の値を含むデータフレームのリストを返します。希望する統計を返すように呼び出しをカスタマイズすることができます。

CV_rf <- lapply(1:5, function(x){ #5 corresponds to the number of folds defined earlier 
    model <- randomForest(Species ~ ., data = iris[folds != x,]) 
    preds <- predict(model, iris[folds == x,], type="response") 
    return(data.frame(preds, real = iris$Species[folds == x])) 
    }) 

リッジモデルのパフォーマンスを得るために同じコードを使用できます。データフレームのデータフレームの

変換リスト:1/500(500用OOBが適合している間、

CV_rf <- do.call(rbind, CV_rf) 

チェック精度

caret::confusionMatrix(CV_rf$preds, CV_rf$real) 
#part of output: 
Overall Statistics 

       Accuracy : 0.9533   
       95% CI : (0.9062, 0.981) 
    No Information Rate : 0.3333   
    P-Value [Acc > NIR] : < 2.2e-16 

ので、ここで精度は0.9533

ですrfではデフォルトで)ツリーは:

model$err.rate[500,1] 
#OOB 
0.04666667 

彼らは私の意見を完全に打ち負かすのと同じですが、たとえば10倍のCVまたは3倍を実行しようとすると、同じではないことがわかります。

別のアプローチは、caretまたはmlrライブラリを使用することです。私はmlrを使用しませんが、caretはこのようなタスクには本当に良いです。キャレットとrfを使い始めるにはsomethingがあります。さらに、キャレットは優れたdocumentationです。パッケージを使用する予定がない場合でもおすすめできます。

+0

ありがとう!!!!!非常に非常に非常にありがとう! – grace

関連する問題