【问题标题】:R: Using MLR (or caret or....) to tune parameters for XGBoostR:使用 MLR(或插入符号或....)来调整 XGBoost 的参数
【发布时间】:2018-07-16 05:15:04
【问题描述】:

在浏览了几个教程之后,我成功地制作了一个脚本,该脚本成功地使用 XGBoost 来预测波士顿住房数据集的分类价格。

但是,我无法使用 CV 成功调整模型的参数。即使在尝试了教程中的几种解决方案并在 stackowerflow 上发帖后也是如此。

到目前为止,我最好的结果是非常“hacky”,并且只调整了一个参数:

steps <- seq(75,90,5)/100
    for(i in steps){
    .....
    }

但我看到了所有这些花哨的设置,它们使用 MLR 或 Caret 或 NMOF 自动运行多个参数。但是,我还没有接近让任何人处理这些数据。我怀疑这是因为大多数都是为二进制分类设置的,但即使最好地解决这个问题,我也没有成功。我可以为您提供数百行不起作用的代码,但我认为最简单的方法是提供我的代码,只要它可以工作here,然后听听您将如何从这里取得进展,而不是被我的穷人淹没代码。

编辑:因为我什至运行其他人的脚本都没有成功。以下是一些额外的细节:

 > packageVersion("mlr")
 ‘2.11’

 > packageVersion("xgboost")
 ‘0.6.4.1’

【问题讨论】:

  • 您可以在此处找到有关如何调整 xgboost 参数的简短答案。 stackoverflow.com/questions/34469038/…
  • 感谢您的回答。如果我没看错的话,它是一个 python 而不是 R 包。不过,我会看看我能不能解决它。
  • 可能是,本教程。大约一年前,我使用 MLR 包编写了它:hackerearth.com/practice/machine-learning/…
  • 也许您使用 mlrMBO 可以获得更好的结果(请参阅 github.com/mlr-org/mlrMBO)? @ManishSaraswat 已经发布了一个很好的关于如何使用 mlr 进行调整的教程。另一个简短的代码示例可以在这里找到kaggle.com/casalicchio/tuning-with-mlr
  • 感谢您的回复,Manish。我一直在使用那个确切的教程,它非常有帮助,但我遇到了一个我无法克服的错误。也许,你知道什么是错的?我在第 95 行遇到第一个错误,运行 traintask code

标签: r r-caret xgboost mlr


【解决方案1】:

首先更新mlr和其他需要的包。然后考虑mlrcheatsheet 中的快速入门示例:

library(mlr)
#> Loading required package: ParamHelpers
library(mlbench)
data(Soybean)

set.seed(180715)

soy = createDummyFeatures(Soybean, target = "Class")
tsk = makeClassifTask(data = soy, target = "Class")
ho = makeResampleInstance("Holdout", tsk)
tsk.train = subsetTask(tsk, ho$train.inds[[1]])
tsk.test = subsetTask(tsk, ho$test.inds[[1]])

lrn = makeLearner("classif.xgboost", nrounds=10)
#> Warning in makeParam(id = id, type = "numeric", learner.param = TRUE, lower = lower, : NA used as a default value for learner parameter missing.
#> ParamHelpers uses NA as a special value for dependent parameters.

cv = makeResampleDesc("CV", iters=5)
res = resample(lrn, tsk.train, cv, acc)
#> Resampling: cross-validation
#> Measures:             acc
#> [Resample] iter 1:    0.9010989
#> [Resample] iter 2:    0.9230769
#> [Resample] iter 3:    0.9120879
#> [Resample] iter 4:    0.9230769
#> [Resample] iter 5:    0.9450549
#> 
#> Aggregated Result: acc.test.mean=0.9208791
#> 

# Tune hyperparameters
ps = makeParamSet(makeNumericParam("eta", 0, 1),
                  makeNumericParam("lambda", 0, 200),
                  makeIntegerParam("max_depth", 1, 20)
)
tc = makeTuneControlMBO(budget = 100)
tr = tuneParams(lrn, tsk.train, cv5, acc, ps, tc)
#> [Tune] Started tuning learner classif.xgboost for parameter set:
#>              Type len Def   Constr Req Tunable Trafo
#> eta       numeric   -   -   0 to 1   -    TRUE     -
#> lambda    numeric   -   - 0 to 200   -    TRUE     -
#> max_depth integer   -   -  1 to 20   -    TRUE     -
#> With control class: TuneControlMBO
#> Imputation value: -0
#> [Tune-x] 1: eta=0.529; lambda=194; max_depth=18
#> [Tune-y] 1: acc.test.mean=0.7846154; time: 0.0 min

# /... output truncated .../

#> [Tune-x] 100: eta=0.326; lambda=0.0144; max_depth=19
#> [Tune-y] 100: acc.test.mean=0.9340659; time: 0.0 min
#> [Tune] Result: eta=0.325; lambda=0.00346; max_depth=20 : acc.test.mean=0.9450549

lrn = setHyperPars(lrn, par.vals = tr$x)

# Evaluate performance
mdl = train(lrn, tsk.train)
prd = predict(mdl, tsk.test)

# Final model
mdl = train(lrn, tsk)

备忘单中的更多解释(使用 .pptx 版本,如果您不仅想复制代码,还想复制描述)。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2019-04-25
    • 2016-03-01
    • 2018-09-13
    • 1970-01-01
    • 2020-04-15
    • 2018-12-07
    • 2019-11-05
    • 2021-06-15
    相关资源
    最近更新 更多