【问题标题】:How to use tune parameters for multilabel classification in mlr?如何在 mlr 中使用调整参数进行多标签分类?
【发布时间】:2021-05-05 09:29:03
【问题描述】:

问题

我正在尝试使用 mlr 包在 r 中运行多标签分类。我使用https://www.rdocumentation.org/packages/mlr/versions/2.19.0/topics/makeMultilabelClassifierChainsWrapper 来实现多标签分类。 但我需要添加超参数调整。这似乎会产生各种问题。我按照https://mlr.mlr-org.com/articles/tutorial/tune.html 上的示例调整参数。 tuneParams 需要参数 resample 并且我被卡住了。

示例数据

age <- c(round(rnorm(120,mean = 50,sd = 10)))
sex <- c(round(rnorm(120,mean = 0.5,sd = 0.2)))
l1 <- as.logical(c(round(rnorm(120,mean = 0.5,sd = 0.2))))
l2 <- as.logical(c(round(rnorm(120,mean = 0.5,sd = 0.2))))
l3 <- as.logical(c(round(rnorm(120,mean = 0.5,sd = 0.2))))
l4 <- as.logical(c(round(rnorm(120,mean = 0.5,sd = 0.2))))
data <- as.data.frame(cbind(age,sex,l1,l2,l3,l4))

实际上我有 12 个标签,但为了便于查看,我省略了其他标签。 这个想法是 l1 直到 l4 是逻辑向量。不知何故,这不起作用,所以我希望你能解决这个问题。但请注意,这不是我的主要问题。

代码

task <- makeMultilabelTask(data = data, target = label_bact) 

ps <- makeParamSet(
    makeDiscreteParam("ntree",values = c(50,100,150,200,300,500,550)),
    makeDiscreteParam("mtry",values = c(1,2,3,4,5))
)
ctrl <- makeTuneControlGrid()
rdesc <- makeResampleDesc(method = "CV",iters = 5, predict = "test",
                          stratify.cols = c(l1,l2,l3,l4)
measure  <- acc
learner <- "classif.randomForest"
lrn <- makeLearner(learner)
lrn <- makeMultilabelClassifierChainsWrapper(lrn, order = NULL) 
lrn <- setPredictType(lrn,"prob")
res <- tuneParams(lrn,task = task,resample = rdesc, par.set = ps,control = ctrl)

错误

我得到的错误:

Error in tuneParams(lrn, task = task, resample = rdesc, par.set = ps,  : 
  Assertion on 'resample.fun' failed: Must be a function, not 'CVDesc/ResampleDesc'.

所以我添加了代码行:

r <- resample(learner = lrn,task = task,rdesc)

这告诉我

Error in makeResampleInstance(resampling, task = task) : 
  Stratification for tasks of type 'multilabel' not supported

检查

这得到证实:

>rdesc
Resample description: cross-validation with 5 iterations.
Predict: test
Stratification: FALSE

问题

  • 所以第一个问题是如何解决多个结果标签的分层(在 makeResampleDesc 函数中)?
  • 第二个问题是如何使 tuneParams 函数工作?
  • 相关问题是有没有办法跳过重采样参数,因为我已经在这些函数之外进行了 CV 和分层?

提前致谢!

【问题讨论】:

  • 1.请不要一次发布多个问题。 2. 分层错误似乎很有描述性。 3. 在调整参数时,您总是需要一种重采样方法(不确定您为什么要在“外部”做某事,或者您的意思是什么)。 4. 尝试在一个最小的代码块中包含一个完整的可重现示例。这个问题(和你以前的问题)太大而分散,无法给出体面的答案。
  • @pat-s 2. 你知道如何解决这个问题吗? 3. 我使用嵌套 CV 并将内部训练数据传递给处理多标签分类的函数。 4.当前代码块有什么问题?

标签: multilabel-classification hyperparameters mlr


【解决方案1】:

试试这个:

rf <- makeLearner("classif.randomForest", predict.type = "response", par.vals = list(ntree = 200, mtry = 3))
     
rf$par.vals <- list(importance = TRUE)
     
rf=makeDownsampleWrapper(rf, dw.stratify = TRUE)

rf=makeMultilabelClassifierChainsWrapper( rf ) 

rf_param <- makeParamSet(
makeIntegerParam("ntree",lower = 50, upper = 500),
makeIntegerParam("mtry", lower = 3, upper = 10),
makeIntegerParam("nodesize", lower = 10, upper = 50)
)

rancontrol <- makeTuneControlRandom(maxit = 5L)

#set 3 fold cross validation
 set_cv <- makeResampleDesc("CV",iters = 3L)

#hypertuning
 rf_tune <- tuneParams(learner = rf, resampling = set_cv,  task =base_pred.task, par.set = rf_param, control = rancontrol, measures = multilabel.hamloss)

它对我有用!希望对你有用

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 2019-07-06
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2021-04-12
    • 2017-11-09
    • 2012-05-14
    • 2019-09-24
    相关资源
    最近更新 更多