超调XGBoost参数


27

在处理分类因变量和连续因变量方面,XGBoost一直表现出色。但是,如何为XGBoost问题选择优化的参数?

这是我为最近的Kaggle问题应用参数的方式:

param <- list(  objective           = "reg:linear", 
                booster = "gbtree",
                eta                 = 0.02, # 0.06, #0.01,
                max_depth           = 10, #changed from default of 8
                subsample           = 0.5, # 0.7
                colsample_bytree    = 0.7, # 0.7
                num_parallel_tree   = 5
                # alpha = 0.0001, 
                # lambda = 1
)


clf <- xgb.train(   params              = param, 
                    data                = dtrain, 
                    nrounds             = 3000, #300, #280, #125, #250, # changed from 300
                    verbose             = 0,
                    early.stop.round    = 100,
                    watchlist           = watchlist,
                    maximize            = FALSE,
                    feval=RMPSE
)

我要做的实验是(凭直觉)随机选择另一组参数以改善结果。

无论如何,我是否可以自动选择最佳(最佳)参数集?

(答案可以是任何语言。我只是在寻找技术)

Answers:


40

每当我使用xgboost时,我通常都会进行自己的自制参数搜索,但是您可以使用插入符号包以及刚才提到的KrisP来进行搜索。

  1. 插入符号

请参阅“交叉验证”中的此答案,以获取有关如何使用插入符号包在xgboost上进行超参数搜索的详细说明。 如何调整xgboost树的超参数?

  1. 自定义网格搜索

我经常从基于Owen Zhang 关于数据科学技巧的幻灯片的一些假设开始。P. 14

在此处输入图片说明

在这里,您将看到您几乎需要调整行采样,列采样,甚至最大树深度。这是我执行自定义行采样和列采样搜索当前正在处理的问题的方式:

searchGridSubCol <- expand.grid(subsample = c(0.5, 0.75, 1), 
                                colsample_bytree = c(0.6, 0.8, 1))
ntrees <- 100

#Build a xgb.DMatrix object
DMMatrixTrain <- xgb.DMatrix(data = yourMatrix, label = yourTarget)

rmseErrorsHyperparameters <- apply(searchGridSubCol, 1, function(parameterList){

    #Extract Parameters to test
    currentSubsampleRate <- parameterList[["subsample"]]
    currentColsampleRate <- parameterList[["colsample_bytree"]]

    xgboostModelCV <- xgb.cv(data =  DMMatrixTrain, nrounds = ntrees, nfold = 5, showsd = TRUE, 
                           metrics = "rmse", verbose = TRUE, "eval_metric" = "rmse",
                           "objective" = "reg:linear", "max.depth" = 15, "eta" = 2/ntrees,                               
                           "subsample" = currentSubsampleRate, "colsample_bytree" = currentColsampleRate)

    xvalidationScores <- as.data.frame(xgboostModelCV)
    #Save rmse of the last iteration
    rmse <- tail(xvalidationScores$test.rmse.mean, 1)

    return(c(rmse, currentSubsampleRate, currentColsampleRate))

})

并使用apply函数的结果与ggplot2魔术结合使用,您可以绘制搜索的图形表示。我的xgboost超参数搜索

在该图中,较浅的颜色表示较低的误差,每个块表示列采样和行采样的唯一组合。因此,如果您要执行额外的搜索说eta(或树深),您将得到针对每个测试的eta参数的这些图之一。

我看到您有一个不同的评估指标(RMPSE),只需将其插入交叉验证功能中,您将获得所需的结果。除此之外,我不必担心其他参数的微调,因为这样做不会提高性能,与花费更多时间设计功能或清理数据相比,至少不会提高太多。

  1. 其他

随机搜索和贝叶斯参数选择也是可能的,但是我还没有实现它们。

这是插入符号的作者Max Kuhn创建的有关贝叶斯超参数优化的一个很好的入门。

http://blog.revolutionanalytics.com/2016/06/bayesian-optimization-of-machine-learning-models.html


我对min_child_weight参数有疑问。表示3 /(罕见事件的百分比)假设我有3个类别,分别为0(3.4%),1(96.4%)和2(0.2%)。所以应该是3 / 3.6还是3 / 0.2?我猜是前者

在大多数情况下,xgboost会将低于5%的任何内容视为大多数问题中的罕见事件,我想这是该算法的怪癖之一。我喜欢将其视为点击率问题中点击下方的任何内容都是“罕见事件”。因此,在这种情况下为3 / 3.6。我有时会低一些,但不会那么频繁。
wacax

1
rBayesianOptimization软件包使BO的实现非常简单
MichaelChirico


0

网格,随机,贝叶斯和PSO等。

当您使用XGBoost时,上述所有操作都没有关系,因为XGB确实非常快,因此您可以将Grid与许多超参数一起使用,直到找到解决方案为止。

可能对您有所帮助的一件事:使用近似方法,它始终为我提供最低的mse错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.