【问题标题】:mlr: Tune model parameters with validation setmlr:使用验证集调整模型参数
【发布时间】:2019-01-12 05:52:00
【问题描述】:

刚刚切换到mlr 用于我的机器学习工作流程。我想知道是否可以使用单独的验证集来调整超参数。根据我的最低理解,makeResampleDescmakeResampleInstance 只接受从训练数据中重新采样。

我的目标是使用验证集调整参数并使用测试集测试最终模型。这是为了防止过拟合和知识泄露。

这是我在代码方面所做的:

## Create training, validation and test tasks
train_task <- makeClassifTask(data = train_data, target = "y", positive = 1)
validation_task <- makeClassifTask(data = validation_data, target = "y")
test_task <- makeClassifTask(data = test_data, target = "y")

## Attempt to tune parameters with separate validation data
tuned_params <- tuneParams(
    task = train_task,
    resampling = makeResampleInstance("Holdout", task = validation_task),
    ...
)

从错误消息来看,评估似乎仍在尝试从训练集中重新采样:

00001:resample.fun 中的错误(learner2,task,resampling,measures = 措施,:数据集的大小:19454 和重采样实例: 1666333 不同!

有人知道我应该怎么做吗?我是否以正确的方式设置了所有内容?

【问题讨论】:

  • 您不需要将数据拆分为单独的任务,您可以只使用一个和nested resampling。特别是,您将对外部进行坚持重采样,并对内部进行任何您想要的其他操作。

标签: r hyperparameters mlr


【解决方案1】:

[2019 年 3 月 27 日更新]

按照@jakob-r 的评论,终于理解了@LarsKotthoff 的建议,这就是我所做的:

## Create combined training data
train_task_data <- rbind(train_data, validation_data)

## Create learner, training task, etc.
xgb_learner <- makeLearner("classif.xgboost", predict.type = "prob")
train_task <- makeClassifTask(data = train_task_data, target = "y", positive = 1)

## Tune hyperparameters
tune_wrapper <- makeTuneWrapper(
  learner = xgb_learner,
  resampling = makeResampleDesc("Holdout"),
  measures = ...,
  par.set = ...,
  control = ...
)
model_xgb <- train(tune_wrapper, train_task)

这是我在@LarsKotthoff 发表评论后所做的。假设您有两个单独的数据集用于训练 (train_data) 和验证 (validation_data):

## Create combined training data
train_task_data <- rbind(train_data, validation_data)
size <- nrow(train_task_data)
train_ind <- seq_len(nrow(train_data))
validation_ind <- seq.int(max(train_ind) + 1, size)

## Create training task
train_task <- makeClassifTask(data = train_task_data, target = "y", positive = 1)

## Tune hyperparameters
tuned_params <- tuneParams(
    task = train_task,
    resampling = makeFixedHoldoutInstance(train_ind, validation_ind, size),
    ...
)

优化超参数集后,您可以构建最终模型并针对您的测试数据集进行测试。

注意:我必须从 GitHub 安装最新的开发版本(截至 2018 年 8 月 6 日)。当前 CRAN 版本 (2.12.1) 在我调用 makeFixedHoldoutInstance() 时会引发错误,即,

“discrete.names”断言失败:必须是“逻辑标志”类型, 不是'NULL'。

【讨论】:

  • 但是@Lars 将您指向嵌套重采样页面,它直接告诉您在学习器上使用makeTuneWrapper()。之后您不再手动调用tuneParams()
猜你喜欢
  • 2017-10-12
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2017-03-08
相关资源
最近更新 更多