キャレットパッケージでRandomForestのFinalModelを使用して予測する前に前処理が必要ですか?


12

キャレットパッケージを使用して、randomForestオブジェクトを10x10CVでトレーニングします。

library(caret)
tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T) 
RFFit <- train(Defect ~., data=trainingSet, method="rf", trControl=tc, preProc=c("center", "scale"))

その後、testSetでrandomForestをテストします(新しいデータ)

RF.testSet$Prediction <- predict(RFFit, newdata=testSet)

混乱行列は、モデルがそれほど悪くないことを私に示しています。

confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
              Reference
    Prediction   0   1
             0 886 179
             1  53 126  

      Accuracy : 0.8135          
             95% CI : (0.7907, 0.8348)
No Information Rate : 0.7548          
P-Value [Acc > NIR] : 4.369e-07       

              Kappa : 0.4145 

$ finalModelをテストしたいのですが、同じ結果になるはずですが、どういうわけか受け取ります

> RF.testSet$Prediction <- predict(RFFit$finalModel, newdata=RF.testSet)
>  confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 323  66
         1 616 239

               Accuracy : 0.4518          
                 95% CI : (0.4239, 0.4799)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1               

                  Kappa : 0.0793 

何が欠けていますか?

@topepoを編集:

また、preProcessedオプションのない別のrandomForestを学び、別の結果を得ました。

RFFit2 <- train(Defect ~., data=trainingSet, method="rf", trControl=tc)
testSet$Prediction2 <- predict(RFFit2, newdata=testSet)
confusionMatrix(data=testSet$Prediction2, testSet$Defect)

Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 878 174
         1  61 131

               Accuracy : 0.8111          
                 95% CI : (0.7882, 0.8325)
    No Information Rate : 0.7548          
    P-Value [Acc > NIR] : 1.252e-06       

                  Kappa : 0.4167     

最初の例では、呼び出したtrainオブジェクトで予測しましたRFFitが、2番目の例では、モデルオブジェクトを使用して予測しました。したがって、違いは、新しいテストデータを処理するトレインオブジェクトと一緒に他のものを渡す場合に、トレインオブジェクトを使用しない場合とは多少異なる場合があります。
博士

4
2番目のtrainモデルでは、実行前に乱数シードを設定しない限り、少し異なる結果が得られます(を参照?set.seed)。精度の値は0.8135と0.8111です。これらはかなり近く、リサンプリングのランダム性とモデル計算によるものです。
topepo 2014年

回答:


17

違いは前処理です。predict.train新しいデータを自動的に中央に配置し、スケーリングします(要求されたため)predict.randomForest。ツリー分割は処理された値に基づいているため、予測はオフになります。

マックス


しかし、RFFitオブジェクトはpreProcessed trainメソッドで作成されます...そのため、オブジェクトは中央に配置され、スケーリングされたオブジェクトを返すはずです(そうではありませんか?)。その場合-> $finalModelスケールおよび中央揃えも必要です
フランク

2
はい。ただし、上記のコードによると、センタリングとスケーリングをに適用していませんtestSetpredict.trainそれはしますがpredict.randomForestしません。
topepo 2014年

同じテストセットでの使用predict(RFFit$finalModel, testSet)と違いはありませんpredict(RFFit, testSet)か?
フランク

6
predict(RFFit$finalModel, testSet)そしてpredict(RFFit, testSet)、あなたが使用している場合は異なるものになるpreProcでオプションをtrain。そうでない場合、彼らは同じデータセットでトレーニングしています。つまり、要求する前処理は、を実行する前にトレーニングセットに対して行われますrandomForest。また、(を使用してpredict(RFFit, testSet))予測するすべてのデータに同じ前処理を適用しました。finalModelオブジェクトを使用する場合、predict.randomForest代わりにを使用しており、predict.train予測の前に前処理は行われません。
topepo 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.