2013-01-22 9 views
9

caret 라이브러리의 rfe 기능에 관한 질문이 있습니다. 이 예를 들어 algorithmR 캐럿/rfe 내의 열차에 대한 교차 유효성 검사는 어떻게합니까?

나는 3 배 교차 유효성 검사와 rfe 기능과 선형 SVM 5 배와 기차 기능을 사용하고 있습니다 : 캐럿 - 홈페이지 link 그들은 다음 RFE 알고리즘을 제공 교차 검증. 3 폴드

  • train 함수하고자로 데이터 (150 샘플)을 분할 할
    1. rfe : I는 알고리즘 2 중첩 교차 검증 작동한다고 가정 위 알고리즘에서
      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") 
      
      • 후속 RFE로 모델 파라미터를 조정하기 위해 5 배 십자가 유효성 확인을 사용하여 교육 세트 (100 개 샘플)에서 실행하십시오. 나를 혼란 무엇
  • 내가 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 
    

    을 그에서 나타나는 그 5 배에서 훈련 세트의 크기 cv는 80의 크기를 기대할 때 120 샘플입니다. ?? 사람이 어떻게 RFE기차 함께 작동 명확히 할 수 있다면

    는 그래서 좋은 것입니다.

    건배

    > 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 배 CV는 각 CV 암에 대한 데이터 세트의 1/5을 제거합니다. 따라서 매번 120 번씩 훈련을하고 나머지 30 개의 샘플을 테스트 세트로 사용합니다. 30 샘플 * 5 = 150 샘플. – tcash21

    +0

    예. 그러나 알고리즘의 설명에 따라 5 배 CV가 3 배 cv로 인한 훈련 데이터에 적용되어야합니다. 따라서 1 차 훈련 세트 = 150/3 * 2, 2 차 100/5 * 4 = 80. –

    +0

    @ Fabian_G 이것을 알아 냈습니까? 나는 같은 문제를 겪고 있으며, topepo에 연락하거나 버그 보고서를 제출하는 것을 고려하고 있었다. – Reilstein

    답변

    0

    문제는 여기에 lapply(rf1$fit$control$index, length)는 우리가하지 무슨 생각을 저장하지 않습니다.

    코드를 살펴볼 필요가 있다는 것을 이해하기 위해서. 다음과 같은 상황이 발생합니다.

    rfe으로 전화하면 전체 데이터는 nominalRfeWorkflow으로 전달됩니다.

    nominalRfeWorkflow에서 rfeControl (이 예에서는 3- 접힌 CV 규칙에 따라 3 번)에 따라 분할 된 열차 및 테스트 데이터는 rfeIter으로 전달됩니다. rf1$control$index에서 우리의 결과에서 찾을 수있는 이러한 분할.

    rfeIter에서 최종 변수 (해당 함수의 출력)를 찾기 위해 ~ 100 개의 학습 예제 (예제)를 사용합니다. 50 개의 테스트 샘플 (예제)은 다양한 변수 세트의 성능을 계산하는 데 사용되지만 외부 성능으로 만 저장되지만 최종 변수를 선택하는 데는 사용되지 않습니다. 이들을 선택하기 위해 5 배 교차 유효성 확인의 성능 추정치가 사용됩니다. 그러나 우리는 rfe에 의해 반환 된 최종 결과에서 이러한 인덱스를 찾을 수 없습니다. fitObject$control$index에서 rfeIter을 가져와 nominalRfeWorkflow으로 가져온 다음 rfe으로 가져와 rfe에서 반환 한 rfe -Class 개체를 반환해야합니다.

    그래서 무엇이 lapply(rf1$fit$control$index, length)에 저장되어 있습니까? - rfe이 가장 좋은 변수를 찾았을 때 최종 모형 적합은 최상의 변수와 전체 참조 데이터 (150)로 생성됩니다. 다음 rf1$fitrfe에서 생성된다

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

    이 함수는 다시 train 기능을 실행하고, 전체 기준 데이터와 최종 교차 검증을 수행 최종 기능 설정 trControl은 타원 통해 (...)를 소정 . 우리의 trControl은 5 배 CV를 수행하기 때문에, 150/5 * 4 = 120을 계산해야하므로 lapply(rf1$fit$control$index, length)은 120을 반환합니다.