学习笔记-XGBOOST
2020-03-24 本文已影响0人
Pluto_wl
XGBOOST是GBDT模型的升级版,同样也用到了adboosting的思想
一 预备知识
-
XGBOOST是前向加法模型,那么有公式:
设表示第n棵树的模型,那么就有
所以第k次生成的模型为
-
目标函数的定义
设有个样本,
棵树,
表示第
棵树,
表示第k棵树的复杂程度,XGBOOST的损失函数定义为如下:
可以将上述目标函数拆分为两部分:
- 第一部分是
,这是普通的损失函数,
可以是 均方差,也可以是其他的损失函数。
- 第二部分是
,表示训练第
棵的时候,前
棵树的复杂程度,需要将所有树的复杂度相加的原因是XGBOOST是前向加法模型,第
个模型的结果是前
棵树相加而得到的。
如何表示树的复杂度呢?其叶节点的个数、树的深度、和叶结点的值都可以表示复杂度。叶结点可以表示复杂度的原因是叶结点的值越小,需要的树越多,比如目标时是3,当每棵树叶结点的值是1的时候,需要三棵树;当一个树的值为2,一个树的结点为1时,那么就只需要两棵树。
- 训练第K棵树时
式子1.4为
根据前向加法模型展开式
因为是前
棵树的复杂度,所以此部分的复杂度是已知的,将式1.5改写为下列式子:
我们的目标是最小化损失函数:
二 使用泰勒级数近似目标函数
- 先来回忆下泰勒公式
- 将式1.7中的
当作式2.1的
,
当作式2.1的
,代入到式1.7中得:
- 我们发现上式中只要
是未知项,
、
与
都是已知项,令
,将
忽略,可将式2.2改为:
此处需要注意下,就是我们得参数
三 引入新的符号
为了方便之后的计算和表示,我们先引入一些符号
- 定义
表示样本
属于哪一个叶结点
- 定义
为样本
所属结点上的值
- 定义
表示第i个结点上共有多少个样本
下图中表示有样本,样本
和样本
决策分类值是15,样本
的值是12,样本
和样本
的值是20。将结点从左到右排列,记为序号1,2,3所以根据上述定义,我们可以得到
表示样本
的预测值,那么
,所以有下列等式
我们得知第一个结点上有两个样本,所以,第二个结点上有一个样本,
,结点3上有两个样本,所以

四 树的复杂度
上面说过了,树的复杂度可能由深度、叶结点的个数、叶结点的值决定。我们现在来看看XGBOOST中的复杂度是如何定义的:
表示有多少个叶节点,
表示第t个结点上的值
和
都是超参数,需要有人工设置
五
根据三和四,我们可以将式1.7改写为如下形式:
在第二部分的3小部分,我们可以知道和
是已知的,所以
和
都是常数,使用
表示
,使用
表示
,可以下式
上述式子可以看做以的二次函数,当
时,obj取得最值。将
代入式5.4得
得极值
优缺点
- 优点
- 正则化:XGBoost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的 L2 模的平方和。从 Bias-variancetradeoff 角度来讲,正则项降低了模型的 variance,使学习出来的模型更加简单,防止过拟合,这也是 XGBoost 优于传统 GBDT 的一个特性。
- 并行处理:我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost 在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个 block 结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
- 对于特征的值有缺失的样本,XGBoost 可以自动学习出它的分裂方向。
- 缺点
- 算法参数过多
- 只适合处理结构化数据
- 不适合处理超高维特征数据