2014-01-27 4 views
9

이전에 R에서 작성한 일부 glm 모델에 대해 10 배 교차 유효성 검사를 수행하려고합니다. boot 패키지의 cv.glm() 기능에 대해 약간 혼란 스럽습니다. 나는 많은 도움말 파일을 읽었습니다. 다음 공식을 제공 할 때 :glm() 모델에 대한 교차 검증

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

여기서 "데이터"인수는 전체 데이터 집합 또는 테스트 집합만을 의미합니까?

필자가 지금까지 본 예제는 "데이터"인수를 테스트 집합으로 제공하지만 실제로 같은 테스트 집합에서 10 배가되는 이유는 실제로 이해가되지 않았습니다. 그들은 모두 똑같은 결과를 줄 것입니다 (나는 추측합니다!).

불행히도 ?cv.glm 안개 방법을 설명한다 :

데이터 : 매트릭스 형상 또는 데이터를 포함하는 데이터 프레임. 행은 경우해야하며 열 중 하나가

내 다른 질문이 $delta[1] 결과에 대해 할 것 반응이다 변수에 해당합니다. 이것은 10 가지 시도에 대한 평균 예측 오차입니까? 각 폴드에 대해 오류를 표시하려면 어떻게해야합니까? 난 항상 다양한 패키지를 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) 
+0

봐. glm'. CV의 전체 데이터, 모델 및 폴드를 입력해야합니다. –

+0

reply @ RomanLuštrik에 감사드립니다. 훌륭해. 나는 아직도 두 가지 일에 대해 궁금해합니다. 이 기능은 교차 검증에서 제공된 모든 데이터를 사용합니까? 'cv.glm (data, glm, K = 10)에 1000 행의 데이터 프레임을 제공한다고 가정합니다. 데이터의 10 개 파티션을 만들고, 각각을 100 개 만들고 교차 검증을합니까? 미안 해요? cv.glm 그러나 나는 거기에서 그것을 발견하지 않았다. – Error404

+1

2 배 CV를 수행하는 경우이 함수는 데이터의 50 %를 차지하고 모델에 적합합니다. 모델이 데이터를 얼마나 잘 설명하는지 보려면 데이터의 나머지 50 %를 사용합니다. 또는 leave-one-out CV에서 하나의 데이터 "지점"을 제외한 모든 모델에 모델을 적용하고 "지점"을 얼마나 잘 선택했는지 확인할 수 있습니다. N 번 반복하면 결과를 얻을 수 있습니다. –

답변

11

:

여기처럼 내 스크립트 모습이다. 내가 어떤 기계 학습 패키지를 수동으로 테스트 및 교육 파티션을 생성하기 위해 내 자신의 간단한 스크립트가 있습니다

#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... 
} 
+1

감사합니다. Jake Drew. 테스트 목적으로 위의 코드를 cv.glm의 결과와 비교 한 결과가 동일합니다. 귀하의 게시물 덕분에, 이제 cv.glm ;-)을 (를) 믿을 수 있습니다. – citraL

+0

도와 드리겠습니다. –

5

@Roman 그의 의견에 어떤 답을 제공을하지만, 질문에 대한 답은 함께 코드를 검사하여 제공 cv.glm :

난이 코드 비트가 K가 N 분할하지 않는 경우 필요에 따라 라운딩 배열의 K-폴드로 임의로 설정하여 데이터를 분할 믿는다

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) 

여기 비트 보여준다 보정 값 루트가 아니다. 평균 제곱 오차. helpfile이 말하는대로입니다. The default is the average squared error function. 이것은 무엇을 의미합니까? 우리는 함수 선언을 검사하여이 문제를 볼 수 있습니다

오류가 실제 응답 대 예측 반응 사이의 일반적인 의미에서입니다 각 배에서, 우리는 오류의 평균 제곱 계산 보여줍니다
function (data, glmfit, cost = function(y, yhat) mean((y - yhat)^2), 
    K = n) 

.

delta[1] 단순히 각각의 배에 대한 이러한 모든 조건의 SUM의 weighted average입니다 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")) 
}