当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R finetune tune_sim_anneal 通过模拟退火优化模型参数


tune_sim_anneal() 使用迭代搜索过程根据先前的结果生成新的候选调整参数组合。它使用 Bohachevsky、Johnson 和 Stein (1986) 的广义模拟退火方法。

用法

tune_sim_anneal(object, ...)

# S3 method for model_spec
tune_sim_anneal(
  object,
  preprocessor,
  resamples,
  ...,
  iter = 10,
  param_info = NULL,
  metrics = NULL,
  initial = 1,
  control = control_sim_anneal()
)

# S3 method for workflow
tune_sim_anneal(
  object,
  resamples,
  ...,
  iter = 10,
  param_info = NULL,
  metrics = NULL,
  initial = 1,
  control = control_sim_anneal()
)

参数

object

parsnip 模型规范或 workflows::workflow()

...

目前未使用。

preprocessor

使用 recipes::recipe() 创建的传统模型公式或配方。仅当 object 不是工作流程时才需要这样做。

resamples

rset() 对象。

iter

搜索迭代的最大次数。

param_info

dials::parameters() 对象或 NULL 。如果没有给出,则从其他参数派生参数集。当需要自定义参数范围时,传递此参数可能很有用。

metrics

yardstick::metric_set() 对象,包含有关如何评估模型性能的信息。 metrics 中的第一个指标是要优化的指标。

initial

整齐格式的初始结果集(如 tune_grid()tune_bayes()tune_race_win_loss()tune_race_anova() 的结果)或正整数。如果初始对象是顺序搜索方法,则模拟退火迭代在初始结果的最后一次迭代之后开始。

control

control_sim_anneal() 的结果。

反映 tune_grid() 生成的结果的一小部分结果。但是,这些结果包含 .iter 列并复制 rset

在迭代中多次对象(以有限的额外内存成本)。

细节

模拟退火是一种全局优化方法。对于模型调整,它可用于迭代搜索参数空间以获得最佳调整参数组合。在每次迭代中,通过以某种小的方式扰动当前参数来创建新的参数组合,使它们位于一个小邻域内。这种新的参数组合用于拟合模型,并使用重采样(或简单的验证集)来测量模型的性能。

如果新设置比当前设置具有更好的结果,则会接受它们并继续该过程。

如果新设置的性能较差,则计算概率阈值以接受这些次优值。概率是结果次优程度以及迭代次数的函数。这被称为算法的"cooling schedule"。如果次优结果被接受,则下一次迭代设置将基于这些较差的结果。否则,将从先前迭代的设置生成新的参数值。

此过程会持续进行预定义的迭代次数,并建议使用总体最佳设置。 control_sim_anneal() 函数可以指定迭代次数,而无需改进提前停止。此外,该函数还可用于指定重新启动阈值;如果在一定次数的迭代内没有发现全局最佳结果,则该过程可以使用最后已知的全局最佳设置重新启动。

创建新设置

对于每个数字参数,可能值的范围以及任何转换都是已知的。当前值经过转换并缩放为 0 到 1 之间的值(基于可能的值范围)。生成位于rminrmax 之间随机半径的球体上的一组候选值。删除不可行的值并随机选择一个值。该值将重新转换为原始单位和比例,并用作新设置。 control_sim_anneal() 的参数 radius 控制范围邻域大小。

对于分类参数和整数参数,每个参数都会以预定义的概率发生变化。 control_sim_anneal()flip 参数可用于指定此概率。对于整数参数,使用附近的整数值。

当许多参数是非数字或唯一值很少的整数时,模拟退火搜索可能不是首选方法。在这些情况下,同一候选集可能会被测试多次。

冷却时间表

为了确定接受新值的概率,需要计算性能差异百分比。如果要最大化性能指标,则为 d = (new-old)/old*100 。概率计算为 p = exp(d * coef * iter),而 coef 是用户定义的常量,可用于增加或减少概率。

control_sim_anneal()cooling_coef 可用于此目的。

终止标准

当找到新的全局最佳结果时,重新启动计数器会重置。

当找到新的全局最佳值或改进次优结果时,终止计数器会重置。

并行性

tunefinetune 包当前通过重新采样并行化。指定并行 back-end 将改善 sub-models 初始集(如果有)的生成。如果注册了并行后端,则搜索的每次迭代也会并行运行。

参考

Bohachevsky、Johnson 和 Stein (1986)“函数优化的广义模拟退火”,Technometrics,28:3, 209-217

例子

# \donttest{
library(finetune)
library(rpart)
#> 
#> Attaching package: ‘rpart’
#> The following object is masked from ‘package:dials’:
#> 
#>     prune
library(dplyr)
#> 
#> Attaching package: ‘dplyr’
#> The following object is masked from ‘package:MASS’:
#> 
#>     select
#> The following objects are masked from ‘package:stats’:
#> 
#>     filter, lag
#> The following objects are masked from ‘package:base’:
#> 
#>     intersect, setdiff, setequal, union
library(tune)
library(rsample)
library(parsnip)
library(workflows)
library(ggplot2)

## -----------------------------------------------------------------------------
if (rlang::is_installed("modeldata")) {
  data(two_class_dat, package = "modeldata")

  set.seed(5046)
  bt <- bootstraps(two_class_dat, times = 5)

  ## -----------------------------------------------------------------------------

  cart_mod <-
    decision_tree(cost_complexity = tune(), min_n = tune()) %>%
    set_engine("rpart") %>%
    set_mode("classification")

  ## -----------------------------------------------------------------------------

  # For reproducibility, set the seed before running.
  set.seed(10)
  sa_search <-
    cart_mod %>%
    tune_sim_anneal(Class ~ ., resamples = bt, iter = 10)

  autoplot(sa_search, metric = "roc_auc", type = "parameters") +
    theme_bw()

  ## -----------------------------------------------------------------------------
  # More iterations. `initial` can be any other tune_* object or an integer
  # (for new values).

  set.seed(11)
  more_search <-
    cart_mod %>%
    tune_sim_anneal(Class ~ ., resamples = bt, iter = 10, initial = sa_search)

  autoplot(more_search, metric = "roc_auc", type = "performance") +
    theme_bw()
}
#> Optimizing roc_auc
#> Initial best: 0.81147
#> 1 ♥ new best           roc_auc=0.82651 (+/-0.004242)
#> 2 ♥ new best           roc_auc=0.83439 (+/-0.009983)
#> 3 ♥ new best           roc_auc=0.83912 (+/-0.007893)
#> 4 ♥ new best           roc_auc=0.84267 (+/-0.006609)
#> 5 ◯ accept suboptimal  roc_auc=0.83949 (+/-0.008792)
#> 6 ◯ accept suboptimal  roc_auc=0.83751 (+/-0.01065)
#> 7 + better suboptimal  roc_auc=0.84225 (+/-0.009044)
#> 8 ◯ accept suboptimal  roc_auc=0.83736 (+/-0.01063)
#> 9 + better suboptimal  roc_auc=0.84225 (+/-0.009044)
#> 10 ◯ accept suboptimal  roc_auc=0.84225 (+/-0.009044)
#> There were 10 previous iterations
#> Optimizing roc_auc
#> 10 ✔ initial            roc_auc=0.84267 (+/-0.006609)
#> 11 ◯ accept suboptimal  roc_auc=0.83949 (+/-0.008792)
#> 12 ◯ accept suboptimal  roc_auc=0.83736 (+/-0.01063)
#> 13 + better suboptimal  roc_auc=0.84225 (+/-0.009044)
#> 14 ◯ accept suboptimal  roc_auc=0.84225 (+/-0.009044)
#> 15 ◯ accept suboptimal  roc_auc=0.83751 (+/-0.01065)
#> 16 + better suboptimal  roc_auc=0.84225 (+/-0.009044)
#> 17 ◯ accept suboptimal  roc_auc=0.83949 (+/-0.008792)
#> 18 ✖ restart from best  roc_auc=0.8421 (+/-0.007206)
#> 19 ◯ accept suboptimal  roc_auc=0.83928 (+/-0.007538)
#> 20 ─ discard suboptimal roc_auc=0.82378 (+/-0.01017)

# }

相关用法


注:本文由纯净天空筛选整理自Max Kuhn等大神的英文原创作品 Optimization of model parameters via simulated annealing。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。