【问题标题】:How to interpret the tuning result of the GraphLearner with branches in mlr3?如何用mlr3中的分支解释GraphLearner的调优结果?
【发布时间】:2021-06-30 17:23:33
【问题描述】:

最近我跟着一些教程学习如何在 mlr3 中使用 GraphLearner。但是我仍然对 GraphLearner with branch 的调优结果感到困惑。我设置了一个简单的例子,这是我的代码:

# Create a Graph with Branch
graph_branch <- 
  po("branch", c("nop", "pca", "scale"), id = "preprocess_branch") %>>%
  gunion(list(
    po("nop"),
    po("pca", id = "pca1"),
    po("scale") %>>% po("pca", id = "pca2")
    )) %>>%
  po("unbranch", id = "preprocess_unbranch") %>>%
  po("branch", c("classif.kknn", "classif.featureless"), id = "lrn_branch") %>>%
  gunion(list(
    lrn("classif.kknn", predict_type = "prob"),
    lrn("classif.featureless", predict_type = "prob")
    )) %>>%
  po("unbranch", id = "lrn_unbranch")

# Convert a graph to a learner
graph_branch_lrn <- as_learner(graph_branch)
graph_branch_lrn$graph$plot()

# Set the tuning grid
tune_grid <- ParamSet$new(
  list(
  ParamFct$new("preprocess_branch.selection", levels = c("nop", "pca", "scale")),
  ParamInt$new("pca1.rank.", lower = 1, upper = 10),
  ParamInt$new("pca2.rank.", lower = 1, upper = 10),
  ParamFct$new("lrn_branch.selection", levels = c("classif.kknn", "classif.featureless")),
  ParamInt$new("classif.kknn.k", lower = 1, upper = 10)
  ))

# Set the instance
instance_rs <- TuningInstanceSingleCrit$new(
  task = task_train,
  learner = graph_branch_lrn,
  resampling = rsmp("cv", folds = 5),
  measure = msr("classif.auc"),
  search_space = tune_grid,
  terminator = trm("evals", n_evals = 20)
  )

# Random search tuning
tuner_rs <- tnr("random_search")
plan(multisession, workers = 5)
set.seed(100)
tuner_rs$optimize(instance_rs)
plan(sequential)

最好的调优结果是:

# Check the result
instance_rs$result_learner_param_vals

$preprocess_branch.selection
[1] "nop"

$scale.robust
[1] FALSE

$lrn_branch.selection
[1] "classif.kknn"

$classif.featureless.method
[1] "mode"

$pca1.rank.
[1] 9

$pca2.rank.
[1] 9

$classif.kknn.k
[1] 9

我想知道如果选择“nop”分支,为什么“pca1.rank”的调优结果。和“pca2.rank”。出现?我曾经考虑过,GraphLearner with branch 的调优会根据分支选择最好的结果,比如如果选择了“nop”分支,其他分支中的参数就不会考虑并出现在过程中。我是在解释 GraphLearner 调优的机制时出了什么问题,还是在代码中出了什么问题?

【问题讨论】:

    标签: r machine-learning mlr3


    【解决方案1】:

    你没有做错任何事;输出只显示 all 超参数的最佳值。并非所有这些都是相关的——在这里,您可以简单地忽略 scalepca1pca2 的值。

    【讨论】:

    • 感谢您的回答!但是,如果输出显示来自不同分支的所有超参数混合的最佳值,我怎么知道我应该选择哪个分支?例如,为什么我应该选择“nop”分支而不选择“pca1.rank.=9”或“scale”→“pca2.rank.=9”?我是否应该对输入数据进行一些预处理或只是将其保留为“nop”?我还是不太清楚。
    • 我发现在使用tune_grid$add_dep("pca1.rank.", "preprocess_branch.selection", CondEqual$new("pca"))tune_grid$add_dep("pca2.rank.", "preprocess_branch.selection", CondEqual$new("scale"))tune_grid$add_dep("classif.kknn.k", "lrn_branch.selection", CondEqual$new("classif.kknn"))设置调优网格时应该设置依赖关系。重新调整后,preprocess_branch.selection 为“nop”,pca1.rank.pca2.rank.instance_rs$result 中均为“NA”。但是instance_rs$result_learner_param_vals中的pca1.rank.pca2.rank.仍然等于9,而不是"NA",为什么?
    • instance_rs$result_learner_param_valsgraph_branch_lrn$param_set$values &lt;- instance_rs$result_learner_param_vals一样是用来finalize GraphLearner的,如果和instance_rs$result不相符,怎么用它来finalize learner?
    • 设置依赖是正确的。调整后,instance_rs$result 应该包含NAs 用于未选择分支上的参数。列表instance_rs$result_learner_param_vals 不应包含这些参数的任何元素。我无法重现您在最新的 mlr3 和 mlr3tuning CRAN 和 gh 版本中描述的行为。您可以在新会话中再次检查吗?
    • @be-marc 清除环境并重新运行整个管道后,instance_rs$resultinstance_rs$result_learner_param_vals 变得相同。问题已解决。谢谢!
    猜你喜欢
    • 2021-05-23
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多