【发布时间】:2022-09-10 16:13:31
【问题描述】:
我已经基于以下示例构建了一个自动化机器学习系统:
我使用了学习器 xgboost 和随机森林,并使用了branching。 xgboost 在训练阶段给了我最好的结果。因此,我提取了优化的超参数并构建了最终的 xgboost 模型:
lrn = as_learner(graph)
lrn$param_set$values = instance$result_learner_param_vals
我也对性能最好的随机森林模型的param_vals 感兴趣。
我想,我可以得到超参数并像这样保存最好的随机森林模型:
Arch = as.data.table(instance$archive, exclude_columns = NULL) # so we keep the uhash
best_RF = Arch[branch.selection == \"lrn_ranger\"]
best_RF = best_RF[which.min(best_RF$regr.rmse), ] # to get the best RF model from the data table
instance$archive$learner_param_vals(uhash = best_RF$uhash)
lrn_2 = as_learner(graph)
lrn_2$param_set$values = instance$archive$learner_param_vals(uhash = best_RF$uhash)
#lrn_2$param_set$values = instance$archive$learner_param_vals(i = best_RF$batch_nr)
当我使用uhash 或batch_nr 时,我无法检索最佳随机森林模型的超参数。我总是收到存档中第一行的param_set,而uhash 和batch_nr 是正确的:
$slct_1.selector
selector_name(c(\"T\", \"RH\"))
$missind.which
[1] \"missing_train\"
$missind.type
[1] \"factor\"
$missind.affect_columns
selector_invert(selector_type(c(\"factor\", \"ordered\", \"character\")))
$encode.method
[1] \"treatment\"
$encode.affect_columns
selector_type(\"factor\")
$branch.selection
[1] \"lrn_ranger\"
$slct_2.selector
selector_name(c(\"T\"))
$mutate.mutation
$mutate.mutation$Tra.Trafo
~(T^(2))/(2)
$mutate.delete_originals
[1] FALSE
$xgboost.nthread
[1] 1
$xgboost.verbose
[1] 0
$ranger.min.node.size
[1] 15
$ranger.mtry
[1] 1
$ranger.num.threads
[1] 1
$ranger.num.trees
[1] 26
$ranger.sample.fraction
[1] 0.8735846
当我不仅对instance$result_learner_param_vals 的输出感兴趣时,有人可以给我一个提示,告诉我如何达到提取其他超参数的目标吗?
编辑:
我想澄清一些事情,这也与分支有关。在阅读@be_marc 的评论后,我不确定它是否打算像那样工作。让我们使用我发布的图库示例作为参考。我想使用 GraphLearner 对象比较不同调整分支的结果。我已经创建了画廊示例中的最终模型,在我的例子中是 xgboost 模型。我还想为其他分支创建最终模型以进行基准测试。问题是,如果我不创建原始graph_learner 的deep clone,原始graph_learner 会更改参数branch.selection 的值。为什么我不能只使用普通的克隆?为什么一定是深度克隆?它应该像那样工作吗?很可能我不确定克隆和深度克隆之间有什么区别。
# Reference for cloning https://mlr3.mlr-org.com/reference/Resampling.html
# equivalent to object called graph_learner in mlr3 gallery example
graph_learner$param_set$values$branch.selection # original graph_learner object (reference MLR_gallery in first post)
# individually uncomment for different cases
# --------------------------------------------------------------------------------
#MLR_graph = graph # object graph_learner doesn\'t keeps its original state
#MLR_graph = graph$clone() # object graph_learner doesn\'t keeps its original state
MLR_graph = graph$clone(deep = TRUE) # object graph_learner keeps its original state
# --------------------------------------------------------------------------------
MLR_graph$param_set$values$branch.selection # value inherited from original graph
MLR_graph$param_set$values$branch.selection = \"lrn_MLR\" # change set value to other branch
MLR_graph$param_set$values$branch.selection # changed to branch \"lrn_MLR\"
MLR_lrn = as_learner(MLR_graph) # create a learner from graph with new set branch
# Here we can see the different behaviours based on if we don\'t clone, clone or deep clone
# at the end, the original graph_learner is supposed to keep it\'s original state
graph_learner$param_set$values$branch.selection
MLR_lrn$param_set$values$branch.selection
当我不使用深度克隆时,整体最佳模型lrn(跳转到本文开头)也会受到影响。就我而言,它是 xgboost。 lrn 的参数 branch.selection 设置为 lrn_MLR:
print(lrn)
<GraphLearner:slct_1.copy.missind.imputer_num.encode.featureunion.branch.nop_1.nop_2.slct_2.nop_3.nop_4.mutate.xgboost.ranger.MLR.unbranch>
* Model: list
* Parameters: slct_1.selector=<Selector>, missind.which=missing_train, missind.type=factor,
missind.affect_columns=<Selector>, encode.method=treatment, encode.affect_columns=<Selector>,
branch.selection=lrn_MLR, slct_2.selector=<Selector>, mutate.mutation=<list>, mutate.delete_originals=FALSE,
xgboost.alpha=1.891, xgboost.eta=0.06144, xgboost.lambda=0.01341, xgboost.max_depth=3, xgboost.nrounds=122,
xgboost.nthread=1, xgboost.verbose=0, ranger.num.threads=1
* Packages: mlr3, mlr3pipelines, stats, mlr3learners, xgboost, ranger
* Predict Types: [response], se, distr
* Feature Types: logical, integer, numeric, character, factor, ordered, POSIXct
* Properties: featureless, hotstart_backward, hotstart_forward, importance, loglik, missings, oob_error,
selected_features, weights
编辑2:好的,我刚刚发现,当我在实验中与不同的、不同的学习者一起工作时,我应该始终使用深度克隆:https://github.com/mlr-org/mlr3/issues/344
该行为是有意的。
-
你发现了一个错误。问题解决后我会回复您。链接到issue。
标签: mlr3