1. 算法原理
XGBoost的基学习器除了可以是CART回归树,还可以是线性模型。下面以CART回归树 为例讨论。
模型的损失函数(一般形式):
。XGBoost在损失函数的基础上添加了正则项,则目标函数为:
- 目标函数的优化过程通过泰勒展开近似,以第
泰勒公式二阶展开:
把看成,看成:
其中,
,
由于在第
步
是常数,所以(1)可以写成
2. 将决策树的参数代入目标函数
:每个样本在哪个叶节点上(树的结构)
:每个样本的预测值
。
决策树的复杂度:
第
个叶节点的样本集合:
则(2)可以写成:
3. 目标函数最优值
如果树的结构是固定的,即已经知道了每个叶节点有哪些样本,那么
,
是常数,但是
(叶节点的预测值)不确定。
令目标函数一阶导为0,得到:
此时,目标函数的值为:
4.
求单棵树的最优结构(贪心策略)
(1)从深度为0的树开始,对每个叶节点枚举所有的可用特征
(2)针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(采用最佳分裂点时的收益,收益指的分裂前后目标函数的差值)
(3)选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集
(4)回到第1步,递归执行到满足特定条件为止
2. XGBoost过拟合的解决办法
- 目标函数中的正则项
- 权值收缩,类似于控制学习速率(shrinkage为每棵树设置了一个weight,这样更容易避免过拟合)
- 列子采样
3. 决策树节点划分算法(Approximate Algorithm)
最基本的算法是精确贪心算法(Exact Greedy Algorithm):首先根据特征值对样本进行排序,然后枚举连续特征的所有可能分割。,以选择最佳分裂点。
Approximate Algorithm:对连续型特征进行离散化。
算法根据特征分布的分位数找到候选的特征分裂点集合,然后将特征分到不同的桶中,对每个桶内的样本统计值
、
进行累加统计,最后寻找最佳分裂点。
XGBoost中采用的基于分位数来获得分裂点,要获得分位数,需要对数据进行排序,但是当数据量特别大的情况下,排序非常消耗内存和时间。此时可以使用ε-approximate 分位数算法,对于权重一致的情况,可以使用quantile sketch算法来进行排序。但是在XGBoost中,每个点的权重是不一致的,权重系数是二阶导数
。因此,论文中提出了基于权重的quantile sketch算法,也就是weighted quantile sketch。
4. 稀疏数据(缺失值)的处理
XGBoost会把缺失值分到默认的方向,先把缺失的放到右边,也就是假设缺失的是大于划分点的值,然后在放到左边,然后找出这两种情况哪种最优。
5. XGBoost优缺点
优点:
- 在实现上,可并行化(提出了稀疏感知算法,sparsity-aware)计算,加快训练速度
- 引入了损失函数的二阶导,增加了精度,并且方便自定义损失函数
- 不仅支持CART作为基学习器,还支持线性模型。使用线性模型的xgboost相当于带l1和l2正则的逻辑回归(分类问题)或者线性回归(回归问题)。
- 在目标函数中加入了正则项,控制了模型的复杂度,有助于防止过拟合。
- 在进行完一次迭代后,会将叶子节点的权重乘上一个缩减系数(shrinkage),以增加模型的泛化性能。
- 支持列采样,可以降低过拟合,同时减少计算
- 可以处理缺失值
缺点:
- 时间开销较大(训练之前对数据进行排序并分桶)