【问题标题】:mlr: Filter Methods with Tuningmlr:带调优的过滤方法
【发布时间】:2019-09-05 11:06:51
【问题描述】:

ml 教程的这一部分:https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html#filter-methods-with-tuning 解释了如何使用 TuneWrapper 和 FilterWrapper 来调整过滤器的阈值。但是,如果我的过滤器也有需要调整的超参数,例如随机森林变量重要性过滤器,该怎么办?除了阈值,我似乎无法调整任何参数。

例如:

library(survival)
library(mlr)

data(veteran)
set.seed(24601)
task_id = "MAS"
mas.task <- makeSurvTask(id = task_id, data = veteran, target = c("time", "status"))
mas.task <- createDummyFeatures(mas.task)
tuning = makeResampleDesc("CV", iters=5, stratify=TRUE)                             # Tuning: 5-fold CV, no repeats

cox.filt.rsfrc.lrn = makeTuneWrapper(
      makeFilterWrapper(
        makeLearner(cl="surv.coxph", id = "cox.filt.rfsrc", predict.type="response"), 
        fw.method="randomForestSRC_importance",
        cache=TRUE,
        ntree=2000
      ), 
      resampling = tuning, 
      par.set = makeParamSet(
          makeIntegerParam("fw.abs", lower=2, upper=10),
          makeIntegerParam("mtry", lower = 5, upper = 15),
          makeIntegerParam("nodesize", lower=3, upper=25)
      ), 
      control = makeTuneControlRandom(maxit=20),
      show.info = TRUE)

产生错误信息:

checkTunerParset(learner, par.set, measure, control) 中的错误: 只能调整存在学习器参数的参数:mtry,nodesize

有没有办法调整随机森林的超参数?

编辑:根据 cmets 中的建议进行的其他尝试:

  1. 在输入过滤器之前将调谐器包裹在基础学习器周围(过滤器未显示) - 失败

    cox.lrn =  makeLearner(cl="surv.coxph", id = "cox.filt.rfsrc", predict.type="response")
    cox.tune = makeTuneWrapper(cox.lrn, 
                       resampling = tuning, 
                       measures=list(cindex),
                       par.set = makeParamSet(
                         makeIntegerParam("mtry", lower = 5, upper = 15),
                         makeIntegerParam("nodesize", lower=3, upper=25),
                         makeIntegerParam("fw.abs", lower=2, upper=10)
                       ),
                       control = makeTuneControlRandom(maxit=20),
                       show.info = TRUE)
    
    Error in checkTunerParset(learner, par.set, measures, control) : 
    Can only tune parameters for which learner parameters exist: mtry,nodesize,fw.abs
    
  2. 两级调优 - 失败

    cox.lrn =  makeLearner(cl="surv.coxph", id = "cox.filt.rfsrc", predict.type="response")
    cox.filt = makeFilterWrapper(cox.lrn,
                         fw.method="randomForestSRC_importance",
                         cache=TRUE,
                         ntree=2000)
    cox.tune = makeTuneWrapper(cox.filt, 
                       resampling = tuning, 
                       measures=list(cindex),
                       par.set = makeParamSet(
                         makeIntegerParam("fw.abs", lower=2, upper=10)
                       ),
                       control = makeTuneControlRandom(maxit=20),
                       show.info = TRUE)
    
    cox.tune2 = makeTuneWrapper(cox.tune, 
                       resampling = tuning, 
                       measures=list(cindex),
                       par.set = makeParamSet(
                         makeIntegerParam("mtry", lower = 5, upper = 15),
                         makeIntegerParam("nodesize", lower=3, upper=25)
                       ),
                       control = makeTuneControlRandom(maxit=20),
                       show.info = TRUE)
    
    Error in makeBaseWrapper(id, learner$type, learner, learner.subclass = c(learner.subclass,  : 
      Cannot wrap a tuning wrapper around another optimization wrapper!
    

【问题讨论】:

  • 您是否尝试过使用进入过滤器包装器的曲调包装器来包装学习器?
  • @pat-s 我无法让它工作,但这是非常必要的。我已经编辑了问题以显示我尝试过的其他事情。

标签: r mlr


【解决方案1】:

您目前似乎无法调整过滤器的超参数。您可以通过在makeFilterWrapper() 中传递某些参数来手动更改它们,但不能调整它们。 在过滤方面,您只能调整fw.absfw.percfw.tresh 之一。

我不知道在对 RandomForest 过滤器使用不同的 hyperpar 时对排名的影响有多大。检查稳健性的一种方法是在mtry 和朋友的帮助下使用mtry 的不同设置比较单个RF 模型拟合的排名@ 987654326@。如果这些之间存在非常高的秩相关,您可以放心地忽略 RF 滤波器的调谐。 (也许您想使用完全不存在此问题的其他过滤器?)

如果你坚持要这个功能,你可能需要为这个包提高 PR :)

lrn = makeLearner(cl = "surv.coxph", id = "cox.filt.rfsrc", predict.type = "response")

filter_wrapper = makeFilterWrapper(
  lrn,
  fw.method = "randomForestSRC_importance",
  cache = TRUE,
  ntrees = 2000
)

cox.filt.rsfrc.lrn = makeTuneWrapper(
  filter_wrapper,
  resampling = tuning,
  par.set = makeParamSet(
    makeIntegerParam("fw.abs", lower = 2, upper = 10)
  ),
  control = makeTuneControlRandom(maxit = 20),
  show.info = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多