与论文结合详解XGBoost参数
本文最后修改于2018-01-23,文章有问题或者转载请及时联系本人,如果对你有帮助,别忘了点下关注和喜欢,感谢!
0 前言
网络上XGBoost的参数翻译很多,但是都没做什么解释,本文一部分内容参考自 Complete Guide to Parameter Tuning in XGBoost (with codes in Python),一部分内容是根据自己对论文的理解添加的,对某些参数的解释也给出了论文中对应的部分。
期望读者:
具有对基础树模型的理解,尝试使用过XGBoost,如果对XGBoost的论文有了解就更好了。
1 XGBoost的优点
-
正则
- 标准的GBM实现是没有正则的。
- XGBoost也以regularized boosting技术闻名。加入正则的目标函数如下,其中T是叶子节点的个数,w是叶子结点的权重。所以正则项是由叶子结点的数量和叶子结点权重的平方和决定。
- 带正则的目标函数
-
并行处理
- XGBoost实现了并行化的处理。
- XGBoost基于boosting方法,原则上不可以并行。但是XGBoost做的是特征粒度上的并行,而不是树粒度上的并行。主要用来同时遍历得到理想的分裂点。
- XGBoost支持hadoop上实现。
-
高度的灵活性
- XGBoost允许用户自定义优化目标和评估准则。
- 如下所示,我们只需要知道一阶和二阶导数即可计算损失,在节点分裂的时候同样是这样的。
- 只需要知道一阶和二阶导
-
处理缺失值方面
- XGBoost自有一套处理缺失值的方法。论文中提到XGBoost对于缺失值当成稀疏的情况来处理。
-
树剪枝方面
- GBM是在节点遇到负损失的时候停止分裂,贪心策略。(预剪枝)
- XGBoost是在分裂抵达max_depth的时候才开始剪枝移除那些没有正收益的分裂。(后剪枝)
-
内置的交叉验证
- XGBoost在boosting过程中的每一次迭代都运行CV,使得在一次运行中就可以确定最优的boosting迭代次数。
- GBM需要我们使用网格搜索来找最优次数。
-
可以在存在的模型上继续训练
- 在某些特定的场景下非常有用。
- GBM的sklearn实现也有这个特点。
2 XGBoost的参数
-
General Parameters
- booster [default=gbtree]
- gbtree:基于树的模型
- gblinear:线型模型
- silent [default=0]
- 0会输出运行信息,1不会输出运行信息,建议保持0有助于理解模型
- nthread [如果不设置默认与最大的可以线程数相同]
- 用来控制并行过程,如果想要在所有的核上都运行就让系统自己设置就好。注意,mac系统的并行有所不同,可以参见这里
- num_pbuffer:prediction buffe,系统自动设置
- num_feature:boosting过程中的特征维数,系统自动设置
- booster [default=gbtree]
-
Booster Paramters 包含两类Booster
- eta [default = 0.3]
- 类似于GBM中的学习率
- 取值范围:[0,1],通常设置为0.01~0.2
- gamma [default=0 别名:min_split_loss]
- 一个叶子节点继续分裂所需要的最小下降损失。节点分裂的计算公式如下(分裂前损失-分裂后损失),式子最后的gamma就是这里的gamma。如果gamma很大,计算出的结果是负的,证明分裂没有收益,就不再分裂。所以值越大,模型越保守/越不容易过拟合。
- gamma的影响
- 取值范围:[0, ∞]
- max_depth [default = 6]
- 树的最大深度。值越大模型越复杂/越可能过拟合。设为0表示不限制。
- 取值范围:[0, ∞]
- min_child_weight [default=1]
- 孩子节点需要的最小样本权重和。如果分裂导致一个叶子节点的样本权重和小于预设值,就不会继续分裂了。当树的结构确定后,我们可以通过下式计算叶结点权重:
- 叶子节点的权重计算
- 在线型模型中,简化为每个节点所需要的最小样本数量
- 值越大,模型越保守。
- min_delta_step [default=0]
- Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint.
- 用的比较少,但是在逻辑回归中,如果类别极度不平衡,调整这个值会有帮助。
- subsample [default = 1]
- 行采样,不用多说。取值范围:(0, 1]
- colsample_bytree [default = 1]
- 列采样,在建立每一棵树的时候对特征的采样比例。取值范围:(0, 1]
- colsample_bylevel [default = 1]
- 在每一次分裂时候列采样的比例(?),用的很少。取值范围:(0, 1]
- alpha [default = 0]
- 权重上的L1正则
- lambda [default = 1]
- 权重上的L2正则
- tree method [default = 'auto'] 这个不是树构建的方法,而是节点分裂的方法。这个方法从古到今做了很多的改进,之后会有一篇专门的博客介绍这个问题,这里先附上参数的英文介绍,我们一般使用
auto
即可。。其中
- 'auto': Use heuristic to choose faster one.
- For small to medium dataset, exact greedy will be used.
- For very large-dataset, approximate algorithm will be chosen.
- Because old behavior is always use exact greedy in single machine, user will get a message when approximate algorithm is chosen to notify this choice.
- 'exact': Exact greedy algorithm.
- 'approx': Approximate greedy algorithm using sketching and histogram.
- 'hist': Fast histogram optimized approximate greedy algorithm. It uses some performance improvements such as bins caching.
- 'gpu_exact': GPU implementation of exact algorithm.
- 'gpu_hist': GPU implementation of hist algorithm.
- scale_pos_weight [defualt = 1]
- 正负样本比例。用来控制正负样本的权重,在类别不平衡的时候用处很大。
- 常用的计算方法:sum(negative cases) / sum(positive cases)
- 【Linear Booster】中有lambda,alpha,lambda_bias(在偏置上的L2正则,为什么偏置上没有L1正则,因为不重要)。
- eta [default = 0.3]
-
Learning Task Parameters
- objective [default=reg:linear] 定义学习目标函数。
- 常用的:"reg:linear","reg:logistic","binary:logistic"
- 可以自定义目标函数,需要传入一阶,二阶导数
- base_score 几乎不用
- eval_metric [默认值根据objective]
- 可以传多个评估指标。python特别注意要传list而不是map。
- objective [default=reg:linear] 定义学习目标函数。
参考:
1.Complete Guide to Parameter Tuning in XGBoost (with codes in Python