캐럿 패키지와 함께 RandomForest의 FinalModel을 사용하여 예측 전에 사전 처리가 필요합니까?


12

10x10CV로 randomForest 객체를 훈련하기 위해 캐럿 패키지를 사용합니다.

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     

첫 번째 경우, 당신은 당신이 호출 한 기차 객체로 예측 RFFit했고, 두 번째로 모델 객체를 사용하여 예측했을 때, 나는 추측합니다. 따라서 새 테스트 데이터를 처리 한 기차 개체와 함께 다른 개체를 기차 개체를 사용하지 않는 방식과 다르게 전달할 때 차이가있을 수 있습니다.
박사

4
두 번째 train모델의 경우 실행하기 전에 난수 시드를 설정하지 않으면 약간 다른 결과를 얻을 수 있습니다 (참조 ?set.seed). 정확도 값은 0.8135 및 0.8111이며, 이는 리샘플링의 임의성과 모델 계산으로 인해 매우 가깝습니다.
topepo

답변:


17

차이점은 전처리입니다. predict.train새로운 데이터를 자동으로 중앙에 위치시키고 스케일을 조정합니다 (요청한 이후) predict.randomForest. 트리 분할은 처리 된 값을 기반으로하므로 예측이 해제됩니다.

맥스


그러나 RFFit객체는 preProcessed train메소드를 사용하여 생성 되므로 중심 및 크기 조정 된 객체를 반환해야합니다 (그렇지 않아야합니까?). 그렇다면-> $finalModel또한 스케일링되고 중심에 있어야 함
Frank

2
예, 그러나 위 코드에 따라에 센터링 및 스케일링을 적용하지 않았습니다 testSet. predict.train하지만 predict.randomForest그렇지 않습니다.
topepo

그래서 사용에는 차이가 없다 predict(RFFit$finalModel, testSet)predict(RFFit, testSet)같은 테스트 세트에이?
Frank

6
predict(RFFit$finalModel, testSet)그리고 predict(RFFit, testSet)당신이 사용하는 경우 다를 수 preProc있는 옵션을 train. 그렇지 않은 경우 동일한 데이터 세트에 대한 교육입니다. 다시 말해, 요청하는 모든 전처리는 실행 전에 훈련 세트에서 수행 randomForest됩니다. 또한을 사용하여 예측 한 모든 데이터에 동일한 사전 처리를 적용했습니다 predict(RFFit, testSet). finalModel오브젝트 를 사용하는 경우 predict.randomForest대신 사용 predict.train하고 있으며 사전 처리는 예측 전에 수행되지 않습니다.
topepo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.