能否使用全数据集调优学习器?mlr3如何结合特征选择与模型调优
关于mlr3使用的两个问题解答
问题1:全量数据调优的合理性判断
- 首先明确mlr3gallery的案例多为教程演示属性,为了降低理解门槛、聚焦调优操作本身,普遍省略了嵌套交叉验证的外层评估流程,不能直接等同于生产落地的标准流程。
- 全量数据调优是否合理完全取决于你的使用目标:
- 如果你的最终目标是训练可直接上线部署的模型,不需要再对这套建模流程的泛化性能做无偏估计,用全量数据调优是完全合理的:调优得到最优超参数后,再用全量数据+最优参数训练最终模型即可。
- 如果你需要先验证整套建模+调优流程的泛化能力,必须使用嵌套交叉验证:外层交叉验证负责输出无偏的性能估计,调优操作完全放在外层每个训练折的内部执行,绝对不能让外层测试集的信息泄露到调优环节,否则得到的性能估计会存在乐观偏差。
问题2:特征选择与模型调优结合的实现方案
mlr3生态下完全可以通过mlr3pipelines管道工具实现该需求,常用两种实现路径:
- 过滤式特征选择+超参数联合调优
将特征选择节点和学习器节点串联为图学习器,同时对特征选择的阈值/保留数量、学习器超参数做联合调优,示例逻辑如下:
# 加载依赖包 library(mlr3) library(mlr3pipelines) library(mlr3tuning) library(mlr3filters) # 构造管道:先做F检验特征过滤,再接SVM学习器 graph = po("filter", filter = flt("f_test"), filter.nfeat = to_tune(5, 20)) %>>% po("learner", lrn("classif.svm", cost = to_tune(1e-2, 1e2), kernel = to_tune(c("linear", "rbf")) )) # 转为图学习器 graph_learner = as_learner(graph) # 后续可直接对graph_learner执行常规调优流程,特征数和SVM参数会同时优化
- 包裹式/嵌入式特征选择+超参数联合调优
如果需要用递归特征消除、序列选择这类wrapper式特征选择,可以结合mlr3fselect包实现:将特征选择实例与调优实例同时嵌套进交叉验证的内层,或直接用AutoFSelector包裹带调参空间的学习器,对AutoFSelector整体执行调优即可。
注意:如果需要得到无偏的泛化性能估计,整套特征选择+调优的流程必须全部放在嵌套交叉验证的内层执行,不可引入外层测试集的信息。
内容的提问来源于stack exchange,提问作者LengJH
相关产品推荐
相关产品推荐

