Caret paketi ile RandomForest FinalModel'i kullanmadan önce ön işleme gerek var mı?


12

10x10CV ile randomForest nesnesini eğitmek için düzeltme paketi kullanıyorum.

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"))

Bundan sonra, rastgele bir testSet (yeni veri) üzerinde test

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

Karışıklık matrisi bana modelin o kadar da kötü olmadığını gösteriyor.

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 

Şimdi $ finalModel'i test etmek istiyorum ve bana aynı sonucu vereceğini düşünüyorum, ama her nasılsa

> 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 

Neyi kaçırıyorum?

@topepo düzenle:

Ayrıca önişleme seçeneği olmadan başka bir randomForest öğrendim ve başka bir sonuç aldım:

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     

ilk örnekte, aradığınız bir tren nesnesiyle tahmin ettiniz RFFit, ikinci kez model nesnesini kullanarak tahmin ettiğinizde, sanırım. Bu nedenle fark, yeni test verilerinizi işleyen tren nesnesiyle birlikte, tren nesnesini kullanmadan bir şekilde farklı şeyler aktarmak olabilir.
doktora

4
2. trainmodel için, rastgele sayı tohumunu çalıştırmadan önce ayarlamadığınız sürece biraz farklı bir sonuç elde edersiniz (bkz. ?set.seed). Doğruluk değerleri 0.8135 ve 0.8111'dir, bunlar oldukça yakındır ve sadece yeniden örneklemenin rastgele olması ve model hesaplamaları nedeniyle.
topepo

Yanıtlar:


17

Fark, ön işlemedir. predict.trainyeni verileri otomatik olarak ortalar ve ölçeklendirir (sizden istendiğinden beri) predict.randomForest, verilen her şeyi alır. Ağaç bölünmeleri işlenen değerlere dayandığından, tahminler kapalı olacaktır.

maksimum


ancak RFFitnesne preProcessed trainyöntemiyle oluşturulur ... bu yüzden ortalanmış ve ölçeklenmiş bir nesne döndürmelidir (değil mi?). Eğer öyleyse -> $finalModelda ölçeklendirilmeli ve ortalanmalıdır
Frank

2
Evet, ancak yukarıdaki koda göre, merkezleme ve ölçeklendirmeyi uygulamadınız testSet. predict.trainbunu yapar ama predict.randomForestyapmaz.
topepo

böylece aynı testSet predict(RFFit$finalModel, testSet)ve kullanma arasında bir fark yoktur predict(RFFit, testSet)?
Frank

6
predict(RFFit$finalModel, testSet)ve predict(RFFit, testSet)içindeki preProcseçeneği kullanırsanız farklı olacaktır train. Bunu yapmazsanız, aynı veri seti üzerinde eğitim alıyorlar. Başka bir deyişle, istediğiniz herhangi bir ön işlem, koşudan önce eğitim setine yapılır randomForest. Ayrıca, aynı ön işlemeyi (kullanarak predict(RFFit, testSet)) tahmin ettiğiniz tüm verilere uyguladı . Eğer kullanırsanız finalModelnesne, kullandığınız predict.randomForestyerine predict.trainve ön işleme hiçbiri tahmini önce yapılır.
topepo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.