2013-01-22 21 views
9

我有一個關於caret函數庫rfe函數的問題。在脫字符號主頁link它們得到下列RFE算法: algorithmR插頁/ rfe工作中的火車交叉驗證如何

對於這個例子我使用rfe功能與3倍交叉驗證,並用線性SVM和5倍的列車功能交叉驗證。

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") 
  • 從上面我假定算法將與2嵌套交叉驗證的工作算法:
    1. rfe將所述數據(150個樣本)分成3倍
    2. train函數將使用5倍交叉驗證在訓練集(100個樣本)上運行以調整模型參數 - 隨後使用RFE。

什麼讓我困惑的是,當我拿上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是120個樣本,我希望大小爲80。

因此,如果有人能夠澄清如何運作rf列車一起工作,那將是非常好的。

乾杯

> 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產生的訓練數據。所以第一套訓練集= 150/3 * 2,第二個100/100 * 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返回的類對象。

那麼什麼是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,因此lapply(rf1$fit$control$index, length)返回120是正確的,因爲我們必須計算150/5 * 4 = 120。