超调 XGBoost 参数

数据挖掘 r Python xgboost
2021-09-16 21:47:07

在处理分类和连续因变量方面,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
)

我所做的只是随机选择(凭直觉)另一组参数来改进结果。

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

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

3个回答

每当我使用 xgboost 时,我经常进行自己的自制参数搜索,但您可以使用 caret 包以及刚刚提到的 KrisP 来完成。

  1. 插入符号

有关如何使用 caret 包在 xgboost 上进行超参数搜索的详细说明,请参阅 Cross Validated 上的答案。 如何调整 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))

})

并结合使用该应用功能的结果的一些 ggplot2 魔术,您可以绘制搜索的图形表示。我的 xgboost 超参数搜索

在此图中,较浅的颜色代表较低的误差,每个块代表列采样和行采样的独特组合。因此,如果您想对 eta(或树深度)进行额外的搜索,您最终会得到每个测试的 eta 参数的这些图之一。

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

  1. 其他

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

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

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

您可以使用 caret 包进行超参数空间搜索,或者通过网格搜索,或者通过随机搜索

网格、随机、贝叶斯和 PSO ...等。

当您使用 XGBoost 时,以上所有内容都无关紧要,因为 XGB 非常快,因此您可以使用带有许多超参数的 Grid,直到找到解决方案。

一件事可能对您有所帮助:使用近似方法,它总是给我最低的 mse 错误。