xgboost怎么调参?

  统计/机器学习 监督式学习
15

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

谢谢!


 

ZackLi   2017-08-29 10:59



   6个回答 
20

我以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更为实用。


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
4

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

用RandomForest,对,就是它!

第一步:

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

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

第二步:

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

第三步:

挑个最好的点。


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

更新:

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


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

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

下面的表格可以作为参考

截自这里的第14页


batmanX   2017-10-31 01:03

3

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

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


染盘   2017-11-01 12:34

2

xgb调参的黄金搭档

learning_rate = 0.05
max_depth = 6
n_estimators = 500

其他保留默认值就行


CatalanFubini   2017-11-17 13:53

-2

用cross validation

张球球   2017-08-29 23:21

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


相关问题

stack多个xgboost效果并不理想   2回答

xgboost是怎么做到regularization的?   1回答

xgboost中的参数min_child_weight是什么意思?   1回答

为啥Xgboost比GradientBoost好那么多?   4回答

xgboost可以做回归预测吗?   2回答

XGBClassifier设置random_state报错   1回答

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

既然xgboost那么好,线性回归还有存在的价值吗?   3回答

xgboost可以用sklearn里的GridSearchCV吗?   2回答

对于xgboost,还有必要做很多特征工程吗?   4回答

xgboost的gblinear是什么意思?   2回答

线性可分是什么意思?   1回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!