9

人工データセットの 10 倍交差検証を使用して、いくつかのトレーニング セットとテスト セットの作成を開始しました。

rows <- 1000

X1<- sort(runif(n = rows, min = -1, max =1))
occ.prob <- 1/(1+exp(-(0.0 + 3.0*X1)))
true.presence <- rbinom(n = rows, size = 1, prob = occ.prob)

# combine data as data frame and save
data <- data.frame(X1, true.presence)

id <- sample(1:10,nrow(data),replace=TRUE)
ListX <- split(data,id) 
fold1 <- data[id==1,] 
fold2 <- data[id==2,] 
fold3 <- data[id==3,] 
fold4 <- data[id==4,] 
fold5 <- data[id==5,] 
fold6 <- data[id==6,] 
fold7 <- data[id==7,] 
fold8 <- data[id==8,] 
fold9 <- data[id==9,] 
fold10 <- data[id==10,] 

trainingset <- subset(data, id %in% c(2,3,4,5,6,7,8,9,10))
testset <- subset(data, id %in% c(1))

これを達成するためのより簡単な方法があるかどうか、およびクラスの事前確率 (true.presence) がすべてのフォールドでほぼ同じであることを保証する層別交差検証を実行する方法があるかどうか疑問に思っています。

4

4 に答える 4

23

createFoldscaretパッケージのメソッドは、階層化されたパーティショニングを実行します。ヘルプページの段落は次のとおりです。

... ランダム サンプリングは、y が分割内のクラス分布のバランスをとろうとする要因である場合、y (=結果) のレベル内で行われます。

これがあなたの問題の答えです:

library(caret)
folds <- createFolds(factor(data$true.presence), k = 10, list = FALSE)

そして比率:

> library(plyr)
> data$fold <- folds
> ddply(data, 'fold', summarise, prop=mean(true.presence))
     fold      prop
1       1 0.5000000
2       2 0.5050505
3       3 0.5000000
4       4 0.5000000
5       5 0.5000000
6       6 0.5049505
7       7 0.5000000
8       8 0.5049505
9       9 0.5000000
10     10 0.5050505
于 2014-05-15T09:36:05.767 に答える
11

(a) これをコーディングするためのより効率的な方法があり、(b) パッケージのどこかに折り畳みを返すだけの関数がほぼ確実にあると確信していますが、ここにいくつかの簡単なコードを示します。これを行うかもしれません:

rows <- 1000

X1<- sort(runif(n = rows, min = -1, max =1))
occ.prob <- 1/(1+exp(-(0.0 + 3.0*X1)))
true.presence <- rbinom(n = rows, size = 1, prob = occ.prob)

# combine data as data frame and save
dat <- data.frame(X1, true.presence)

require(plyr)
createFolds <- function(x,k){
    n <- nrow(x)
    x$folds <- rep(1:k,length.out = n)[sample(n,n)]
    x
}

folds <- ddply(dat,.(true.presence),createFolds,k = 10)

#Proportion of true.presence in each fold:
ddply(folds,.(folds),summarise,prop = sum(true.presence)/length(true.presence))

   folds      prop
1      1 0.5049505
2      2 0.5049505
3      3 0.5100000
4      4 0.5100000
5      5 0.5100000
6      6 0.5100000
7      7 0.5100000
8      8 0.5100000
9      9 0.5050505
10    10 0.5050505
于 2012-05-01T15:47:53.173 に答える