2016-11-04 1 views
0

Я выполняю эту функцию, чтобы выполнить кросс-валидность n-fold. Уровень ошибочной классификации не изменяется по сложениям, например. если я бегу 10 или 50. Я также получаю предупреждение:Ошибка `предсказания` при выполнении n-кратной перекрестной проверки для моего GLM

"Предупреждение сообщение:

'NewData' было 19 строк, но переменные, найденные у 189 строк"

Если я бегу код, не являющийся частью функции, он хочет, я хочу -> например для складок == 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 как вектор, который имеет все прогнозы из каждой складки. В этой функции я просто получаю 19 назад, когда это должно быть 189. Затем я произвожу скорость, используя этот вектор длины 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). Подумайте об этом, вы всегда получаете 1 за pred.class.
  3. Каждая итерация вашего цикла for перезаписывает pred.class. Я думаю, вы хотите накопить результат. Так делают pred.class <- c(pred.class, ifelse(predictions < 0.5, 0, 1));
  4. Неправильное использование glm и predict. Неправильно вносить $ в формулу модели. Пожалуйста, прочитайте Predict() - Maybe I'm not understanding it. Здесь я изменил вашу функцию, чтобы принимать имена переменных (как строку) и использовать правильную формулу модели внутри glm. Примечание. Для этого изменения необходимо разместить y с data[[y]] в rate = 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 («дым», «низкий», 10, рождение), например. «возраст», «низкий» или «гонка» «низкий», вы все равно получаете 31%. Кроме того, если вы измените n.folds на 50, вы все равно получите 31%. Вот где проблема. Что-то не так. – user7090012

+0

Теперь я вижу. Забавно, что для складок> 10 скорость не меняется. Большое вам спасибо за это. Я очень ценю ваше время, помогая мне в этом! Может быть, когда-нибудь я смогу внести свой вклад! – user7090012

Смежные вопросы