Я пытаюсь оценить логистическую регрессию, используя 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(), но я не могу понять, что это такое.
Я очень благодарен за помощь, спасибо заранее.