2015-03-20 29 views
7

Prendo parte al corso di Apprendimento automatico della macchina di Coursera e il corso richiede la costruzione di modelli predittivi utilizzando questo dataset. Dopo suddividere i dati in training e testing set di dati, sulla base del risultato di interesse (la presente etichettati y, ma in realtà la variabile classe nell'insieme di dati):Perché i risultati utilizzando caret :: train (..., method = "rpart") differiscono da rpart :: rpart (...)?

inTrain <- createDataPartition(y = data$y, p = 0.75, list = F) 
training <- data[inTrain, ] 
testing <- data[-inTrain, ] 

Ho provato 2 diversi metodi:

modFit <- caret::train(y ~ ., method = "rpart", data = training) 
pred <- predict(modFit, newdata = testing) 
confusionMatrix(pred, testing$y) 

vs.

modFit <- rpart::rpart(y ~ ., data = training) 
pred <- predict(modFit, newdata = testing, type = "class") 
confusionMatrix(pred, testing$y) 

mi potrebbe supporre che darebbe identici o molto sI risultati milar, poiché il metodo iniziale carica il pacchetto 'rpart' (suggerendomi di usare questo pacchetto per il metodo). Tuttavia, i tempi (caret molto più lento) & risultati sono molto diversi:

Method 1 (caret):

Confusion Matrix and Statistics 

Reference 
Prediction A B C D E 
     A 1264 374 403 357 118 
     B 25 324 28 146 124 
     C 105 251 424 301 241 
     D 0 0 0 0 0 
     E 1 0 0 0 418 

Method 2 (rpart):

Confusion Matrix and Statistics 

Reference 
Prediction A B C D E 
     A 1288 176 14 79 25 
     B 36 569 79 32 68 
     C 31 88 690 121 113 
     D 14 66 52 523 44 
     E 26 50 20 49 651 

Come si può vedere, il secondo approccio è un classificatore meglio - il primo metodo è molto povero per le classi D & E.

Mi rendo conto che questo potrebbe non essere il posto più appropriato per porre questa domanda, ma apprezzerei davvero una maggiore comprensione di questo e dei problemi correlati. caret sembra un ottimo pacchetto per unificare i metodi e chiamare la sintassi, ma ora sono riluttante a usarlo.

risposta

8

caret in realtà fa un bel po 'di più sotto il cofano. In particolare, it uses cross-validation to optimize the model hyperparameters. Nel tuo caso, prova tre valori di cp (tipo modFit e vedrai i risultati di precisione per ciascun valore), mentre rpart utilizza solo 0,01 a meno che non lo dici diversamente (vedere ?rpart.control). La convalida incrociata richiederà anche più tempo, soprattutto dal momento che lo caret utilizza il bootstrap per impostazione predefinita.

Al fine di ottenere risultati simili, è necessario disabilitare la convalida incrociata e specificare cp:

modFit <- caret::train(y ~ ., method = "rpart", data = training, 
         trControl=trainControl(method="none"), 
         tuneGrid=data.frame(cp=0.01)) 

Inoltre, si dovrebbe utilizzare lo stesso seme casuale per entrambi i modelli.

Detto questo, la funzionalità aggiuntiva fornita da caret è una buona cosa e probabilmente dovresti semplicemente andare con caret. Se vuoi saperne di più, è ben documentato e l'autore ha un libro stellare, Applied Predictive Modeling.

+0

Grazie a @Peyton per la risposta, questo spiega e aiuta molto! –

Problemi correlati