先验设置调整参数范围
Set tuning parameter range a priori
我知道在 tidymodels
中,您可以通过直接与工作流对象交互来设置自定义可调参数 space,如下所示:
library(tidymodels)
model <- linear_reg(
mode = "regression",
engine = "glmnet",
penalty = tune()
)
rec_cars <- recipe(mpg ~ ., data = mtcars)
wkf <- workflow() %>%
add_recipe(rec_cars) %>%
add_model(model)
wkf_new_param_space <- wkf %>%
parameters() %>%
update(penalty = penalty(range = c(0.9, 1)))
但有时在我指定配方或模型时立即执行此操作更有意义。
有人知道实现这个的方法吗?
参数范围与 tidymodels 中的模型规范和配方规范本质上是分开的。当您设置 tune()
时,您正在向调谐函数发出一个信号,即该参数将采用多个值并且应该进行调整。
所以作为一个简短的回答,你不能在指定配方或模型时指定参数范围,但你可以像你一样在之后立即创建参数对象。
最后,您需要参数集来构建用于超参数调整的网格值,并且您可以通过至少 4 种方式创建这些 gid 值。
第一种方法是按照您现在的方式进行,将需要的参数从工作流程中提取出来,并在需要时进行修改。
第二种方法 是创建一个参数对象,该对象将匹配您需要使用的参数。此选项和其余选项要求您确保为正在调整的所有参数创建值。
第三种方法 是完全跳过参数对象并使用 grid_*()
函数和拨号函数创建网格。
第四种方法是完全跳过拨号函数,自己创建数据框。我发现 tidyr::crossing()
是 grid_regular()
的有用替代品。当您使用整数参数和无法从转换中获益的参数时,这种方式会容易得多。
library(tidymodels)
model <- linear_reg(
mode = "regression",
engine = "glmnet",
penalty = tune()
)
rec_cars <- recipe(mpg ~ ., data = mtcars)
wkf <- workflow() %>%
add_recipe(rec_cars) %>%
add_model(model)
# Option 1: using parameters() on workflow
wkf_new_param_space <- wkf %>%
parameters() %>%
update(penalty = penalty(range = c(-5, 5)))
wkf_new_param_space %>%
grid_regular(levels = 10)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 2: Using parameters() on list
my_params <- parameters(
list(
penalty(range = c(-5, 5))
)
)
my_params %>%
grid_regular(levels = 10)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 3: Use grid_*() with dials objects directly
grid_regular(
penalty(range = c(-5, 5)),
levels = 10
)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 4: Create grid values manually
tidyr::crossing(
penalty = 10 ^ seq(-5, 5, length.out = 10)
)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
由 reprex package (v2.0.1)
于 2021-08-17 创建
这似乎是一个老问题,但我很难尝试在我的工作流程中插入这种方法(选项 1)。
应该如何继续?
wkf_new_param_space在调整模型中用作网格还是用作对象?
model_tuned <-
tune::tune_grid(
object = wkf_new_param_space, ?
resamples = cv_folds,
grid = wkf_new_param_space, ?
metrics = model_metrics,
control = tune::control_grid(save_pred = TRUE, save_workflow = TRUE)
)
我知道在 tidymodels
中,您可以通过直接与工作流对象交互来设置自定义可调参数 space,如下所示:
library(tidymodels)
model <- linear_reg(
mode = "regression",
engine = "glmnet",
penalty = tune()
)
rec_cars <- recipe(mpg ~ ., data = mtcars)
wkf <- workflow() %>%
add_recipe(rec_cars) %>%
add_model(model)
wkf_new_param_space <- wkf %>%
parameters() %>%
update(penalty = penalty(range = c(0.9, 1)))
但有时在我指定配方或模型时立即执行此操作更有意义。
有人知道实现这个的方法吗?
参数范围与 tidymodels 中的模型规范和配方规范本质上是分开的。当您设置 tune()
时,您正在向调谐函数发出一个信号,即该参数将采用多个值并且应该进行调整。
所以作为一个简短的回答,你不能在指定配方或模型时指定参数范围,但你可以像你一样在之后立即创建参数对象。
最后,您需要参数集来构建用于超参数调整的网格值,并且您可以通过至少 4 种方式创建这些 gid 值。
第一种方法是按照您现在的方式进行,将需要的参数从工作流程中提取出来,并在需要时进行修改。
第二种方法 是创建一个参数对象,该对象将匹配您需要使用的参数。此选项和其余选项要求您确保为正在调整的所有参数创建值。
第三种方法 是完全跳过参数对象并使用 grid_*()
函数和拨号函数创建网格。
第四种方法是完全跳过拨号函数,自己创建数据框。我发现 tidyr::crossing()
是 grid_regular()
的有用替代品。当您使用整数参数和无法从转换中获益的参数时,这种方式会容易得多。
library(tidymodels)
model <- linear_reg(
mode = "regression",
engine = "glmnet",
penalty = tune()
)
rec_cars <- recipe(mpg ~ ., data = mtcars)
wkf <- workflow() %>%
add_recipe(rec_cars) %>%
add_model(model)
# Option 1: using parameters() on workflow
wkf_new_param_space <- wkf %>%
parameters() %>%
update(penalty = penalty(range = c(-5, 5)))
wkf_new_param_space %>%
grid_regular(levels = 10)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 2: Using parameters() on list
my_params <- parameters(
list(
penalty(range = c(-5, 5))
)
)
my_params %>%
grid_regular(levels = 10)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 3: Use grid_*() with dials objects directly
grid_regular(
penalty(range = c(-5, 5)),
levels = 10
)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
# Option 4: Create grid values manually
tidyr::crossing(
penalty = 10 ^ seq(-5, 5, length.out = 10)
)
#> # A tibble: 10 × 1
#> penalty
#> <dbl>
#> 1 0.00001
#> 2 0.000129
#> 3 0.00167
#> 4 0.0215
#> 5 0.278
#> 6 3.59
#> 7 46.4
#> 8 599.
#> 9 7743.
#> 10 100000
由 reprex package (v2.0.1)
于 2021-08-17 创建这似乎是一个老问题,但我很难尝试在我的工作流程中插入这种方法(选项 1)。
应该如何继续?
wkf_new_param_space在调整模型中用作网格还是用作对象?
model_tuned <-
tune::tune_grid(
object = wkf_new_param_space, ?
resamples = cv_folds,
grid = wkf_new_param_space, ?
metrics = model_metrics,
control = tune::control_grid(save_pred = TRUE, save_workflow = TRUE)
)