ParBayesianOptimization 在记录纪元结果时突然失败

ParBayesianOptimization suddenly fails while logging epoch results

我目前正在使用 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。

谢谢!

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

中对此进行了描述

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

看起来 SVM 在第 9 次迭代期间正在尝试 cost of 0。考虑到 SVM 正在解决的问题陈述,cost 参数可能应该是正数。

根据 AnotherSamWilson,当评分函数“returns 出乎意料的事情”时,通常会出现此错误。