2013-01-22 9 views
9

Ho una domanda riguardante la funzione rfe dalla libreria caret. Sul punto di inserimento-homepage link danno il seguente algoritmo RFE: algorithmR caret/Come convalida incrociata per il treno all'interno di lavori

Per questo esempio sto usando la funzione rfe con 3 volte la convalida incrociata e la funzione di treno con un lineare SVM e 5 volte convalida incrociata.

library(kernlab) 
library(caret) 
data(iris) 

# parameters for the tune function, used for fitting the svm 
trControl <- trainControl(method = "cv", number = 5) 

# parameters for the RFE function 
rfeControl <- rfeControl(functions = caretFuncs, method = "cv", 
        number= 4, verbose = FALSE) 

rf1 <- rfe(as.matrix(iris[,1:4]), as.factor(iris[,5]) ,sizes = c(2,3) , 
      rfeControl = rfeControl, trControl = trControl, method = "svmLinear") 
  • Dal algoritmo sopra ho pensato che l'algoritmo funzionerebbe con 2 nidificate trasversali convalide:
    1. rfe sarebbe dividere i dati (150 campioni) in 3 pieghe
    2. la funzione train sarebbe essere eseguito sul set di addestramento (100 campioni) con 5 volte la convalida incrociata per mettere a punto i parametri del modello - con successiva RFE.

Ciò che mi confonde è che quando prendo uno sguardo sui risultati della funzione rfe:

> lapply(rf1$control$index, length) 
$Fold1 
[1] 100 
$Fold2 
[1] 101 
$Fold3 
[1] 99 

> lapply(rf1$fit$control$index, length) 
$Fold1 
[1] 120 
$Fold2 
[1] 120 
$Fold3 
[1] 120 
$Fold4 
[1] 120 
$Fold5 
[1] 120 

Da che sembra che la dimensione degli insiemi di formazione dal 5 volte cv è 120 campioni quando mi aspetterei una dimensione di 80. ??

quindi sarebbe bello se qualcuno potesse chiarire come RFE e treno lavoro insieme.

Acclamazioni

> sessionInfo() 
R version 2.15.1 (2012-06-22) 
Platform: i386-apple-darwin9.8.0/i386 (32-bit) 

locale: 
[1] C 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] pROC_1.5.4  e1071_1.6-1  class_7.3-5  caret_5.15-048 
[5] foreach_1.4.0 cluster_1.14.3 plyr_1.7.1  reshape2_1.2.1 
[9] lattice_0.20-10 kernlab_0.9-15 

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 compiler_2.15.1 grid_2.15.1  iterators_1.0.6 
[5] stringr_0.6.1 tools_2.15.1 
+1

5 volte il CV lascia un quinto del set di dati per ciascun braccio CV. Pertanto, ti alleni su 120 ogni volta e il set di prova sono i restanti 30 campioni. 30 campioni * 5 = 150 campioni. – tcash21

+0

Sì, ma in base alla descrizione dell'algoritmo, il 5-fold-CV dovrebbe essere applicato sui dati di allenamento risultanti da un 3-fold-cv. Quindi, 1 ° set di allenamento = 150/3 * 2, 2o 100/5 * 4 = 80. –

+0

@Fabian_G lo hai mai capito? Mi sto imbattendo nello stesso problema e stavo considerando di contattare topepo o presentare una segnalazione di bug. – Reilstein

risposta

0

Il problema qui è che lapply(rf1$fit$control$index, length) non memorizzare ciò che pensiamo che fa.

Per me capire che è stato necessario esaminare il codice. Quello che succede è il seguente:

Quando si chiama rfe l'intero dato viene passato a nominalRfeWorkflow.

Nel , il treno ei dati di prova suddivisi secondo rfeControl (nell'esempio 3 volte secondo la regola del CV triplo) vengono passati a rfeIter. Queste divisioni possiamo trovare nel nostro risultato sotto rf1$control$index.

In rfeIter i campioni di addestramento ~ 100 (il nostro esempio) vengono utilizzati per trovare le variabili finali (che è l'output di tale funzione). A quanto ho capito, i campioni da 50 test (il nostro esempio) sono usati per calcolare le prestazioni per i diversi set di variabili ma sono solo memorizzati come prestazioni esterne ma non usati per selezionare le variabili finali. Per la selezione di questi vengono utilizzate le stime delle prestazioni della convalida incrociata 5 volte. Ma non possiamo trovare questi indici nel risultato finale restituito da rfe. Se davvero ne abbiamo bisogno, dobbiamo recuperarli da fitObject$control$index in rfeIter, restituirli a nominalRfeWorkflow, quindi a rfe e da lì nel risultante rfe-Oggetto di classe restituito da rfe.

Quindi cosa viene memorizzato in lapply(rf1$fit$control$index, length)? - Quando rfe trova le variabili migliori, viene creato il modello finale adatto con le migliori variabili e i dati di riferimento completi (150). rf1$fit viene creato in rfe come segue:

fit <- rfeControl$functions$fit(x[, bestVar, drop = FALSE], y, first = FALSE, last = TRUE, ...)

Questa funzione è compatibile nuovamente la funzione train e fa una convalida incrociata finale con i dati completi di riferimento, la caratteristica finale impostato e trControl dato attraverso le ellissi (...) . Dato che il nostro trControl deve fare 5 volte CV è quindi corretto che lapply(rf1$fit$control$index, length) restituisce 120 poiché dobbiamo calcolare 150/5 * 4 = 120.

Problemi correlati