2016-04-18 14 views
8

キャレットが初めてのので、何をしているのかを完全に理解したいと思っています。その目的のために、method = "rf"のキャレットのtrain()関数を使用してrandomForest()モデルから得た結果を再現しようとしています。残念ながら、私は一致する結果を得ることができませんでした、私は何が見落としているのだろうかと思っています。randomForest()とキャレットのrandomForest(method = "rf")を使った結果が異なります。

また、randomForestがbootstrappingを使ってntreeのそれぞれに合わせてサンプルを生成し、out-of-bagの予測に基づいてエラーを推定すると、 "oob trainControl関数呼び出しで "boot"を実行します。これらのオプションは異なる結果を生成しますが、どちらもrandomForest()モデルと一致しません。

キャレット・パッケージのWebサイト(http://topepo.github.io/caret/index.html)と潜在的に関連すると思われるさまざまなStackOverflowの質問を読んだことがありますが、なぜキャレット・メソッド= "rf"モデルが異なる結果をもたらすのか理解できませんでしたrandomForest()からのあなたが提供できる可能性のあるあらゆる洞察に感謝します。

ここには、MASSパッケージのCO2データセットを使用した、複製可能な例があります。

library(MASS) 
data(CO2) 

library(randomForest) 
set.seed(1) 
rf.model <- randomForest(uptake ~ ., 
         data = CO2, 
         ntree = 50, 
         nodesize = 5, 
         mtry=2, 
         importance=TRUE, 
         metric="RMSE") 

library(caret) 
set.seed(1) 
caret.oob.model <- train(uptake ~ ., 
        data = CO2, 
        method="rf", 
        ntree=50, 
        tuneGrid=data.frame(mtry=2), 
        nodesize = 5, 
        importance=TRUE, 
        metric="RMSE", 
        trControl = trainControl(method="oob"), 
        allowParallel=FALSE) 

set.seed(1) 
caret.boot.model <- train(uptake ~ ., 
        data = CO2, 
        method="rf", 
        ntree=50, 
        tuneGrid=data.frame(mtry=2), 
        nodesize = 5, 
        importance=TRUE, 
        metric="RMSE", 
        trControl=trainControl(method="boot", number=50), 
        allowParallel=FALSE) 

print(rf.model) 
print(caret.oob.model$finalModel) 
print(caret.boot.model$finalModel) 

には、次のものが生成されます

プリント(rf.model)

 Mean of squared residuals: 9.380421 
       % Var explained: 91.88 

プリント(caret.oob.model $ finalModel)

 Mean of squared residuals: 38.3598 
       % Var explained: 66.81 

プリント(caret.boot.model $ finalModel)

 Mean of squared residuals: 42.56646 
       % Var explained: 63.16 

そして、変数の重要度を見てコード:

importance(rf.model) 

importance(caret.oob.model$finalModel) 

importance(caret.boot.model$finalModel) 
+0

ショートキャレットとrandomForestモデルの動作を調べましたか?両方が類似した重要度を持つ非常に類似した重要な予測子を示している場合、他のバリエーションについてあまり心配する必要はありません。 –

+0

こんにちはTim - あなたの時間と入力をありがとうございます。変数の重要性を見てきました(これを反映するために上記のコードを更新しました)、予測子の重みが異なります。たとえ体重がそれほど違っていなくても、私はまだその違いを引き起こしていたことを理解したいと思うでしょう。私が何かを説明できないとき、私はいつも私が知らないことを知らないことを心配しています! – ej5607

+1

列車で式インターフェイスを使用すると、要因がダミーに変換されます。 randomForestと比較するには、非数式インタフェースを使用する必要があります。例えば、 'train(CO2 [、-5]、CO2 $ uptake、method =" rf "、...)' –

答えて

5

電車の中で式インターフェースを使用してダミーの要因を変換します。 caretの結果をrandomForestと比較するには、非数式インターフェースを使用する必要があります。

trainControlの場合はrandomForestと同じ結果が得られるはずです。

Section trainingキャレットウェブページには、シードの使い方を説明する再現性に関する注意事項があります。あなたはリサンプリングを行っている場合

library("randomForest") 
set.seed(1) 
rf.model <- randomForest(uptake ~ ., 
         data = CO2, 
         ntree = 50, 
         nodesize = 5, 
         mtry = 2, 
         importance = TRUE, 
         metric = "RMSE") 

library("caret") 
caret.oob.model <- train(CO2[, -5], CO2$uptake, 
         method = "rf", 
         ntree = 50, 
         tuneGrid = data.frame(mtry = 2), 
         nodesize = 5, 
         importance = TRUE, 
         metric = "RMSE", 
         trControl = trainControl(method = "oob", seed = 1), 
         allowParallel = FALSE) 

、あなたはそれぞれのリサンプリングの繰り返し、最終的なモデルのための追加のいずれかの種を提供しなければなりません。 ?trainControlの例では、それらを作成する方法を示しています。

次の例では、最後のシードは最終モデル用で、1に設定します。正しく

seeds <- as.vector(c(1:26), mode = "list") 

# For the final model 
seeds[[26]] <- 1 

caret.boot.model <- train(CO2[, -5], CO2$uptake, 
          method = "rf", 
          ntree = 50, 
          tuneGrid = data.frame(mtry = 2), 
          nodesize = 5, 
          importance = TRUE, 
          metric = "RMSE", 
          trControl = trainControl(method = "boot", seeds = seeds), 
          allowParallel = FALSE) 

Definig trainControlcaretと種子と非式インタフェースあなたはすべての3つのモデルで同じ結果を取得します:あなたの実際のデータを使用してモデルにあなたを再現しようとしているの

rf.model 
caret.oob.model$final 
caret.boot.model$final 
+0

ありがとう、Lluís!それは完璧に働いた! – ej5607

+0

モデルによって説明される二乗残差と分散の平均は、randomForestモデルとキャレットモデルの間で正確に一致します。しかし、非数式インターフェースであっても、%IncMSE予測子の重要度の見積もりは変わりません。何がこれを説明するかもしれない? – ej5607

+0

重要度(rf.model)、重要度(caret.oob.model $ finalModel)、重要度(caret.boot.model $ finalModel)に同じ結果が得られます。 –

関連する問題