10 배 교차 검증을 위해 데이터 세트를 분할하는 방법


14

이제 R데이터 프레임 (트레이닝)이 있습니다. 누구 든지이 데이터 세트를 무작위로 분할하여 10 배 교차 검증을 수행하는 방법을 말해 줄 수 있습니까?


2
만족스러운 정밀도를 얻으려면 전체 프로세스를 100 번 반복해야합니다.
Frank Harrell

케이스와 컨트롤 샘플을 별도로 샘플링 한 다음 각 블록에 결합해야합니다.
Shicheng Guo

caret :: train을 사용하면 신경 쓰지 않아도됩니다. 내부에서 수행되며 접기 수를 선택할 수 있습니다. "손으로"이 작업을 수행하려면 caret :: createFolds에 구현 된 클래스의 계층화 된 샘플링을 사용하십시오.
marbel

많은 답변 중 하나가 일반적인 통계적 관심사가 아닌 코딩 질문으로 만 취급하기 때문에이 스레드를 잠갔습니다.
whuber

답변:


22

caret 이것에 대한 기능이 있습니다 :

require(caret)
flds <- createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
names(flds)[1] <- "train"

그런 다음의 각 요소는 flds각 데이터 집합에 대한 인덱스 목록입니다. 데이터 세트가 호출되면 dat, 다음 dat[flds$train,], 당신에게 트레이닝 세트를 얻을 수 dat[ flds[[2]], ]등, 당신에게 두 번째 배 세트를 가져옵니다


12

패키지를 사용하지 않고 10 배를 수행하는 간단한 방법은 다음과 같습니다.

#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]

#Create 10 equally size folds
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE)

#Perform 10 fold cross validation
for(i in 1:10){
    #Segement your data by fold using the which() function 
    testIndexes <- which(folds==i,arr.ind=TRUE)
    testData <- yourData[testIndexes, ]
    trainData <- yourData[-testIndexes, ]
    #Use the test and train data partitions however you desire...
}

-1 : 캐럿 함수는 수행하지 않는 계층화 된 샘플링을 수행합니다. 누군가가 당신을 위해 일을 더 단순하게 만들었을 경우, 창살을 재창조하는 요점은 무엇입니까?
marbel

10
농담 해? 대답의 전체 목적은 전체 캐럿 패키지를 설치하지 않고도 10 배를 수행하는 것입니다. 유일하게 좋은 점은 사람들이 코드의 실제 기능을 이해해야한다는 것입니다. 어린 메뚜기, 층화 된 샘플링이 항상 최선의 방법은 아닙니다. 예를 들어, 항상 바람직한 것은 아니지만 더 많은 데이터를 가진 하위 그룹에 더 중요합니다. (예를 들어 모르는 경우). 데이터에 가장 적합한 방법을 사용하는 것입니다. 내 친구주의해서 트롤 :)
Jake Drew

@JakeDrew 나는 이것이 오래된 게시물이라는 것을 알고 있지만 테스트와 훈련 데이터를 사용하여 각 반복에 대한 VAR (p) 모델의 평균 평균 오차를 얻는 방법에 대한 지침을 요청할 수 있습니까?
youjustreadthis


@JakeDrew imho 두 답변 모두 플러스 1을받을 자격이있다. 하나는 패키지로, 다른 하나는 코드로 ...
natbusa

2

아마도 가장 좋은 방법은 아니지만 여기에 한 가지 방법이 있습니다. 이 코드를 작성할 때 여기에 다른 답변에서 트릭을 빌 렸지만 링크를 찾을 수 없었습니다.

# Generate some test data
x <- runif(100)*10 #Random values between 0 and 10
y <- x+rnorm(100)*.1 #y~x+error
dataset <- data.frame(x,y) #Create data frame
plot(dataset$x,dataset$y) #Plot the data

#install.packages("cvTools")
library(cvTools) #run the above line if you don't have this library

k <- 10 #the number of folds

folds <- cvFolds(NROW(dataset), K=k)
dataset$holdoutpred <- rep(0,nrow(dataset))

for(i in 1:k){
  train <- dataset[folds$subsets[folds$which != i], ] #Set the training set
  validation <- dataset[folds$subsets[folds$which == i], ] #Set the validation set

  newlm <- lm(y~x,data=train) #Get your new linear model (just fit on the train data)
  newpred <- predict(newlm,newdata=validation) #Get the predicitons for the validation set (from the model just fit on the train data)

  dataset[folds$subsets[folds$which == i], ]$holdoutpred <- newpred #Put the hold out prediction in the data set for later use
}

dataset$holdoutpred #do whatever you want with these predictions

1

아래에서 내가 사용하는 다른 코드를 찾아보십시오 (다른 소스에서 빌려서 수정했습니다). 내가 방금 사용한 rpart 루틴에서 방금 사용한 스크립트에서 직접 복사했습니다. 아마도 가장 흥미로운 부분은 주름을 만드는 선입니다. 또는 부트 스트랩 패키지에서 crossval 기능을 사용할 수 있습니다.

#define error matrix
err <- matrix(NA,nrow=1,ncol=10)
errcv=err

#creation of folds
for(c in 1:10){

n=nrow(df);K=10; sizeblock= n%/%K;alea=runif(n);rang=rank(alea);bloc=(rang-1)%/%sizeblock+1;bloc[bloc==K+1]=K;bloc=factor(bloc); bloc=as.factor(bloc);print(summary(bloc))

for(k in 1:10){

#rpart
fit=rpart(type~., data=df[bloc!=k,],xval=0) ; (predict(fit,df[bloc==k,]))
answers=(predict(fit,df[bloc==k,],type="class")==resp[bloc==k])
err[1,k]=1-(sum(answers)/length(answers))

}

err
errcv[,c]=rowMeans(err, na.rm = FALSE, dims = 1)

}
errcv

1
# Evaluate models uses k-fold cross-validation
install.packages("DAAG")
library("DAAG")

cv.lm(data=dat, form.lm=mod1, m= 10, plotit = F)

한 줄의 코드로 모든 것이 가능합니다!

?cv.lm for information on input and output

0

이 목록에 접근하지 않았기 때문에 빠른 교차 검증을 위해 패키지를 설치하고 싶지 않은 사람들을 위해 다른 옵션을 공유 할 수 있다고 생각했습니다.

# get the data from somewhere and specify number of folds
data <- read.csv('my_data.csv')
nrFolds <- 10

# generate array containing fold-number for each sample (row)
folds <- rep_len(1:nrFolds, nrow(data))

# actual cross validation
for(k in 1:nrFolds) {
    # actual split of the data
    fold <- which(folds == k)
    data.train <- data[-fold,]
    data.test <- data[fold,]

    # train and test your model with data.train and data.test
}

위의 코드는 데이터가 이미 섞여 있다고 가정합니다. 그렇지 않은 경우 다음과 같은 추가를 고려할 수 있습니다.

folds <- sample(folds, nrow(data))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.