Различная точность модели при повторном запуске preProcess (), predic () и train () в R (курсор) - PullRequest
1 голос
/ 17 июня 2020

Приведенные ниже данные являются лишь примером, это операции с этими или любыми данными, которые меня не устраивают:

library(caret)
set.seed(3433)
data(AlzheimerDisease)
complete <- data.frame(diagnosis, predictors)
in_train <- createDataPartition(complete$diagnosis, p = 0.75)[[1]]
training <- complete[in_train,]
testing <- complete[-in_train,]
predIL <- grep("^IL", names(training))
smalltrain <- training[, c(1, predIL)]

fit_noPCA <- train(diagnosis ~ ., method = "glm", data = smalltrain)
pre_proc_obj <- preProcess(smalltrain[,-1], method = "pca", thresh = 0.8)
smalltrainsPCs <- predict(pre_proc_obj, smalltrain[,-1])
fit_PCA <- train(x = smalltrainsPCs, y = smalltrain$diagnosis, method = "glm")
fit_noPCA$results$Accuracy
fit_PCA$results$Accuracy

При запуске этого кода я получаю точность 0,689539 для fit_noPCA и точность 0,682951 для fit_PCA. Но когда я повторно запускаю последнюю часть кода:

fit_noPCA <- train(diagnosis ~ ., method = "glm", data = smalltrain)
pre_proc_obj <- preProcess(smalltrain[,-1], method = "pca", thresh = 0.8)
smalltrainsPCs <- predict(pre_proc_obj, smalltrain[,-1])
fit_PCA <- train(x = smalltrainsPCs, y = smalltrain$diagnosis, method = "glm")
fit_noPCA$results$Accuracy
fit_PCA$results$Accuracy

Затем каждый раз, когда я повторно запускаю эти 6 строк, я получаю разные значения точности. Почему это так? Это потому, что я не сбрасываю сид? Даже если, где же врожденная случайность этого процесса?

1 Ответ

1 голос
/ 17 июня 2020

По умолчанию модель обучается с использованием bootstrap, вы можете увидеть это здесь:

library(caret)
library(AppliedPredictiveModeling)

> fit_noPCA
Generalized Linear Model 

251 samples
 12 predictor
  2 classes: 'Impaired', 'Control' 

No pre-processing
Resampling: Bootstrapped (25 reps) 
Summary of sample sizes: 251, 251, 251, 251, 251, 251, ... 
Resampling results:

  Accuracy   Kappa     
  0.6870006  0.04107016

Таким образом, с каждым train образцы начальной загрузки будут разными, чтобы получить тот же результат , вы можете установить семя перед запуском поезда:

set.seed(111)
fit_PCA <- train(x = smalltrainsPCs, y = smalltrain$diagnosis, method = "glm",trControl=trainControl(method="boot",number=100))
fit_PCA$results$Accuracy
[1] 0.6983512

set.seed(112)
fit_PCA <- train(x = smalltrainsPCs, y = smalltrain$diagnosis, method = "glm",trControl=trainControl(method="boot",number=100))
fit_PCA$results$Accuracy
[1] 0.6991537

set.seed(111)
fit_PCA <- train(x = smalltrainsPCs, y = smalltrain$diagnosis, method = "glm",trControl=trainControl(method="boot",number=100))
fit_PCA$results$Accuracy
[1] 0.6983512

Или используйте, например, cv, где вы можете определить складки, используя index= in trainControl

...