當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。