1、XGBoost
XGBoost(eXtreme Gradient Boosting),极端梯度提升。它用二阶泰勒展开式去近似损失函数,然后通过让损失函数最小化,来求出最优的树结构以及叶子节点的值。
核心算法思想:不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数。最后只需要将每棵树对应的分数加起来就是该样本的预测值。
回归树
4.1 XGBoost目标函数的构建
假设已经训练了K棵树,则对于第i个样本的(最终)预测值为:
最终的结果相当于所有K棵树预测之和。
目标函数:
目标函数由损失函数和控制模型的复杂度项两个部分构成。
(1)损失函数
回归问题,使用最小二乘作为损失函数;
分类问题,使用交叉熵作为损失函数。
(2)模型的复杂度
控制模型的复杂度项,也叫作正则,正则的作用就是控制模型的复杂度,从而把容易过拟合的模型不给予考虑。
Q:我们该如何给XGBoost模型定义复杂度?一棵决策树的复杂度如何定义?一棵复杂的决策树模型有什么特点?
A:对于一棵决策树来讲, 树的深度、叶节点个数、叶节点对应的预测值等这些特征跟它的复杂度相关;一棵树越完整意味着这棵树越容易过拟合。
一个树的深度越深,越容易过拟合;一个数的叶节点越多,越容易过拟合;对回归任务来说,叶节点对应的预测值越大说明模型越复杂。
4.2泰勒展开式与目标函数的近似
使用泰勒展开式近似目标函数:
新的目标函数表明我们需要参数化 和每一颗树的复杂度
,才能找出让这些参数最小化的那棵树。
4.3树的参数化
(1)参数化 。
如何用参数表示一棵树?
叶子结点的值用ω表示,我们假设 15 这个叶节点用 ω1 表示,12 这个叶子结点用 ω2 表示,20 这个叶子结点用 ω3 表示。 W=(ω1,ω2,ω3)=(15,12,20) 这里的W就是一个参数。
:表示第k棵树对样本Xi的预测结果,更具体的,就是把第Xi个样本规划到第几个叶子结点上了。
这里定义一个函数 q(x): 样本x的位置。这里假设第一个叶节点上(即 15 的地方)有样本[1, 3]落在这里 ,第二个节点有样本[4]落在这个地方,样本[2,5]落在了第三个叶子结点处这里 :
用函数 q 表示了样本落在了那个位置后,就能用参数表示 了。 样本 Xi 落在了第
个叶节点上。那么
的预测值就可以用
表示,这样就把
进行了参数化。
是一个参数,下角标
表示落在哪个叶子结点上。但是这里下标还是一个函数,需要定义一下:
即表示哪些样本 Xi 落在第 j 个叶子结点上。举个例子:I1={1,3} 表示样本 1,3 落在了第一个节点上。这样进行表示的目的是根据叶节点的位置把样本进行重新的组织。
(2)参数化。
定义树的复杂度。
4.4利用贪心算法构建每一棵树
如何寻找树的形状?
贪心算法构建树:每次尝试分裂一个叶节点,计算分裂前后增益,选择增益最大的。通过贪心的方式不断构造这棵树,不断扩充这棵树。
比如下面的例子:
4.6 XGBoost的优势
优点:
(1)正则化防止过拟合
(2)XGBoost不仅使用到了一阶导数,还使用二阶导数,损失更精确,还可以自定义损失。
(3)XGBoost的并行优化,XGBoost的并行是在特征粒度上的。
(4)考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。
(5)支持列抽样,不仅能降低过拟合,还能减少计算。
XGBoost如何处理缺失值?
在训练阶段寻找分裂点的时候,计算的分裂增益不包含缺失值样本。在逻辑实现上,为了保证完备性,会分别将缺失该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向归类含缺失值样本。
在预测阶段,如果训练集没有缺失值而测试集出现缺失值,则要为缺失值(或者指定的值未出现的值)指定分支的默认方向,预测时自动将缺失值的划分到这一分支。
XGBoost与GBDT的区别?
基分类器:GBDT是以分类与回归决策树CART作为基分类器,XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)。
导数信息:GBDT在优化求解时,只是用到一阶导数信息,XGBoost对代价函数做了二阶泰勒展开,同时用到一阶和二阶导数信息。
正则项:XGBoost在代价函数里加入正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的预测值的L2模的平方和。正则项有利于降低模型的方差variance,使学习出来的模型更加简单,防止过拟合。GBDT的代价函数中是没有正则项。
缺失值处理:对于特征的取值有缺失的样本,XGBoost可以自动学习出它的分裂方向。