我有一個關於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嵌套交叉驗證的工作算法:
rfe
將所述數據(150個樣本)分成3倍- 的
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
5倍CV會爲每個CV臂留出1/5的數據集。因此,您每次訓練120次,測試集是剩下的30個樣本。 30個樣本* 5 = 150個樣本。 – tcash21
是的,但根據算法的描述,5倍CV應該應用於3倍cv產生的訓練數據。所以第一套訓練集= 150/3 * 2,第二個100/100 * 4 = 80. –
@Fabian_G你有沒有想過這個?我遇到了同樣的問題,並正在考慮聯繫topepo或提交錯誤報告。 – Reilstein