2016-11-04 2 views
0

이 기능을 실행하여 n 배 교차 유효성 검사를 수행하고 있습니다. 오 분류 율은 폴드 (fold)에 따라 변하지 않습니다 (예 :GLM에 대해 n 배 교차 유효성 검사를 수행하는 중에`predict` 오류가 발생했습니다

: 나는 10 실행하거나 (50) 경우 나 또한 경고 얻고있다 "경고 메시지 :

'newData의'이 (가) 19 행하지만 변수는 189 개 행이 있었다"

내가 실행하는 경우를 함수의 일부가 아닌 코드, 원하는 것을하고 싶다 -> eg 접기 == 1 일 경우 10 %를 끌어 내고 모델을 데이터의 90 %에서 실행하고 다른 10 %를 예측합니다. 변수 및 폴드 수로 인해 변동이 표시되지 않는 이유는 누구입니까?

library("MASS") 
data(birthwt) 
data=birthwt 

n.folds=10 

jim = function(x,y,n.folds,data){ 

    for(i in 1:n.folds){ 
    folds <- cut(seq(1,nrow(data)),breaks=n.folds,labels=FALSE)  
    testIndexes <- which(folds==i,arr.ind=TRUE) 
    testData <- data[testIndexes, ] 
    trainData <- data[-testIndexes, ] 
    glm.train <- glm(y ~ x, family = binomial, data=trainData) 
    predictions=predict(glm.train, newdata =testData, type='response') 
    pred.class=ifelse(predictions< 0, 0, 1) 
    } 

    rate=sum(pred.class!= y)/length(y) 
    print(head(rate)) 
    } 

jim(birthwt$smoke, birthwt$low, 10, birthwt) 
+0

감사합니다. 예측은 (<0.5, 0,1)이어야합니다. 이 기능은 여전히 ​​올바르지 않지만, 당신의 관찰에 감사드립니다. – user7090012

+0

pred.class를 각 폴드의 모든 예측이있는 벡터로 지정합니다. 이 함수에서 저는 189 일 때 19면을 얻었습니다. 그런 다음 189면의 벡터를 사용하여 비율을 산출합니다. – user7090012

답변

0

이제 대답에 대한 의견을 말하고 있습니다.

jim <- function(x, y, n.folds, data) { 

    pred.class <- numeric(0) ## initially empty; accumulated later 
    for(i in 1:n.folds){ 
    folds <- cut(seq(1,nrow(data)), breaks = n.folds, labels = FALSE) 
    testIndexes <- which(folds == i) ## no need for `arr.ind = TRUE` 
    testData <- data[testIndexes, ] 
    trainData <- data[-testIndexes, ] 
    ## `reformulate` constructs formula from strings. Read `?reformulate` 
    glm.train <- glm(reformulate(x, y), family = binomial, data = trainData) 
    predictions <- predict(glm.train, newdata = testData, type = 'response') 
    ## accumulate the result using `c()` 
    ## change `predictions < 0` to `predictions < 0.5` as `type = response` 
    pred.class <- c(pred.class, ifelse(predictions < 0.5, 0, 1)) 
    } 

    ## to access a column with string, use `[[]]` not `$` 
    rate <- sum(pred.class!= data[[y]])/length(data[[y]]) 
    rate ## or `return(rate)` 
    } 

jim("smoke", "low", 10, birthwt) 
# [1] 0.3121693 

비고 :

  1. 가 더 부작용이없는 있지만, 여기 arr.ind = TRUE를 넣을 필요가 없습니다.
  2. 분류에 문제가 있습니다. type = "response"으로 설정 한 다음 ifelse(predictions < 0, 0, 1)을 사용합니다. 생각해 보면 pred.class은 1이됩니다.
  3. for 루프를 반복 할 때마다 pred.class을 덮어 씁니다. 나는 당신이 결과를 축적하고 싶다고 생각한다. 이렇게 pred.class <- c(pred.class, ifelse(predictions < 0.5, 0, 1))를하십시오;
  4. glmpredict의 잘못된 사용. 모델 수식에 $을 입력하는 것은 잘못되었습니다. Predict() - Maybe I'm not understanding it을 읽어보십시오. 여기서는 변수 이름을 문자열로 받아들이도록 함수를 변경했으며 적절한 모델 수식을 glm 안에 사용했습니다. 이 변경은 data[[y]]으로 yrate = sum(pred.class!= y)/length(y)에 넣어야합니다.
  5. rate을 화면에 인쇄하는 대신 반환하는 것이 좋습니다. print 행을 명시 적으로 return(rate)으로 바꾸거나 암시 적으로 rate으로 바꾸십시오.
  6. 위에서 변경하지 않았더라도 ifelse(predictions < 0.5, 0, 1)as.integer(predictions < 0.5)으로 바꿀 수 있습니다.
+0

감사합니다. 비율은 y와 같지 않은 예측의 비율이어야합니다. 예측은 루프에서 각 예측의 예측 스택이어야합니다. 이제는 각 반복이 pred.class를 덮어 쓰는 것을 보았습니다. 예측을 반환 한 다음 요금을 계산하려면 어떻게해야합니까? – user7090012

+0

고마워요. 그러나 jim ("smoke", "low", 10, birthwt)에 다른 변수를 입력하면 "나이", "낮음"또는 "경주"가 "낮은"경우 31 %가됩니다. 또한 n.folds를 50으로 변경하면 여전히 31 %가됩니다. 그것이 문제가되는 곳입니다. 뭔가 잘못되었다. – user7090012

+0

지금 봅니다. 재미있는 접기> 10, 속도가 변경되지 않습니다. 그 점에 대해 대단히 감사합니다. 나는 이걸 도와 주는데 시간을 크게 주셔서 감사합니다! 어쩌면 내가 언젠가는 공헌 할 수있을거야! – user7090012

관련 문제