xgboost怎么调参?怎么对参数进行优化?
谢谢!
9个回答
我以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更为实用。
除了别人上面已经提到的GridSearch和RandomSearch,我再说个稍微邪门一点的方法。
用RandomForest,对,就是它!
第一步:
和GridSearch或者RandomSearch一样,用很多点,得到模型结果。
那些点就是特征,模型结果就是label。
第二步:
随机产生很多点,但这些点你并不知道模型结果。这就是关键了,你可以用第一步得到的结果作为训练集,然后来预测这些随机点的预测结果。
第三步:
挑个最好的点。
--------------蜜汁分界线----------
更新:
这个方法有点诡异,如果你未曾听过,就当看个新鲜。若是你觉得无靠谱,就当一笑话。
xgb调参的黄金搭档
learning_rate = 0.05
max_depth = 6
n_estimators = 500
其他保留默认值就行
我一般初始设置是这样
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面经