R - mlr - 搜索超参数时Benchmark和Resample有什么区别
R - mlr - What is the difference between Benchmark and Resample when searching for hyperparameters
我正在寻找最佳的超参数设置,我意识到我可以在 MLR 中以两种方式做到这一点。基准函数和重采样函数。两者有什么区别?
如果我通过基准测试来做,我可以比较多个模型,并提取调整后的参数,这比重采样更有优势。相反,如果我使用重采样,我一次只能调整一个模型,而且我还注意到我的 CPU 飞涨。
我应该如何以及何时使用一个而不是另一个?
data(BostonHousing, package = "mlbench")
BostonHousing$chas <- as.integer(levels(BostonHousing$chas))[BostonHousing$chas]
library('mlr')
library('parallel')
library("parallelMap")
# ---- define learning tasks -------
regr.task = makeRegrTask(id = "bh", data = BostonHousing, target = "medv")
# ---- tune Hyperparameters --------
set.seed(1234)
# Define a search space for each learner'S parameter
ps_xgb = makeParamSet(
makeIntegerParam("nrounds",lower=5,upper=50),
makeIntegerParam("max_depth",lower=3,upper=15),
# makeNumericParam("lambda",lower=0.55,upper=0.60),
# makeNumericParam("gamma",lower=0,upper=5),
makeNumericParam("eta", lower = 0.01, upper = 1),
makeNumericParam("subsample", lower = 0, upper = 1),
makeNumericParam("min_child_weight",lower=1,upper=10),
makeNumericParam("colsample_bytree",lower = 0.1,upper = 1)
)
# Choose a resampling strategy
rdesc = makeResampleDesc("CV", iters = 5L)
# Choose a performance measure
meas = rmse
# Choose a tuning method
ctrl = makeTuneControlRandom(maxit = 30L)
# Make tuning wrappers
tuned.lm = makeLearner("regr.lm")
tuned.xgb = makeTuneWrapper(learner = "regr.xgboost", resampling = rdesc, measures = meas,
par.set = ps_xgb, control = ctrl, show.info = FALSE)
# -------- Benchmark experiements -----------
# Four learners to be compared
lrns = list(tuned.lm, tuned.xgb)
#setup Parallelization
parallelStart(mode = "socket", #multicore #socket
cpus = detectCores(),
# level = "mlr.tuneParams",
mc.set.seed = TRUE)
# Conduct the benchmark experiment
bmr = benchmark(learners = lrns,
tasks = regr.task,
resamplings = rdesc,
measures = rmse,
keep.extract = T,
models = F,
show.info = F)
parallelStop()
# ------ Extract HyperParameters -----
bmr_hp <- getBMRTuneResults(bmr)
bmr_hp$bh$regr.xgboost.tuned[[1]]
res <-
resample(
tuned.xgb,
regr.task,
resampling = rdesc,
extract = getTuneResult, #getFeatSelResult, getTuneResult
show.info = TRUE,
measures = meas
)
res$extract
If i were to do it via benchmark, i can compare multiple models, and
extract the tuned parameters which is an advantage over resample.
您也可以使用 resample()
。
benchmark()
只是 resample()
的包装,可以更轻松地 运行 在多个 tasks/learners/resamplings.
上进行实验
基准测试和重采样是正交的概念——您可以单独使用它们,也可以一起使用。
重采样 确保学习的模型得到适当的评估。特别是,我们不想通过给学习模型提供我们用于训练它的相同数据来评估学习模型,因为这样模型可以只记住数据并且看起来像是完美的模型。相反,我们在不同的、保留的数据上评估它,看看它是否已经学会了一般概念,以及是否能够对看不见的数据做出良好的预测。重采样决定了这种拆分为训练和测试数据的方式,使用了多少次不同训练和测试拆分的迭代等。
基准测试 允许您比较不同学习者在不同任务上的表现。这是 运行 大规模比较实验的便捷方法,否则您必须通过组合所有学习者和所有任务、训练和评估模型并确保一切都以完全相同的方式进行手动执行。为了确定学习者的表现及其在给定任务上诱导的模型,使用了重采样策略,如上所述。
所以简而言之,你的问题的答案是当你想评估学习模型的性能时使用重采样,当你想比较不同学习者在不同任务上的性能时使用重采样进行基准测试。
我正在寻找最佳的超参数设置,我意识到我可以在 MLR 中以两种方式做到这一点。基准函数和重采样函数。两者有什么区别?
如果我通过基准测试来做,我可以比较多个模型,并提取调整后的参数,这比重采样更有优势。相反,如果我使用重采样,我一次只能调整一个模型,而且我还注意到我的 CPU 飞涨。
我应该如何以及何时使用一个而不是另一个?
data(BostonHousing, package = "mlbench")
BostonHousing$chas <- as.integer(levels(BostonHousing$chas))[BostonHousing$chas]
library('mlr')
library('parallel')
library("parallelMap")
# ---- define learning tasks -------
regr.task = makeRegrTask(id = "bh", data = BostonHousing, target = "medv")
# ---- tune Hyperparameters --------
set.seed(1234)
# Define a search space for each learner'S parameter
ps_xgb = makeParamSet(
makeIntegerParam("nrounds",lower=5,upper=50),
makeIntegerParam("max_depth",lower=3,upper=15),
# makeNumericParam("lambda",lower=0.55,upper=0.60),
# makeNumericParam("gamma",lower=0,upper=5),
makeNumericParam("eta", lower = 0.01, upper = 1),
makeNumericParam("subsample", lower = 0, upper = 1),
makeNumericParam("min_child_weight",lower=1,upper=10),
makeNumericParam("colsample_bytree",lower = 0.1,upper = 1)
)
# Choose a resampling strategy
rdesc = makeResampleDesc("CV", iters = 5L)
# Choose a performance measure
meas = rmse
# Choose a tuning method
ctrl = makeTuneControlRandom(maxit = 30L)
# Make tuning wrappers
tuned.lm = makeLearner("regr.lm")
tuned.xgb = makeTuneWrapper(learner = "regr.xgboost", resampling = rdesc, measures = meas,
par.set = ps_xgb, control = ctrl, show.info = FALSE)
# -------- Benchmark experiements -----------
# Four learners to be compared
lrns = list(tuned.lm, tuned.xgb)
#setup Parallelization
parallelStart(mode = "socket", #multicore #socket
cpus = detectCores(),
# level = "mlr.tuneParams",
mc.set.seed = TRUE)
# Conduct the benchmark experiment
bmr = benchmark(learners = lrns,
tasks = regr.task,
resamplings = rdesc,
measures = rmse,
keep.extract = T,
models = F,
show.info = F)
parallelStop()
# ------ Extract HyperParameters -----
bmr_hp <- getBMRTuneResults(bmr)
bmr_hp$bh$regr.xgboost.tuned[[1]]
res <-
resample(
tuned.xgb,
regr.task,
resampling = rdesc,
extract = getTuneResult, #getFeatSelResult, getTuneResult
show.info = TRUE,
measures = meas
)
res$extract
If i were to do it via benchmark, i can compare multiple models, and extract the tuned parameters which is an advantage over resample.
您也可以使用 resample()
。
benchmark()
只是 resample()
的包装,可以更轻松地 运行 在多个 tasks/learners/resamplings.
基准测试和重采样是正交的概念——您可以单独使用它们,也可以一起使用。
重采样 确保学习的模型得到适当的评估。特别是,我们不想通过给学习模型提供我们用于训练它的相同数据来评估学习模型,因为这样模型可以只记住数据并且看起来像是完美的模型。相反,我们在不同的、保留的数据上评估它,看看它是否已经学会了一般概念,以及是否能够对看不见的数据做出良好的预测。重采样决定了这种拆分为训练和测试数据的方式,使用了多少次不同训练和测试拆分的迭代等。
基准测试 允许您比较不同学习者在不同任务上的表现。这是 运行 大规模比较实验的便捷方法,否则您必须通过组合所有学习者和所有任务、训练和评估模型并确保一切都以完全相同的方式进行手动执行。为了确定学习者的表现及其在给定任务上诱导的模型,使用了重采样策略,如上所述。
所以简而言之,你的问题的答案是当你想评估学习模型的性能时使用重采样,当你想比较不同学习者在不同任务上的性能时使用重采样进行基准测试。