2015-09-10 43 views
0

我想設置的插入符的gafsControl()seeds,但我得到這個錯誤:插入符號 - 設置gafsControl()裏面的種子

Error in { : task 1 failed - "supplied seed is not a valid integer" 

我明白seedstrainControl()等於矢量重新採樣加一(在我的情況36,SVM與6西格瑪和6的成本值)中的每個(重採樣)項的數量,用模型的調整參數的組合數。但是,我無法弄清楚我應該使用什麼gafsControl()。我試過iters * popSize(100 * 10),iters(100),popSize(10),但沒有工作過。

在此先感謝。

這裏是我的代碼(使用模擬數據):

library(caret) 
library(doMC) 
library(kernlab) 

registerDoMC(cores=32) 

set.seed(1234) 
train.set <- twoClassSim(300, noiseVars = 100, corrVar = 100, corrValue = 0.75) 

mylogGA <- caretGA 
mylogGA$fitness_extern <- mnLogLoss 

#Index for gafsControl 
set.seed(1045481) 
ga_index <- createFolds(train.set$Class, k=3) 

#Seed for the gafsControl() 
set.seed(1056) 
ga_seeds <- vector(mode = "list", length = 4) 
for(i in 1:3) ga_seeds[[i]] <- sample.int(1500, 1000) 

## For the last model: 
ga_seeds[[4]] <- sample.int(1000, 1) 

#Index for the trainControl() 
set.seed(1045481) 
tr_index <- createFolds(train.set$Class, k=5) 

#Seeds for the trainControl() 
set.seed(1056) 
tr_seeds <- vector(mode = "list", length = 6) 
for(i in 1:5) tr_seeds[[i]] <- sample.int(1000, 36)# 

## For the last model: 
tr_seeds[[6]] <- sample.int(1000, 1) 


gaCtrl <- gafsControl(functions = mylogGA, 
         method = "cv", 
         number = 3, 
         metric = c(internal = "logLoss", 
           external = "logLoss"), 
         verbose = TRUE, 
         maximize = c(internal = FALSE, 
            external = FALSE), 
         index = ga_index, 
         seeds = ga_seeds, 
         allowParallel = TRUE) 

tCtrl = trainControl(method = "cv", 
        number = 5, 
        classProbs = TRUE, 
        summaryFunction = mnLogLoss, 
        index = tr_index, 
        seeds = tr_seeds, 
        allowParallel = FALSE) 


svmGrid <- expand.grid(sigma= 2^c(-25, -20, -15,-10, -5, 0), C= 2^c(0:5)) 

t1 <- Sys.time() 
set.seed(1234235) 
svmFuser.gafs <- gafs(x = train.set[, names(train.set) != "Class"], 
         y = train.set$Class, 
         gafsControl = gaCtrl, 
         trControl = tCtrl, 
         popSize = 10, 
         iters = 100, 
         method = "svmRadial", 
         preProc = c("center", "scale"), 
         tuneGrid = svmGrid, 
         metric="logLoss", 
         maximize = FALSE) 

t2<- Sys.time() 
svmFuser.gafs.time<-difftime(t2,t1) 

save(svmFuser.gafs, file ="svmFuser.gafs.rda") 
save(svmFuser.gafs.time, file ="svmFuser.gafs.time.rda") 

會議信息:

> sessionInfo() 
R version 3.2.2 (2015-08-14) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 14.04.3 LTS 

locale: 
[1] LC_CTYPE=en_CA.UTF-8  LC_NUMERIC=C    LC_TIME=en_CA.UTF-8  
[4] LC_COLLATE=en_CA.UTF-8  LC_MONETARY=en_CA.UTF-8 LC_MESSAGES=en_CA.UTF-8 
[7] LC_PAPER=en_CA.UTF-8  LC_NAME=C     LC_ADDRESS=C    
[10] LC_TELEPHONE=C   LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C  

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

other attached packages: 
[1] kernlab_0.9-22 doMC_1.3.3  iterators_1.0.7 foreach_1.4.2 caret_6.0-52 ggplot2_1.0.1 lattice_0.20-33 

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.0   magrittr_1.5  splines_3.2.2  MASS_7.3-43   munsell_0.4.2  
[6] colorspace_1.2-6 foreach_1.4.2  minqa_1.2.4   car_2.0-26   stringr_1.0.0  
[11] plyr_1.8.3   tools_3.2.2   parallel_3.2.2  pbkrtest_0.4-2  nnet_7.3-10   
[16] grid_3.2.2   gtable_0.1.2  nlme_3.1-122  mgcv_1.8-7   quantreg_5.18  
[21] MatrixModels_0.4-1 iterators_1.0.7  gtools_3.5.0  lme4_1.1-9   digest_0.6.8  
[26] Matrix_1.2-2  nloptr_1.0.4  reshape2_1.4.1  codetools_0.2-11 stringi_0.5-5  
[31] compiler_3.2.2  BradleyTerry2_1.0-6 scales_0.3.0  stats4_3.2.2  SparseM_1.7   
[36] brglm_0.5-9   proto_0.3-10  
> 

回答

2

我能夠通過檢查gafs.default找出我的錯誤。內部gafsControl()seeds需要vector與長度(n_repeats*nresampling)+1而不是list(如在trainControl$seeds)。這是?gafsControlseeds is a vector or integers that can be used to set the seed during each search. The number of seeds must be equal to the number of resamples plus one.我理解了它艱難地在文檔中居然說,這是一個提醒仔細閱讀文檔:d。

if (!is.null(gafsControl$seeds)) { 
     if (length(gafsControl$seeds) < length(gafsControl$index) + 
      1) 
      stop(paste("There must be at least", length(gafsControl$index) + 
      1, "random number seeds passed to gafsControl")) 
    } 
    else { 
     gafsControl$seeds <- sample.int(1e+05, length(gafsControl$index) + 
     1) 
    } 

所以,正確的方式來設置我的ga_seeds是:

#Index for gafsControl 
set.seed(1045481) 
ga_index <- createFolds(train.set$Class, k=3) 

#Seed for the gafsControl() 
set.seed(1056) 
ga_seeds <- sample.int(1500, 4) 
3

我不太熟悉你所提到的gafsControl()函數,但設置平行時,我遇到了一個非常類似的問題種子使用trainControl()。在說明中,它描述瞭如何創建一個列表(長度=重採樣次數+ 1),其中每個項目是一個列表(長度=要測試的參數組合的數量)。我發現這樣做不起作用(有關信息,請參閱topepo/caret issue#248)。但是,如果您然後將每個項目轉換爲矢量,例如

seeds <- lapply(seeds, as.vector) 

然後種子似乎工作(即模型和預測是完全可重現的)。我應該澄清,這是使用doMC作爲後端。其他並行後端可能會有所不同。

希望這有助於

+0

謝謝您的答覆。我設法找到了我的錯誤(請參閱下面的答案)。當它應該是一個'vector'時,我正在使用'list'。我也在使用'doMC'。 – howaj

0

如果這樣設置的種子就可以保證每個相同的特徵子集選擇運行?我問AMS GA因randominess

+0

一個很好的問題。我不這麼認爲。我認爲你需要爲所有人口/世代設置GA種子。所以,這就是爲什麼我首次使用一個列表('popSize * Iters',在我的情況下爲10 * 100)爲每個resample。但事實證明,'caret'只接受一個尺寸爲'(n_repeats * nresampling)+ 1'的向量。也許Max(插入符號的創建者)可以很好地證實這一點。 – howaj

+0

代碼sample.int(1000,36)似乎是錯誤的。一般的值是CVFolds +在你的情況下是41而不是36的參數的數量。您只考慮參數的數量。你認爲沒關係? – user3592007

+0

trainControl()的'種子'是一個大小爲'(n_repeats * nresampling)+ 1'的列表。列表中的每個條目'(n_repeats * nresampling)'都包含整數vector,長度等於模型的參數組合數(在我的情況下,支持6(Sigma值)* 6(Cost valuse) = 36.列表中的最後一項只是適合整個數據的最後一個(最佳)模型的一個整數。 – howaj

相關問題