La preelaborazione è necessaria prima della previsione utilizzando FinalModel di RandomForest con pacchetto di inserimento?


12

Uso il pacchetto di cursore per allenare un oggetto 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"))

Successivamente, testare randomForest su un testSet (nuovi dati)

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

La matrice di confusione mi mostra che il modello non è poi così male.

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 

Ora voglio provare $ finalModel e penso che dovrebbe darmi lo stesso risultato, ma in qualche modo ricevo

> 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 

Cosa mi sto perdendo?

modifica @topepo:

Ho anche imparato un altro randomForest senza l'opzione pre-elaborata e ho ottenuto un altro risultato:

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     

nel primo caso, hai predetto con un oggetto treno che hai chiamato RFFit, nella seconda volta in cui hai predetto l'utilizzo dell'oggetto modello, immagino. Quindi la differenza potrebbe essere nel passare altre cose insieme all'oggetto train che ha elaborato i nuovi dati di test in qualche modo in modo diverso rispetto a quando non si utilizza l'oggetto train.
dottorato

4
Per il 2 ° trainmodello otterrai un risultato leggermente diverso a meno che tu non imposti il ​​seme del numero casuale prima di eseguirlo (vedi ?set.seed). I valori di precisione sono 0,8135 e 0,8111, che sono piuttosto vicini e solo a causa della casualità del ricampionamento e dei calcoli del modello.
topepo

Risposte:


17

La differenza è la pre-elaborazione. predict.traincentra e ridimensiona automaticamente i nuovi dati (dal momento che lo hai richiesto) mentre predict.randomForestprende tutto ciò che viene fornito. Poiché le suddivisioni dell'albero sono basate sui valori elaborati, le previsioni saranno disattivate.

Max


ma l' RFFitoggetto viene creato con il trainmetodo preelaborato ... quindi dovrebbe restituire un oggetto centrato e ridimensionato (non dovrebbe?). Se è così -> $finalModeldovrebbe anche essere ridimensionato e centrato
Frank

2
Sì, ma, secondo il codice sopra, non hai applicato il centraggio e il ridimensionamento testSet. predict.trainlo fa ma predict.randomForestnon lo fa.
topepo

quindi non c'è differenza nell'uso predict(RFFit$finalModel, testSet)e predict(RFFit, testSet)sullo stesso testSet?
Frank,

6
predict(RFFit$finalModel, testSet)e predict(RFFit, testSet)sarà diverso se si utilizza l' preProcopzione in train. In caso contrario, si stanno allenando sullo stesso set di dati. In altre parole, qualsiasi pre-elaborazione richiesta viene eseguita sul set di allenamento prima della corsa randomForest. Ha inoltre applicato la stessa pre-elaborazione a tutti i dati previsti (utilizzando predict(RFFit, testSet)). Se si utilizza l' finalModeloggetto, si utilizza al predict.randomForestposto di predict.traine nessuna delle preelaborazioni viene eseguita prima della previsione.
topepo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.