【问题标题】:ParBayesianOptimization suddenly fails while logging epoch resultsParBayesianOptimization 在记录 epoch 结果时突然失败
【发布时间】:2021-07-28 18:35:50
【问题描述】:

我目前正在使用 R 包 ParBayesianOptimization 来调整 ML 方法的参数。在为svmLinear2 模型(包含在caret 中)搜索最佳cost 参数时,优化在成功完成15 次迭代后突然停止。

这是错误回溯:

Error in rbindlist(l, use.names, fill, idcol) : 
  Item 2 has 9 columns, inconsistent with item 1 which has 10 columns. To fill missing columns use fill=TRUE. 
7.
rbindlist(l, use.names, fill, idcol) 
6.
rbind(deparse.level, ...) 
5.
rbind(scoreSummary, data.table(Epoch = rep(Epoch, nrow(NewResults)), 
    Iteration = 1:nrow(NewResults) + nrow(scoreSummary), inBounds = rep(TRUE, 
        nrow(NewResults)), NewResults)) 
4.
addIterations(optObj, otherHalting = otherHalting, iters.n = iters.n, 
    iters.k = iters.k, parallel = parallel, plotProgress = plotProgress, 
    errorHandling = errorHandling, saveFile = saveFile, verbose = verbose, 
    ...) 
3.
ParBayesianOptimization::bayesOpt(FUN = ...

因此,不知何故,每次迭代存储摘要信息的数据表在存在的列数上突然不同。这是ParBayesianOptimization 包的常见错误吗?有没有其他人遇到过类似的问题?除了重写 addIterations 函数来填充缺失的列之外,您找到解决方法了吗?

编辑:我没有解释为什么在多次成功迭代后会突然发生错误。但是,使用svmLinearsvmRadial 时再次出现此问题。我能够在iris 数据集上重建一个具有相同错误的类似案例:

library(data.table)
library(caret)
library(ParBayesianOptimization)
set.seed(1234)

bayes.opt.bounds = list()
bayes.opt.bounds[["svmRadial"]] = list(C = c(0,1000),
                                       sigma = c(0,500))

svmRadScore = function(...){
  grid = data.frame(...)
  mod = caret::train(Species~., data=iris, method = "svmRadial",
                     trControl = trainControl(method = "repeatedcv",
                                              number = 7, repeats = 5),
                     tuneGrid = grid)
  return(list(Score = caret::getTrainPerf(mod)[, "TrainAccuracy"], Pred = 0))
}

bayes.create.grid.par = function(bounds, n = 10){
  grid = data.table()
  params = names(bounds)
  grid[, c(params) := lapply(bounds, FUN = function(minMax){ 
    return(runif(n, minMax[1], minMax[2]))}
  )]
  return(grid)
}

prior.grid.rad = bayes.create.grid.par(bayes.opt.bounds[["svmRadial"]])
svmRadOpt = ParBayesianOptimization::bayesOpt(FUN = svmRadScore,
                                              bounds = bayes.opt.bounds[["svmRadial"]],
                                              initGrid = prior.grid.rad,
                                              iters.n = 100,
                                              acq = "ucb", kappa = 1, parallel = FALSE,plotProgress = TRUE)

使用此示例,错误发生在第 9 个 epoch。

谢谢!

【问题讨论】:

  • 您能否提供使用的数据,作为可重复的示例?只看回溯真的很难说。另外,提供给 PBO 的电话,这也会有所帮助。
  • @eduardokapp 遗憾的是,我无法分享我的原始数据,但我能够在 iris 数据集上使用 svmRadial 重现错误。
  • 太棒了!我稍后会研究它。

标签: r optimization hyperparameters


【解决方案1】:

It appears that the scoring function returned NAs in place of accuracy measures 导致下游错误。这已由库的创建者在

https://github.com/AnotherSamWilson/ParBayesianOptimization/issues/33.

在第 9 次迭代期间,SVM 似乎正在尝试 cost0。鉴于 SVM 正在解决的问题陈述,cost 参数可能应该是正数。

根据AnotherSamWilson的说法,这个错误通常发生在评分函数“返回意外的东西”时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2016-10-04
    相关资源
    最近更新 更多