2013-01-22 6 views
9

Mam pytanie dotyczące funkcji rfe z biblioteki caret. Na karetki-głównej link dają następujący algorytm RFE: algorithmR caret/Jak działa sprawdzanie krzyżowe dla pociągu w ramach pracy rfe

W tym przykładzie ja przy użyciu funkcji rfe z 3-krotnym krzyżowego i pociągu funkcji liniowej-SVM i 5-krotnie sprawdzanie poprawności krzyżowej.

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") 
  • z algorytmu powyżej że zakłada się, że algorytm współpracy z 2 zagnieżdżonych poprzecznych zatwierdzania:
    1. rfe pęknie danych (150 próbek) w 3 fałdy
    2. posiadają funkcję train byłoby uruchomić na zbiorze treningowym (100 próbek) z pięciokrotną weryfikacją krzyżową w celu dostrojenia parametrów modelu - z kolejnymi RFE.

Co mnie dezorientuje jest to, że gdy spojrzeć na wyniki funkcji 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 

Z tego wynika, że ​​wielkość zestawów szkoleniowych z 5-krotnie cv to 120 próbek, gdy spodziewam się rozmiaru 80.?

więc byłoby wspaniale, jeśli ktoś może wyjaśnić jak RFE i pociąg ze sobą współpracować.

Cheers

> 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-krotne CV pomija jedną piątą zestawu danych dla każdego ramienia CV. Dlatego trenujesz 120 za każdym razem, a zestaw testowy to pozostałe 30 próbek. 30 próbek * 5 = 150 próbek. – tcash21

+0

Tak, ale zgodnie z opisem algorytmu należy zastosować 5-krotne CV na danych treningowych wynikających z 3-krotnego CV. Tak więc pierwszy zestaw treningowy = 150/3 * 2, drugi 100/5 * 4 = 80. –

+0

@Fabian_G kiedykolwiek to rozgryzłeś? Pracuję nad tym samym problemem i rozważam skontaktowanie się z topepo lub zgłoszenie błędu. – Reilstein

Odpowiedz

0

Problem polega na tym, że lapply(rf1$fit$control$index, length) nie przechowuje to, co myślimy, że tak.

Dla mnie zrozumienie, że trzeba było zajrzeć do kodu. Co się dzieje, jest następujące:

Po wywołaniu rfe wszystkie dane są przekazywane do nominalRfeWorkflow.

W nominalRfeWorkflow, dane pociągu i testu podzielone według rfeControl (w naszym przykładzie 3 razy zgodnie z zasadą 3-krotnego CV) są przekazywane do rfeIter. Te rozbicia możemy znaleźć w naszym wyniku pod rf1$control$index.

W rfeIter ~ 100 próbek szkoleniowych (nasz przykład) służy do znalezienia ostatecznych zmiennych (które są wynikiem tej funkcji). Jak rozumiem, ~ 50 próbek testowych (nasz przykład) jest używanych do obliczenia wydajności dla różnych zestawów zmiennych, ale są one przechowywane tylko jako wydajność zewnętrzna, ale nie są używane do wybierania ostatecznych zmiennych. Do wyboru tych parametrów wykorzystywane są szacunkowe wyniki 5-krotnego sprawdzania poprawności krzyżowej. Ale nie możemy znaleźć tych wskaźników w ostatecznym wyniku zwróconym przez rfe. Jeśli naprawdę ich potrzebujemy, musimy pobrać je od fitObject$control$index w rfeIter, zwrócić je do nominalRfeWorkflow, a następnie do rfe, a stamtąd do uzyskanego obiektu rfe -Class zwróconego przez rfe.

Co jest przechowywane w lapply(rf1$fit$control$index, length)? - Gdy rfe znalazł najlepsze zmienne, ostateczne dopasowanie modelu jest tworzone z najlepszymi zmiennymi i pełnymi danymi odniesienia (150). rf1$fit utworzony w rfe następująco:

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

Funkcja ta ponownie uruchamia funkcję train i ma końcową walidacji krzyżowej z pełnych danych referencyjnych, końcowa funkcja ustawiania i trControl podane za pomocą elipsy (...) . Ponieważ nasz trControl ma wykonać pięciokrotne CV, poprawne jest to, że lapply(rf1$fit$control$index, length) zwraca 120, ponieważ musimy obliczyć 150/5 * 4 = 120.

Powiązane problemy