xgboost怎么调参?

  统计/机器学习 监督式学习    浏览次数:21264        分享
18

xgboost怎么调参?怎么对参数进行优化?

谢谢!


 

ZackLi   2017-08-29 10:59



   9个回答 
34

我以python里XGBClassifier为例


首先,要确定哪些参数要调,以下是比较重要和常用的参数。


max_depth: 每棵树的最大深度。太小会欠拟合,太大过拟合。正常值是3到10。

learning_rate: 学习率,也就是梯度下降法中的步长。太小的话,训练速度太慢,而且容易陷入局部最优点。通常是0.0001到0.1之间。

n_estimators: 树的个数。并非越多越好,通常是50到1000之间。

colsample_bytree: 训练每个树时用的特征的数量。1表示使用全部特征,0.5表示使用一半的特征。

subsample: 训练每个树时用的样本的数量。与上述类似,1表示使用全部样本,0.5表示使用一半的样本。

reg_alpha: L1正则化的权重。用来防止过拟合。一般是0到1之间。

reg_lambda: L2正则化的权重。用来防止过拟合。一般是0到1之间。

min_child_weight: 每个子节点所需要的样本的数量(加权的数量)。若把它设置为大于1的数值,可以起到剪枝的效果,防止过拟合。

以上只是作为参考,通常我们只对其中的少数几个进行调参,模型就可以达到很好的效果。


下一步就是对这些参数进行优化,最常用的是Grid Search

比如说我们要优化max_depth和learning_rate。max_depth的候选取值为[3, 4, 5, 6, 7],learning_rate候选取值为[0.0001, 0.001, 0.01, 0.1]。那么我们就需要尝试这两个参数所有的可能的组合(共5*4=20个不同的组合)。通过交叉验证,我们可以得到每个组合的预测评价结果,最后从这20个组合中选择最优的组合。


Grid Search的想法简单易行,但是缺陷就是当我们需要对很多参量进行优化时,我们需要遍历太多的组合,非常耗时。比如说我们有5个参量需要优化,每个参量又有5个候选值,那么就一共有5*5*5*5*5=3125种不同的组合需要尝试,非常耗时。


另外一个常用的方法Random Search就可以解决这个问题。Random Search是从所有的组合中随机选出k种组合,进行交叉验证,比较它们的表现,从中选出最佳的。虽然Random Search的结果不如Grid Search,但是Random Search通常以很小的代价获得了与Grid Search相媲美的优化结果。所以实际调参中,特别是高维调参中,Random Search更为实用。


SofaSofa数据科学社区DS面试题库 DS面经

KingBug   2017-08-30 12:27

Random Search会比Grid Search差很多吗? - CatalanFubini   2017-09-06 13:35
相差不多的。假如你有10000个点来做GridSearch,从其中任选100个,那么你有0.995的概率,这100个点中的最优点,是在那10000个点里面排前5%的。 - KingBug   2017-09-07 02:13
RandomSearch看起来不错,下次可以试试! - 岛歌   2017-09-08 10:31
5

除了别人上面已经提到的GridSearch和RandomSearch,我再说个稍微邪门一点的方法。

用RandomForest,对,就是它!

第一步:

和GridSearch或者RandomSearch一样,用很多点,得到模型结果。

那些点就是特征,模型结果就是label。

第二步:

随机产生很多点,但这些点你并不知道模型结果。这就是关键了,你可以用第一步得到的结果作为训练集,然后来预测这些随机点的预测结果。

第三步:

挑个最好的点。


--------------蜜汁分界线----------

更新:

这个方法有点诡异,如果你未曾听过,就当看个新鲜。若是你觉得无靠谱,就当一笑话。


SofaSofa数据科学社区DS面试题库 DS面经

蓝色北方   2017-09-12 11:12

的确诡异。但是不明觉厉! - abuu   2017-09-13 08:37
5

下面的表格可以作为参考

截自这里的第14页


SofaSofa数据科学社区DS面试题库 DS面经

batmanX   2017-10-31 01:03

4

xgb调参的黄金搭档

learning_rate = 0.05
max_depth = 6
n_estimators = 500

其他保留默认值就行


SofaSofa数据科学社区DS面试题库 DS面经

CatalanFubini   2017-11-17 13:53

太武断了吧, 这三个参数很重要是没错,但是。。。 - wqtang   2019-03-04 15:34
3

我一般初始设置是这样

learning_rate: 0.01

n_estimators: 200

max_depth: 3

subsample: 0.8

colsample_bytree: 1

gamma: 1

我觉得比较重要的是learning_rate和max_depth。

learning_rate一般在0.01到0.2之间,max_depth一般是3起步,一个一个往上加

SofaSofa数据科学社区DS面试题库 DS面经

何立诚   2019-02-25 09:13

3

当然还有贝叶斯优化调参法。其实本质上和随机森林调参法是类似的。都是属于自动调参法。

贝叶斯优化调参法可以参考这个讲稿


SofaSofa数据科学社区DS面试题库 DS面经

染盘   2017-11-01 12:34

2

XGBoost参数调优完全指南(附Python代码)


SofaSofa数据科学社区DS面试题库 DS面经

zhanglu   2018-03-28 13:08

-4

Scikit 中的模型特征选择,XGBoost 数据比赛实战之调参篇

SofaSofa数据科学社区DS面试题库 DS面经

大黄大黄大黄   2018-03-28 13:12

-6

用cross validation

SofaSofa数据科学社区DS面试题库 DS面经

张球球   2017-08-29 23:21

谢谢,但是太笼统了,能不能具体一点? - ZackLi   2017-08-30 00:40


  相关讨论

为什么lightgbm比xgb快?

xgboost是怎么做到regularization的?

xgboost中的决策树的复杂度是怎么定义的?

GBDT和XGBoost在叶子节点权重计算上有什么不同?

xgboost里的每棵树是不是等权重的?

stack多个xgboost效果并不理想

GBDT和XGBoost使用的都是回归树,原理上是怎么支持解决分类问题的?

到底什么时候用lightgbm什么时候用xgb

xgboost为什么会有seed?随机性体现在哪里?

xgboost展开到二阶导数有什么好处啊

  随便看看

sklearn r2_score返回负数

自助法(bootstrap)的0.632是怎么来的?

'str' object has no attribute 'decode' 代码运行时有错误呢?请高手帮忙解决

sklearn SGDClassifier的partial_fit是什么意思?

医学统计里的c-index或者c-statistic是什么意思?