10 kat çapraz doğrulama yapmak için bir veri kümesini bölme


14

Şimdi bir Rveri çerçevem ​​(eğitim) var, kimse bana bu veri kümesini 10 kat çapraz doğrulama yapmak için rasgele bölmeyi söyleyebilir mi?


2
Tatmin edici bir hassasiyet elde etmek için tüm işlemi 100 kez tekrarladığınızdan emin olun.
Frank Harrell

Kasayı ve numuneyi ayrı ayrı kontrol ettiğinizden emin olun ve her blokta birleştirin.
Shicheng Guo

Caret :: train kullanıyorsanız bunu önemsemenize bile gerek yoktur. Dahili olarak yapılacak, kat miktarını seçebilirsiniz. Bu "elle" yapmakta ısrar ederseniz, caret :: createFolds uygulamasında uygulandığı gibi sınıfın katmanlı örneklemesini kullanın.
marbel

Bu konuyu kilitledim çünkü birçok cevabın her biri bunu genel istatistiksel ilgi alanlarından biri yerine sadece bir kodlama sorusu olarak görüyor.
whuber

Yanıtlar:


22

caret bunun için bir işlevi vardır:

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

Daha sonra, öğesinin her bir öğesi, fldsher veri kümesi için bir dizinler listesidir. Veri kümeniz çağrılırsa dat, dat[flds$train,]size eğitim seti, dat[ flds[[2]], ]ikinci kat seti vb.


12

Paket kullanmadan 10 kat gerçekleştirmenin basit bir yolu:

#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: düzeltme işlevi, yapmadığınız tabakalı örnekleme yapar. Birisi sizin için bir şeyleri daha basit hale getirdiyse, makarayı yeniden keşfetmenin anlamı nedir?
marbel

10
Dalgamı geçiyorsun? Cevabın tüm amacı, tüm caret paketini kurmak zorunda kalmadan 10 kat yapmaktır. Yapmanız gereken tek iyi nokta insanların kodlarının gerçekte ne yaptığını anlamaları gerektiğidir. Genç çekirge, tabakalı örnekleme her zaman en iyi yaklaşım değildir. Örneğin, her zaman arzu edilmeyen daha fazla veriye sahip alt gruplara daha fazla önem vermektedir. (Esp olduğunu bilmiyorsan). Verileriniz için en iyi yaklaşımı kullanmakla ilgilidir. Dikkatli bir şekilde troll arkadaşım :)
Jake Drew

@JakeDrew Bunun eski bir gönderi olduğunu anlıyorum, ancak her yineleme için bir VAR (p) modelinin ortalama hatasını almak için test ve tren verilerinin nasıl kullanılacağı konusunda bazı rehberlik istemek mümkün müdür?
16:18


@JakeDrew imho her iki yanıtı artı 1 hak ediyor. Biri bir paketi, diğeri kodu ile ...
natbusa

2

Muhtemelen en iyi yol değil, ama bunu yapmanın bir yolu var. Ben bu kodu yazarken burada başka bir cevap bir numara ödünç vardı eminim, ama bağlantı bulamadı.

# 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

lütfen kullandığım diğer bazı kodları (başka bir kaynaktan ödünç ve uyarlanmış) bulabilirsiniz. Doğrudan kendimi kullandığım bir komut dosyasından kopyaladım, rpart rutininde bıraktım. Muhtemelen en çok ilgi çeken kısım kıvrımların yaratılmasıyla ilgili çizgilerdir. Alternatif olarak, bootstrap paketinden crossval işlevini kullanabilirsiniz.

#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)

Her şey tek bir kod satırında sizin için yapıldı!

?cv.lm for information on input and output

0

Bu listedeki yaklaşımımı yapmadığım için hızlı çapraz doğrulama için paket kurmak istemeyen insanlar için başka bir seçeneği paylaşabileceğimi düşündüm

# 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
}

Yukarıdaki kodun verilerin önceden karıştırılmış olduğunu varsaydığını unutmayın. Durum böyle olmazsa, böyle bir şey eklemeyi düşünebilirsiniz.

folds <- sample(folds, nrow(data))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.