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()
的结果。
细节
模拟退火是一种全局优化方法。对于模型调整,它可用于迭代搜索参数空间以获得最佳调整参数组合。在每次迭代中,通过以某种小的方式扰动当前参数来创建新的参数组合,使它们位于一个小邻域内。这种新的参数组合用于拟合模型,并使用重采样(或简单的验证集)来测量模型的性能。
如果新设置比当前设置具有更好的结果,则会接受它们并继续该过程。
如果新设置的性能较差,则计算概率阈值以接受这些次优值。概率是结果次优程度以及迭代次数的函数。这被称为算法的"cooling schedule"。如果次优结果被接受,则下一次迭代设置将基于这些较差的结果。否则,将从先前迭代的设置生成新的参数值。
此过程会持续进行预定义的迭代次数,并建议使用总体最佳设置。 control_sim_anneal()
函数可以指定迭代次数,而无需改进提前停止。此外,该函数还可用于指定重新启动阈值;如果在一定次数的迭代内没有发现全局最佳结果,则该过程可以使用最后已知的全局最佳设置重新启动。
创建新设置
对于每个数字参数,可能值的范围以及任何转换都是已知的。当前值经过转换并缩放为 0 到 1 之间的值(基于可能的值范围)。生成位于rmin
和rmax
之间随机半径的球体上的一组候选值。删除不可行的值并随机选择一个值。该值将重新转换为原始单位和比例,并用作新设置。 control_sim_anneal()
的参数 radius
控制范围邻域大小。
对于分类参数和整数参数,每个参数都会以预定义的概率发生变化。 control_sim_anneal()
的 flip
参数可用于指定此概率。对于整数参数,使用附近的整数值。
当许多参数是非数字或唯一值很少的整数时,模拟退火搜索可能不是首选方法。在这些情况下,同一候选集可能会被测试多次。
冷却时间表
为了确定接受新值的概率,需要计算性能差异百分比。如果要最大化性能指标,则为 d = (new-old)/old*100
。概率计算为 p = exp(d * coef * iter)
,而 coef
是用户定义的常量,可用于增加或减少概率。
control_sim_anneal()
的cooling_coef
可用于此目的。
例子
# \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)
# }
相关用法
- R finetune tune_race_anova 通过方差分析模型进行高效网格搜索
- R finetune tune_race_win_loss 通过带有输赢统计数据的比赛进行高效的网格搜索
- R finetune control_race 网格搜索竞赛过程的控制方面
- R finetune control_sim_anneal 模拟退火搜索过程的控制方面
- R SparkR first用法及代码示例
- R SparkR fitted用法及代码示例
- R SparkR filter用法及代码示例
- R SparkR freqItems用法及代码示例
- R write.dbf 写入 DBF 文件
- R forcats fct_relevel 手动重新排序因子级别
- R forcats as_factor 将输入转换为因子
- R forcats fct_anon 匿名因子水平
- R write.foreign 编写文本文件和代码来读取它们
- R forcats fct_inorder 按首次出现、频率或数字顺序对因子水平重新排序
- R forcats fct_rev 因子水平的倒序
- R write.dta 以 Stata 二进制格式写入文件
- R forcats fct_match 测试因子中是否存在水平
- R forcats fct_relabel 使用函数重新标记因子水平,并根据需要折叠
- R S3 读取 S3 二进制或 data.dump 文件
- R forcats fct_drop 删除未使用的级别
- R forcats fct_c 连接因子,组合级别
- R forcats fct_collapse 将因子级别折叠为手动定义的组
- R read.ssd 通过 read.xport 从 SAS 永久数据集中获取数据帧
- R read.dbf 读取 DBF 文件
- R read.mtp 阅读 Minitab 便携式工作表
注:本文由纯净天空筛选整理自Max Kuhn等大神的英文原创作品 Optimization of model parameters via simulated annealing。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。