在 mlr 中调整超参数不会产生合理的结果?

问题描述

我正在尝试使用 mlr 函数调整 tuneParams 中的超参数。但是,我无法理解它给我的结果(或者我使用不当)。

例如,如果我创建一些带有二元响应的数据,然后创建一个 mlr h2o 分类模型,然后检查准确性和 AUC,我会得到一些值。 然后,如果我对某些参数使用 tuneParams 并找到更好的准确度和 AUC,然后将它们插入我的模型中。结果精度和 AUC(对于模型)与使用 tuneParams 发现的不匹配。

希望下面的代码能说明我的问题:

library(mlr)

# Create data
set.seed(1234)
Species <- sample(c("yes","no"),size = 150,replace = T)

dat <- data.frame(
  x1 = (Species == "yes") + rnorm(150),x2 = (Species == "no") + rnorm(150),Species
)

# split into training and test
train <- sample(nrow(dat),round(.7*nrow(dat))) # split 70-30
datTrain <- dat[train,]
datTest <- dat[-train,]

# create mlr h2o model
task <- makeClassifTask(data = dat,target = "Species")
learner <- makeLearner("classif.h2o.deeplearning",predict.type = "prob",par.vals = list(reproducible = TRUE,seed = 1))
Mod <- train(learner,task)

# Test predictions
pred <- predict(Mod,newdata = datTest)
# Evaluate performance accuracy & area under curve 
performance(pred,measures = list(acc,auc)) 

以上性能检查的结果是:

acc       auc 
0.7111111 0.7813765 

现在,如果我只调整其中一个参数(例如,epochs):

set.seed(1234)
# Tune epoch parameter
param_set <- makeParamSet(
  makeNumericParam("epochs",lower = 1,upper = 10))
rdesc <- makeResampleDesc("CV",iters = 3L,predict = "both") 
ctrl <- makeTuneControlRandom(maxit = 3)

res <- tuneParams(
  learner = learner,task = task,resampling = rdesc,measures = list(auc,acc),par.set = param_set,control = ctrl
)

我从调优时代得到的结果是:

Tune result:
Op. pars: epochs=1.95
auc.test.mean=0.8526496,acc.test.mean=0.7466667

现在,如果我将时代的该值插入学习器并再次运行模型并检查性能

set.seed(1234)
# plugging the tuned value into model and checking performance again:
learner <- makeLearner("classif.h2o.deeplearning",par.vals = list(epochs = 1.95,reproducible = TRUE,task)

# Test predictions
pred1 <- predict(Mod,newdata = datTest)
# Evaluate performance accuracy & area under curve 
performance(pred1,auc))

我现在得到的准确率和 AUC 是:

   acc       auc 
0.6666667 0.8036437 

我的问题是,为什么使用 tuneParams 和将调整后的值插入学习器的结果的准确性和 AUC 之间存在如此大的差异? 或者我是否错误地使用或解释了 tuneParams

解决方法

您得到不同的结果,因为您使用不同的训练和测试数据评估学习者。如果我使用相同的 3 倍 CV,我会得到相同的结果:

set.seed(1234)
resample(learner,task,cv3,list(auc,acc))

Aggr perf: auc.test.mean=0.8526496,acc.test.mean=0.7466667

一般来说,每个计算性能只是对真实泛化性能的估计。这取决于您选择的重采样方法和数据。