1. XGBOOST?
XGBoost(eXtreme Gradient Boosting)算法是Gradient Boosting算法的高效实现版本,并进行算法的改进和工程上的优化。
XGBoost类似于GBDT,是一个基于CART树的,由多个弱分类器经过boost框架,以负梯度为学习策略的一种集成学习方法。
2.XGBoost的数学原理
2.1 目标函数:
O b j = ∑ i = 1 n l ( y i , y i ^ ) + ∑ k = 1 K Ω ( f k ) Obj = \sum_{i=1}^{n}l(y_i,\hat{y_i})+\sum_{k=1}^K\Omega (f_k) Obj=∑i=1nl(yi,yi^)+∑k=1KΩ(fk)
O m e g a ( f ) = γ τ + 1 2 ∥ w ∥ 2 Omega (f)=\gamma\tau +\frac{1}{2}\left \| w \right \|^2 Omega(f)=γτ+21∥w∥2
目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项,控制树的复杂程度。正则化项同样包括两部分,T表示叶子节点的个数,w表示叶子节点的分数。"y"可以控制叶子节点的个数,"人"可以控制叶子节点的分数不会过大,防止过拟合。
2.2 树的结构
残差树
2.3 分支策略
与CART相同的策略,贪心算法,不断地枚举不同树的结构,然后利用打分函数来寻找出一个最优结构的树,接着加入到模型中,不断重复这样的操作。
树生成的停止条件:
- 当引入的分裂带来的增益小于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数);
- 当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,避免树太深导致学习局部样本,从而过拟合;
- 样本权重和小于设定阈值时则停止建树。什么意思呢,即涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样。大意就是一个叶子节点样本太少了,也终止同样是防止过拟合;
2.4 防止过拟合
Shrinkage方法:
在每次迭代中对树的每个叶子节点的分数乘上一个缩减权重"n",这可以使得每一颗树的影响力都不会太大,留下更大的空间给后面生成的树去优化模型。
Column Sampling方法:
类似于随机森林中的选取部分特征进行建树。
2.5 缺失值处理
首先根据non-missing的原则找出split point,然后有以下3种方式
1.计算missing值在左右子树的信息增益,选择大的方向
2.可以手动指定missing的默认方向,加快算法速度
3.训练集中没有缺失值而预测集中有,自动划分到右子树
3. XGBoost VS. GBDT
- GBDT是机器学习算法,XGBoost是该算法的工程实现。
- 传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
- XGBoost显式地加入了正则项来控制模 型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
- 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机 森林相似的策略,支持对数据进行采样。
- 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺 失值的处理策略。
- xgboost工具支持并行。XGBoost的并行不是tree粒度的并行,xgboost的并行是在特征粒度上的。XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
- 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。