【问题标题】:Different model accuracy when rerunning preProcess(), predict() and train() in R (caret)在 R(插入符号)中重新运行 preProcess()、predict() 和 train() 时模型精度不同
【发布时间】:2020-10-06 22:47:21
【问题描述】:

下面的数据只是一个例子,它是对这个或任何数据的操作,我对此感到困惑:

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

运行此代码时,fit_noPCA 的准确度为 0.689539,fit_PCA 的准确度为 0.682951。但是当我重新运行代码的最后一部分时:

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 行时,我都会得到不同的准确度值。为什么会这样?是因为我没有重置种子吗?即使,这个过程的内在随机性在哪里?

【问题讨论】:

  • 这些值是什么?它们是变化很大还是仅在最后几个十进制数字中变化?
  • 对于fit_noPCAfit_PCA,它们分别是 0.6688098 和 0.7012564、0.6691034 和 0.7106764 或 0.6932403 和 0.687635 之类的值。所以我认为它们的差异很大,而且并不总是一种适合比另一种更好。

标签: r machine-learning r-caret glm


【解决方案1】:

默认情况下,模型是使用 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 ,引导的样本都会不同,为了得到相同的结果,你可以在运行 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,您可以在 trainControl 中使用 index= 定义折叠

【讨论】:

  • 谢谢,这很有意义
猜你喜欢
  • 2019-09-13
  • 2019-06-02
  • 2016-06-18
  • 2020-02-24
  • 2017-05-28
  • 2018-11-11
  • 1970-01-01
  • 2016-09-25
  • 2018-10-15
相关资源
最近更新 更多