Як розділити набір даних, щоб зробити 10-кратну перехресну перевірку


14

Тепер у мене є Rкадр даних (навчання), хтось може мені сказати, як довільно розділити цей набір даних, щоб зробити 10-кратну перехресну перевірку?


2
Обов’язково повторіть весь процес 100 разів, щоб досягти задовільної точності.
Френк Харрелл

Обов’язково відбирайте випадок регістру та контрольний зразок окремо, а потім комбінуйте їх до кожного блоку.
Shicheng Guo

Якщо ви використовуєте caret :: train, вам навіть про це не потрібно дбати. Це буде зроблено всередину, можна вибрати кількість складок. Якщо ви наполягаєте на цьому "вручну", використовуйте стратифіковану вибірку класу, що реалізована в caret :: createFolds.
Марбель

Я заблокував цю тему, тому що кожна з багатьох відповідей трактує її як лише питання кодування, а не як загальний статистичний інтерес.
качан

Відповіді:


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: функції карети роблять стратифіковану вибірку, яку ви не робите. Який сенс винаходити велюр, якщо хтось спростив вам речі?
Марбель

10
Ви жартуєте? Вся мета відповіді - виконати 10 разів без необхідності встановлення всього пакету карет. Єдиний хороший пункт, який ви зазначаєте, - це те, що люди повинні розуміти, що насправді робить їх код. Молодий коник, стратифікований відбір проб не завжди є найкращим підходом. Наприклад, він надає більшого значення підгрупам з більшою кількістю даних, що не завжди бажано. (Якщо ви не знаєте, що це відбувається) Йдеться про використання найкращого підходу для своїх даних. Тролль з обережністю мій друг :)
Джейк Дрю

@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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.