14

以前に R で作成したいくつかの glm モデルに対して 10 倍のクロス検証を実行しようとしています。多くのヘルプ ファイルを読みましたが、パッケージのcv.glm()関数について少し混乱しています。boot次の式を提供すると:

library(boot)
cv.glm(data, glmfit, K=10)

ここでの「データ」引数は、データセット全体を参照していますか、それともテスト セットのみを参照していますか?

これまで見てきた例では、テスト セットとして "data" 引数を提供していますが、実際には意味がありませんでした。たとえば、なぜ同じテスト セットで 10 倍になるのでしょうか? それらはすべてまったく同じ結果をもたらすでしょう(私は推測します!)。

残念ながら?cv.glm、あいまいな方法でそれを説明しています。

data: データを含む行列またはデータ フレーム。行はケースで、列は変数に対応し、そのうちの 1 つは応答です。

私の他の質問は、$delta[1]結果についてです。これは 10 回の試行の平均予測誤差ですか? 折りたたみごとにエラーを取得したい場合はどうすればよいですか?

私のスクリプトは次のようになります。

##data partitioning
sub <- sample(nrow(data), floor(nrow(x) * 0.9))
training <- data[sub, ]
testing <- data[-sub, ]

##model building
model <- glm(formula = groupcol ~ var1 + var2 + var3,
        family = "binomial", data = training)

##cross-validation
cv.glm(testing, model, K=10)
4

2 に答える 2

17

私は常に、さまざまなパッケージの 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 test and train data partitions however you desire...
}
于 2014-07-04T20:23:45.877 に答える
6

@Roman はコメントでいくつかの回答を提供しましたが、次のコードを使用してコードを検査することで、質問への回答が提供されますcv.glm

このコードは、データ セットアップをランダムに K 分割に分割し、K が n を分割しない場合は必要に応じて丸めを行うと思います。

if ((K > n) || (K <= 1)) 
    stop("'K' outside allowable range")
K.o <- K
K <- round(K)
kvals <- unique(round(n/(1L:floor(n/2))))
temp <- abs(kvals - K)
if (!any(temp == 0)) 
    K <- kvals[temp == min(temp)][1L]
if (K != K.o) 
    warning(gettextf("'K' has been set to %f", K), domain = NA)
f <- ceiling(n/K)
s <- sample0(rep(1L:K, f), n)

このビットは、デルタ値が二乗平均平方根誤差ではないことを示しています。ヘルプファイルにあるように、The default is the average squared error function.これはどういう意味ですか? これは、関数宣言を調べることで確認できます。

function (data, glmfit, cost = function(y, yhat) mean((y - yhat)^2), 
    K = n) 

これは、各フォールド内で、誤差の二乗の平均を計算することを示しています。ここで、誤差は、予測された応答と実際の応答の間の通常の意味です。

delta[1]は、各フォールドのこれらすべての項の合計の単純な加重平均cv.glmです。次のコードのインライン コメントを参照してください。

for (i in seq_len(ms)) {
    j.out <- seq_len(n)[(s == i)]
    j.in <- seq_len(n)[(s != i)]
    Call$data <- data[j.in, , drop = FALSE]
    d.glm <- eval.parent(Call)
    p.alpha <- n.s[i]/n #create weighted average for later
    cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out, 
        , drop = FALSE], type = "response"))
    CV <- CV + p.alpha * cost.i # add weighted average error to running total
    cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm, 
        data, type = "response"))
}
于 2015-04-07T09:43:47.060 に答える