Подтвердить что ты не робот

Каретный поезд() предсказывает очень разные, а затем предсказывает .glm()

Я пытаюсь оценить логистическую регрессию, используя 10-кратное перекрестное подтверждение.

#import libraries
library(car); library(caret); library(e1071); library(verification)

#data import and preparation
data(Chile)              
chile        <- na.omit(Chile)  #remove "na's"
chile        <- chile[chile$vote == "Y" | chile$vote == "N" , ] #only "Y" and "N" required
chile$vote   <- factor(chile$vote)      #required to remove unwanted levels 
chile$income <- factor(chile$income)  # treat income as a factor

Цель состоит в том, чтобы оценить модель glm, которая предсказывает результат голосования "Y" или "N", зависит от соответствующих объясняющих переменных и, основываясь на конечной модели, вычисляет матрицу путаницы и кривую ROC, чтобы понять поведение моделей для разные пороговые уровни.

Выбор модели приводит к:

res.chileIII <- glm(vote ~
                           sex       +
                           education +
                           statusquo ,
                           family = binomial(),
                           data = chile)
#prediction
chile.pred <- predict.glm(res.chileIII, type = "response")

генерирует:

> head(chile.pred)
          1           2           3           4           5           6 
0.974317861 0.008376988 0.992720134 0.095014139 0.040348115 0.090947144 

для сравнения наблюдаемого с оценкой:

chile.v     <- ifelse(chile$vote == "Y", 1, 0)          #to compare the two arrays
chile.predt <- function(t) ifelse(chile.pred > t , 1,0) #t is the threshold for which the confusion matrix shall be computed

путаница при t = 0,3:

confusionMatrix(chile.predt(0.3), chile.v)

> confusionMatrix(chile.predt(0.3), chile.v)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 773  44
         1  94 792

               Accuracy : 0.919          
                 95% CI : (0.905, 0.9315)
    No Information Rate : 0.5091         
    P-Value [Acc > NIR] : < 2.2e-16 

и кривая Roc:

roc.plot(chile.v, chile.pred)

который кажется разумной моделью.

Теперь вместо того, чтобы использовать "normal" функцию expect.glm(), я хочу проверить разницу в производительности на 10-кратную оценку перекрестной проверки.

tc <- trainControl("cv", 10, savePredictions=T)  #"cv" = cross-validation, 10-fold
fit <- train(chile$vote ~ chile$sex            +
                          chile$education      +
                          chile$statusquo      ,
                          data      = chile    ,
                          method    = "glm"    ,
                          family    = binomial ,
                          trControl = tc)

> summary(fit)$coef
                      Estimate Std. Error   z value      Pr(>|z|)
(Intercept)          1.0152702  0.1889646  5.372805  7.752101e-08
`chile$sexM`        -0.5742442  0.2022308 -2.839549  4.517738e-03
`chile$educationPS` -1.1074079  0.2914253 -3.799971  1.447128e-04
`chile$educationS`  -0.6827546  0.2217459 -3.078996  2.076993e-03
`chile$statusquo`    3.1689305  0.1447911 21.886224 3.514468e-106

все параметры значительны.

fitpred <- ifelse(fit$pred$pred == "Y", 1, 0) #to compare with chile.v

> confusionMatrix(fitpred,chile.v)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 445 429
         1 422 407

 Accuracy : 0.5003          
                 95% CI : (0.4763, 0.5243)
    No Information Rate : 0.5091          
    P-Value [Acc > NIR] : 0.7738

который, очевидно, сильно отличается от предыдущей матрицы путаницы. Мое предположение состояло в том, что перекрестные проверенные результаты не должны были бы намного хуже, чем первая модель. Однако результаты показывают что-то еще.

Мое предположение заключается в том, что есть ошибка с настройками параметров train(), но я не могу понять, что это такое.

Я очень благодарен за помощь, спасибо заранее.

4b9b3361

Ответ 1

Вы пытаетесь понять, как сфокусироваться в образце, используя матрицу путаницы. Ваш первый подход с использованием функции glm() прекрасен.

Проблема со вторым подходом с использованием train() заключается в возвращенном объекте. Вы пытаетесь извлечь из него значения, установленные в образце, на fit$pred$pred. Однако fit$pred не содержит установленных значений, которые выровнены с chile.v или chile$vote. Он содержит наблюдения и установленные значения различных (10) складок:

> head(fit$pred)
  pred obs rowIndex parameter Resample
1    N   N        2      none   Fold01
2    Y   Y       20      none   Fold01
3    Y   Y       28      none   Fold01
4    N   N       38      none   Fold01
5    N   N       55      none   Fold01
6    N   N       66      none   Fold01
> tail(fit$pred)
     pred obs rowIndex parameter Resample
1698    Y   Y     1592      none   Fold10
1699    Y   N     1594      none   Fold10
1700    N   N     1621      none   Fold10
1701    N   N     1656      none   Fold10
1702    N   N     1671      none   Fold10
1703    Y   Y     1689      none   Fold10 

Итак, из-за случайности складок и из-за того, что вы прогнозируете 0 или 1, вы получаете точность примерно 50%.

В образцах, которые вы ищете, находятся в fit$finalModel$fitted.values. Используя те:

fitpred <- fit$finalModel$fitted.values
fitpredt <- function(t) ifelse(fitpred > t , 1,0)
> confusionMatrix(fitpredt(0.3),chile.v)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 773  44
         1  94 792

               Accuracy : 0.919          
                 95% CI : (0.905, 0.9315)
    No Information Rate : 0.5091         
    P-Value [Acc > NIR] : < 2.2e-16      

                  Kappa : 0.8381         
 Mcnemar Test P-Value : 3.031e-05      

            Sensitivity : 0.8916         
            Specificity : 0.9474         
         Pos Pred Value : 0.9461         
         Neg Pred Value : 0.8939         
             Prevalence : 0.5091         
         Detection Rate : 0.4539         
   Detection Prevalence : 0.4797         
      Balanced Accuracy : 0.9195         

       'Positive' Class : 0               

Теперь точность приближается к ожидаемому значению. Установка порога в 0,5 дает примерно такую ​​же точность, как оценка из 10-кратной проверки креста:

> confusionMatrix(fitpredt(0.5),chile.v)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 809  64
         1  58 772

               Accuracy : 0.9284          
                 95% CI : (0.9151, 0.9402)
[rest of the output omitted]            

> fit
Generalized Linear Model 

1703 samples
   7 predictors
   2 classes: 'N', 'Y' 

No pre-processing
Resampling: Cross-Validated (10 fold) 

Summary of sample sizes: 1533, 1532, 1532, 1533, 1532, 1533, ... 

Resampling results

  Accuracy  Kappa  Accuracy SD  Kappa SD
  0.927     0.854  0.0134       0.0267  

Кроме того, в отношении вашего ожидания "что результаты проверки перекрестной проверки не должны работать намного хуже, чем первая модель", пожалуйста, проверьте summary(res.chileIII) и summary(fit). Приспособленные модели и коэффициенты точно такие же, чтобы они дали одинаковые результаты.

PS: Я знаю, что мой ответ на этот вопрос запоздал, т.е. это довольно старый вопрос. Можно ли в любом случае ответить на эти вопросы? Я новичок здесь и ничего не нашел о "поздних ответах" в помощи.