【问题标题】:Tuning hyperparameters in mlr does not produce sensible results?在 mlr 中调整超参数不会产生合理的结果?
【发布时间】:2021-05-27 23:33:05
【问题描述】:

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

例如,如果我创建一些具有二进制响应的数据,然后创建一个 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

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

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

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

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

   acc       auc 
0.6666667 0.8036437 

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

【问题讨论】:

    标签: r h2o mlr


    【解决方案1】:

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

    set.seed(1234)
    resample(learner, task, cv3, list(auc, acc))
    
    Aggr perf: auc.test.mean=0.8526496,acc.test.mean=0.7466667
    

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

    【讨论】:

    • 请原谅我的无知。但是使用具有相同 3 倍 CV 的 resample 函数获得的性能结果,是我的拟合模型在调整参数后的实际性能吗?
    • 这是一个性能估计 - 根据您提供的重新采样和数据,这似乎是性能。当使用不同的数据/重采样时,实际 性能可以并且将会不同(如您所见)。获得更稳健的性能估计的一种方法是增加折叠的数量(10 倍是相当标准的),并且为了调整,使用嵌套重采样 -- mlr.mlr-org.com/articles/tutorial/nested_resampling.html
    • 那么,在训练模型时,如何使用调优过程中使用的相同数据/重采样?
    • 你通常不会。您将为您的实际任务获取数据并重新采样。使用来自调整过程的超参数训练的模型的性能是通过调整过程的结果来估计的。然而,这只是一个估计值,因此您观察到的性能可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 2018-12-14
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多