O pré-processamento é necessário antes da previsão usando o FinalModel do RandomForest com pacote de interpolação?

12

Eu uso o pacote de intercalação para treinar um objeto randomForest com 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"))

Depois disso, testei o randomForest em um testSet (novos dados)

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

A matriz de confusão me mostra que o modelo não é tão ruim assim.

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 

Agora quero testar o $ finalModel e acho que ele deve me dar o mesmo resultado, mas de alguma forma recebo

> 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 

o que estou perdendo?

edit @topepo:

Também aprendi outra randomForest sem a opção preProcessed e obtive outro 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     
Frank
fonte
na primeira instância, você previu com um objeto de trem que chamou RFFit, na segunda vez que previu usando o objeto de modelo, eu acho. Portanto, a diferença pode estar na passagem de outras coisas junto com o objeto train que processou seus novos dados de teste de alguma maneira diferente do que sem o uso do objeto train.
doctorado
4
Para o segundo trainmodelo, você obterá um resultado ligeiramente diferente, a menos que defina a semente do número aleatório antes de executá-lo (consulte ?set.seed). Os valores de precisão são 0,8135 e 0,8111, que são bastante próximos e apenas devido à aleatoriedade da reamostragem e aos cálculos do modelo.
topepo

Respostas:

17

A diferença é o pré-processamento. predict.traincentraliza e dimensiona automaticamente os novos dados (desde que você solicitou isso) e predict.randomForestaceita o que for fornecido. Como as divisões da árvore são baseadas nos valores processados, as previsões serão desativadas.

Máx.

topepo
fonte
mas o RFFitobjeto é criado com o trainmétodo preProcessed ... então ele deve retornar um objeto centralizado e dimensionado (não deveria?). Se assim for -> o $finalModeltambém deve ser escalado e centrado
Frank
2
Sim, mas, de acordo com o código acima, você não aplicou a centralização e a escala testSet. predict.trainfaz isso, mas predict.randomForestnão faz.
Topepo
então não há diferença no uso predict(RFFit$finalModel, testSet)e predict(RFFit, testSet)no mesmo testSet?
Frank
6
predict(RFFit$finalModel, testSet)e predict(RFFit, testSet)será diferente se você usar a preProcopção train. Caso contrário, eles estão treinando no mesmo conjunto de dados. Em outras palavras, qualquer pré-processamento solicitado é feito no conjunto de treinamento antes da execução randomForest. Ele também aplicou o mesmo pré-processamento a todos os dados que você prevê (usando predict(RFFit, testSet)). Se você usar o finalModelobjeto, estará usando em predict.randomForestvez de predict.traine nenhum pré-processamento será feito antes da previsão.
Topepo