译文:Complete Guide to Parameter Tuning in XGBoost
简介
当模型没有达到预期效果的时候,XGBoost就是数据科学家的最终武器。XGboost是一个高度复杂的算法,有足够的能力去学习数据的各种各样的不规则特征。
用XGBoost建模很简单,但是提升XGBoost的模型效果却需要很多的努力。因为这个算法使用了多维的参数。为了提升模型效果,调参就不可避免,但是想要知道参数怎么调,什么样的参数能够得出较优的模型输出就很困难了。
这篇文章适用于XGBoost新手,教会新手学习使用XGBoost的一些有用信息来帮忙调整参数。
XGBoost 的优势
- Regularization:
- 标准的GBM并没有XGBoost的Regularization,这个能帮助减少过拟合问题
- Parallel Processing:
- XGBoost实现了并行计算,与GBM相比非常快
- 但是基于序列的模型,新模型的建立是基于前面已经建立好的模型,如何能实现并行计算呢?探索一下吧
- XGBoost 支持在Hadoop上实现
- High Flexibility
- XGBoost允许用户定制优化目标和评价标准
- 这一点将会使得我们对模型有很多可以改进的地方
- Handling Missing Values
- XGBoost有内嵌的处理缺失值的程序
- 其他模型中用户被要求为缺失值提供相应的与其他值不同的值去填充缺失值,XGBoost会尝试对缺失值进行分类,并学习这种分类
- Tree Pruning:
- GBM会停止对一个节点进行分裂,当其计算到这个节点的split的loss是负数时,GBM是一个贪婪算法
- XGBoost的分类取决于max_depth,当树的深度达到max_depth时,开始进行剪枝,移除没有正基尼(no positive gain)节点的split
- 另一个优点是一个节点被分裂的时候loss为-2,当其二次分裂的时候loss可能为+10,GBM会停止该节点的分裂,XGBoost会进入到第二步,然后结合两个分裂的影响,最终为+8
- Built-in Cross-Validation
- XGBoost允许每一个交叉验证实现boosting过程,因而通过一次run就能获得boosting迭代的优化量
- 与GBM需要运营grid-search且需要限时值的范围获得优化量不同
- Continue on Existing Model
- 用户可以通过上个版本的XGBoost模型训练新版本的模型
- GBM的sklearn也有这个特性
XGBoost Parameters
XGBoost的变量类型有三类:
- General Parameters:调控整个方程
- Booster Parameters:调控每步树的相关变量
- Learning Task Parameters:调控优化表现的变量
1.General Parameters:
-
booster [default=gbtree]:
- gbtree: tree-based models,树模型
- gblinear: linear models,线性模型
-
silent [default=0]:
- 设置成1表示打印运行过程中的相关信息
- 通常选择默认值就好,打印出的信息能够帮助理解model
- nthread [default to maximum number of threads available if not set]
- 主要用于并行计算,系统的内核数需要作为变量
- 如果希望运行所有的内核,就不需要设置该参数,程序会自己检测到该值
2.Booster Parameters
虽然XGBoost有两种boosters,作者在参数这一块只讨论了tree booster,原因是tree booster的表现总是好于 linear booster
- eta [default=0.3]
- 与GBM中学习率的概念相似
- 通过减小每一步的权重能够使得建立的模型更鲁棒
- 通常最终的数值范围在[0.01-0.2]之间
- min_child_weight [default=1]
- 定义观测样本生成的孩子节点的权重最小和
- 这个概念与GBM中的min_child_leaf概念类似,但是又不完全一样,这个概念指的是某观测叶子节点中所有样本权重之和的最小值,而GBM指的是叶子节点的最少样本量
- 用于防止过拟合问题:较大的值能防止过拟合,过大的值会导致欠拟合问题
- 需要通过CV调参
- max_depth [default=6]
- 树的最大深度
- 用于防止过拟合问题
- 通过CV调参
- 通常值的范围:[3-10]
- max_leaf_nodes
- 一棵树最多的叶子节点的数目
- 与max_depth定义一个就好
- gamma [default=0]
- 一个节点分裂的条件是其分裂能够起到降低loss function的作用,gamma 定义loss function降低多少才分裂
- 这个变量使得算法变得保守,它的值取决于 loss function需要被调节
- max_delta_step [default=0]
- 此变量的设置使得我们定义每棵树的权重估计值的变化幅度。如果值为0,值的变化没有限制,如果值>0,权重的变化将会变得相对保守
- 通常这个参数不会被使用,但如果是极度不平衡的逻辑回归将会有所帮助
- subsample [default=1]:
- 与GBM的subsample定义一样,指的是没有每棵树的样本比例
- 低值使得模型更保守且能防止过拟合,但太低的值会导致欠拟合
- 通常取值范围[0.5-1]
- colsample_bytree [default=1]
- 与GBM中的max_features类似,指的是每棵树随机选取的特征的比例
- 通常取值范围[0.5-1]
- colsample_bylevel [default=1]
- 指的是树的每个层级分裂时子样本的特征所占的比例
- 作者表示不用这个参数,因为subsample和colsample_bytree组合做的事与之类似
- lambda [default=1]
- l2正则化权重的术语(同 Ridge regression)
- 用于处理XGBoost里的正则化部分,虽然很多数据科学家不怎么使用这个参数,但是它可以用于帮助防止过拟合
- alpha [default=0]
- l1正则化的权重术语(同Lasso regression)
- 当特征量特别多的时候可以使用,这样能加快算法的运行效率
- scale_pos_weight [default=1]
- 当样本不平衡时,需要设置一个大于0的数帮助算法尽快收敛
3.Learning Task Parameters
此类变量用于定义优化目标每一次计算的需要用到的变量
- objective [default=reg:linear]
- 用于定义loss function,通常有以下几类
- binary:logistic-用于二分类,返回分类的概率而不是类别(class)
- multi:softmax-多分类问题,返回分类的类别而不是概率
- multi:softprob-与softmax类似,但是返回样本属于每一类的概率
- eval_metric [ default according to objective ]
- 这个变量用于 测试数据(validation data.)
- 默认值:回归-rmse;分类-error
- 通常值如下:
- rmse – root mean square error
- mae – mean absolute error
- logloss – negative log-likelihood
- error – Binary classification error rate (0.5 threshold)
- merror – Multiclass classification error rate
- mlogloss – Multiclass logloss
- auc: Area under the curve
- seed [default=0]
- 随机种子的值
有些变量在Python的sklearn的接口中对应命名如下:
1. eta -> learning rate
2. lambda ->reg_lambda
3. alpha -> reg_alpha
可能感到困惑的是这里并没有像GBM中一样提及n_estimators,这个参数实际存在于XGBClassifier中,但实际是通过num_boosting_rounds在我们调用fit函数事来体现的。
参考