Cara membagi set data untuk melakukan validasi silang 10 kali lipat

14

Sekarang saya memiliki Rkerangka data (pelatihan), adakah yang bisa memberi tahu saya cara membagi set data ini secara acak untuk melakukan validasi silang 10 kali lipat?

pengguna22062
sumber
2
Pastikan untuk mengulangi seluruh proses 100 kali untuk mencapai presisi yang memuaskan.
Frank Harrell
Pastikan untuk mengambil sampel case dan mengontrol sampel secara terpisah dan kemudian menggabungkannya ke setiap blok.
Shicheng Guo
Jika Anda menggunakan caret :: train, Anda bahkan tidak perlu peduli dengan ini. Ini akan dilakukan secara internal, Anda dapat memilih jumlah lipatan. Jika Anda bersikeras melakukan ini "dengan tangan" menggunakan pengambilan sampel kelas stratified seperti yang diterapkan dalam caret :: createFolds.
marbel
Saya telah mengunci utas ini karena setiap satu dari banyak jawaban memperlakukannya hanya sebagai pertanyaan pengkodean dan bukan salah satu kepentingan statistik umum.
whuber

Jawaban:

22

caret memiliki fungsi untuk ini:

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

Kemudian setiap elemen fldsadalah daftar indeks untuk setiap dataset. Jika dataset Anda dipanggil dat, maka dat[flds$train,]Anda mendapat set pelatihan, dat[ flds[[2]], ]membuat Anda set lipatan kedua, dll.

Ari B. Friedman
sumber
12

Berikut adalah cara sederhana untuk melakukan 10 kali lipat tanpa menggunakan paket:

#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...
}
Jake Drew
sumber
-1: fungsi caret melakukan pengambilan sampel bertingkat yang tidak Anda lakukan. Apa gunanya menciptakan kembali weel jika seseorang membuat segalanya lebih mudah untuk Anda?
marbel
10
Apa Anda sedang bercanda? Seluruh tujuan jawabannya adalah untuk melakukan 10 kali lipat tanpa harus menginstal seluruh paket caret. Satu-satunya poin bagus yang Anda buat adalah bahwa orang-orang harus memahami apa sebenarnya kode mereka. Belalang muda, pengambilan sampel bertingkat tidak selalu merupakan pendekatan terbaik. Sebagai contoh, itu memberi lebih penting untuk subkelompok dengan lebih banyak data yang tidak selalu diinginkan. (Terutama jika Anda tidak tahu itu sedang terjadi). Ini tentang menggunakan pendekatan terbaik untuk data Anda. Troll dengan hati-hati teman saya :)
Jake Drew
@ JakeDrew Saya menyadari ini adalah posting lama sekarang, tetapi apakah mungkin untuk meminta beberapa panduan tentang cara menggunakan tes dan melatih data untuk mendapatkan rata-rata kesalahan rata-rata dari model VAR (p) untuk setiap iterasi?
barukan membaca ini
@JakeDrew imho kedua jawaban layak ditambah 1. Satu dengan paket, yang lain dengan kode ...
natbusa
2

Mungkin bukan cara terbaik, tapi di sini ada satu cara untuk melakukannya. Saya cukup yakin ketika saya menulis kode ini saya telah meminjam trik dari jawaban lain di sini, tetapi saya tidak dapat menemukannya untuk ditautkan.

# 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
Dan L
sumber
1

tolong temukan di bawah ini beberapa kode lain yang saya gunakan (dipinjam dan diadaptasi dari sumber lain). Menyalinnya langsung dari skrip yang baru saja saya gunakan sendiri, tersisa di rutinitas rpart. Bagian yang mungkin paling menarik adalah garis-garis pada penciptaan lipatan. Atau - Anda dapat menggunakan fungsi crossval dari paket bootstrap.

#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
Wouter
sumber
1
# Evaluate models uses k-fold cross-validation
install.packages("DAAG")
library("DAAG")

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

Semuanya dilakukan untuk Anda dalam satu baris kode!

?cv.lm for information on input and output
pengguna1930111
sumber
0

Karena saya tidak melakukan pendekatan dalam daftar ini, saya pikir saya dapat membagikan opsi lain untuk orang-orang yang tidak ingin menginstal paket untuk validasi silang cepat

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

Perhatikan bahwa kode di atas mengasumsikan bahwa data sudah dikocok. Jika ini tidak terjadi, Anda dapat mempertimbangkan untuk menambahkan sesuatu seperti

folds <- sample(folds, nrow(data))
Tuan Tsjolder
sumber