データセットを分割して10倍の交差検証を行う方法


14

これでRデータフレーム(トレーニング)ができました。このデータセットをランダムに分割して10倍の交差検証を行う方法を教えてもらえますか?


2
全体のプロセスを100回繰り返して、十分な精度を達成してください。
フランクハレル

ケースとコントロールサンプルを個別にサンプリングし、それらを各ブロックに結合してください。
石城郭

caret :: trainを使用する場合、これを気にする必要さえありません。それは内部で行われ、フォールドの量を選択できます。これを「手作業」で行うことを主張する場合は、caret :: createFoldsで実装されているクラスの階層化サンプリングを使用してください。
マーベル14

私はこのスレッドをロックしました。なぜなら、多くの回答のすべてが、一般的な統計的関心の1つではなく、コーディングの質問としてのみ扱っているからです。
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:キャレット関数は、実行していない層別サンプリングを実行します。誰かがあなたのために物事をよりシンプルにしたなら、ウィールを再発明することのポイントは何ですか?
マーベル14

10
冗談ですか?答えの全体的な目的は、キャレットパッケージ全体をインストールせずに10倍実行することです。あなたが作る唯一の良い点は、人々が自分のコードが実際に何をするかを理解する必要があるということです。若いバッタ、層化サンプリングは常に最良のアプローチではありません。たとえば、常に望ましいとは限らない、より多くのデータを持つサブグループにより重要性を与えます。(特に、それが起こっていることを知らない場合)。それは、データに最適なアプローチを使用することです。友だちに注意してトロール:)
ジェイクドリュー14

@JakeDrewこれは今では古い投稿であることに気づきましたが、テストとトレーニングデータを使用して各反復のVAR(p)モデルの平均誤差を取得する方法についてのガイダンスを求めることは可能でしょうか?
-youjustreadthis


@JakeDrew imho両方の答えはプラス1に値します。1つはパッケージで、もう1つはコードで
...-natbusa

2

おそらく最善の方法ではありませんが、ここにそれを行う1つの方法があります。このコードを書いたとき、私はここで別の答えからトリックを借りていたと確信していますが、リンクするものを見つけることができませんでした。

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

1行のコードですべてが完了しました!

?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.