¿Es necesario el preprocesamiento antes de la predicción usando FinalModel de RandomForest con el paquete de caret?

12

Utilizo el paquete caret para entrenar un objeto randomForest con 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"))

Después de eso, pruebo el randomForest en un testSet (nuevos datos)

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

La matriz de confusión me muestra que el modelo no es tan malo.

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 

Ahora quiero probar el $ finalModel y creo que debería darme el mismo resultado, pero de alguna manera recibo

> 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 

¿Qué me estoy perdiendo?

editar @topepo:

También aprendí otro randomForest sin la opción preProcessed y obtuve otro resultado:

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     
Franco
fuente
en primera instancia, pronosticaste con un objeto de tren al que llamaste RFFit, en la segunda vez que predijiste usar el objeto modelo, supongo. Entonces, la diferencia podría estar en pasar otras cosas junto con el objeto del tren que procesó sus nuevos datos de prueba de alguna manera diferente que sin usar el objeto del tren.
Doctorado
44
Para el segundo trainmodelo obtendrá un resultado ligeramente diferente a menos que establezca la semilla de número aleatorio antes de ejecutarlo (ver ?set.seed). Los valores de precisión son 0.8135 y 0.8111, que son bastante cercanos y solo debido a la aleatoriedad del remuestreo y los cálculos del modelo.
topepo

Respuestas:

17

La diferencia es el preprocesamiento. predict.traincentra y escala automáticamente los nuevos datos (ya que lo solicitó) mientras predict.randomForesttoma lo que se le da. Dado que las divisiones de árbol se basan en los valores procesados, las predicciones estarán apagadas.

Max

topepo
fuente
pero el RFFitobjeto se crea con el trainmétodo preProcesado ... por lo que debería devolver un objeto centrado y escalado (¿no?). Si es así -> el $finalModeltambién debe ser escalado y centrado
Frank
2
Sí, pero, de acuerdo con el código anterior, no ha aplicado el centrado y la escala testSet. predict.trainhace eso pero predict.randomForestno lo hace.
topepo
entonces no hay diferencia en usar predict(RFFit$finalModel, testSet)y predict(RFFit, testSet)en el mismo testSet?
Frank
66
predict(RFFit$finalModel, testSet)y predict(RFFit, testSet)será diferente si usa la preProcopción en train. Si no lo hace, están entrenando en el mismo conjunto de datos. En otras palabras, cualquier procesamiento previo que solicite se realiza en el conjunto de entrenamiento antes de la ejecución randomForest. También aplicó el mismo preprocesamiento a los datos que predice (usando predict(RFFit, testSet)). Si usa el finalModelobjeto, lo está usando en predict.randomForestlugar de predict.trainy ninguno de los procesos previos se realiza antes de la predicción.
topepo