วิธีการแยกชุดข้อมูลเพื่อทำการตรวจสอบความถูกต้องไขว้ 10 เท่า


14

ตอนนี้ฉันมีRกรอบข้อมูล (การฝึกอบรม) ทุกคนสามารถบอกฉันได้ว่าจะแยกชุดข้อมูลนี้เป็นการสุ่มตรวจสอบข้าม 10 เท่าได้อย่างไร


2
ต้องทำซ้ำขั้นตอนทั้งหมด 100 ครั้งเพื่อให้ได้ความแม่นยำที่น่าพอใจ
Frank Harrell

ตรวจสอบให้แน่ใจว่าได้สุ่มตัวอย่างเคสและตัวอย่างควบคุมแยกกันจากนั้นรวมเข้ากับแต่ละบล็อก
Shicheng Guo

หากคุณใช้คาเร็ต :: รถไฟคุณไม่จำเป็นต้องสนใจสิ่งนี้ มันจะทำภายในคุณสามารถเลือกจำนวนเท่า หากคุณยืนยันในการทำสิ่งนี้ "ด้วยมือ" ให้ใช้การสุ่มตัวอย่างแบบแบ่งชั้นของคลาสตามที่ใช้ใน 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: ฟังก์ชันคาเร็ตทำการสุ่มตัวอย่างแบบแบ่งชั้นซึ่งคุณไม่ได้ทำ อะไรคือประเด็นของการสร้างใหม่ของ weel ถ้ามีคนทำสิ่งที่ง่ายกว่าสำหรับคุณ
marbel

10
คุณล้อเล่นใช่ไหม จุดประสงค์ทั้งหมดของคำตอบคือการดำเนินการ 10 เท่าโดยไม่ต้องติดตั้งชุดคาเร็ตทั้งชุด สิ่งที่ดีที่คุณทำคือคนควรเข้าใจว่ารหัสของพวกเขาทำอะไร ตั๊กแตนวัยหนุ่มการแบ่งตัวอย่างแบบแบ่งชั้นไม่ใช่วิธีที่ดีที่สุดเสมอไป ตัวอย่างเช่นมันให้ความสำคัญกับกลุ่มย่อยที่มีข้อมูลมากกว่าซึ่งไม่ต้องการเสมอไป (ถ้าคุณไม่รู้ว่ามันกำลังเกิดขึ้น) มันเกี่ยวกับการใช้วิธีการที่ดีที่สุดสำหรับข้อมูลของคุณ Troll ด้วยความระมัดระวังเพื่อนของฉัน :)
เจคดึง

@ 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 จากแพ็คเกจ 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

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.