XGBoost,全称: Extreme Gradient Boosting
概述
- CART回归树是XGBoost的基分类器
XGBoost模型推导(假设回归树的结构确定)
模型F的加法定义:
F(x;w)=K∑k=0fk(x;wk)
- 其中, x为输入样本, fk为分类回归树,可以是分类回归树空间中的任意一棵树, wk是树fk的参数
定义损失函数
Lt=n∑i=1l(yi,ˆyti)+Ω(ft)=n∑i=1l(yi,ˆyt−1i+ft(xi))+γT+12λT∑j=1w2j
- Lt: 第 t 轮迭代的损失函数
- l(yi,ˆyti) 表示单个样本的损失函数定义
- ˆyti=ˆyt−1i+ft(xi) 表示第 t 轮 xi 样本的预测值
- 加法模型: 第 t 轮预测值 = 第 t−1 轮预测值 + 第 t 棵(轮)决策树的预测值
- Ω(ft) 表示正则项
- n 表示样本的个数
- T 表示叶子结点的个数
- wj 表示叶节点分数, 即任意样本落到第 t 棵(轮)决策树的第 j 叶子结点时的预测值(可称为第 t 棵(轮)决策树的第 j 叶子结点的预测值)
- γ和λ都是正则项参数
第 t 轮训练的目标
- 找到一个最优的分类器 f⋆t(x), 满足
f⋆t(x)=argmaxft(x)Lt=argmaxft(x)(n∑i=1l(yi,ˆyti)+Ω(ft))=argmaxft(x)(n∑i=1l(yi,ˆyt−1i+ft(xi))+γT+12λT∑j=1w2j)
最小化损失函数推导
损失函数二阶泰勒展开
回忆传统泰勒展开:
f(x)=f(x0)+f′(x0)(x−x0)+f″(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n=∞∑n=0f(n)x0n!(x−x0)n二阶泰勒展开公式
f(x+Δx)≈f(x)+f′(x)Δx+12f″(x)Δx2在我们的场景中,令
- x=ˆyt−1i
- Δx=ft(xi)
则有对单个样本能得到
l(yi,ˆyt−1i+ft(xi))≈l(yi,ˆyt−1i)+l′(yi,ˆyt−1i)ft(xi)+12l″(yi,ˆyt−1i)f2t(xi)- l′(yi,ˆyt−1i) 是 l(yi,ˆyi) 对 ˆyi 的一阶导数在 ˆyi=ˆyt−1i 处的值
- l″(yi,ˆyt−1i) 是 l(yi,ˆyi) 对 ˆyi 的二阶导数在 ˆyi=ˆyt−1i 处的值
我们第 t 轮的目标是找到一个最优的分类器 f⋆t(x)最小化损失函数 Lt
Lt≈n∑i=1(l(yi,ˆyt−1i)+l′(yi,ˆyt−1i)ft(xi)+12l″(yi,ˆyt−1i)f2t(xi))+γT+12λT∑j=1w2j显然上面式子中的 l(yi,ˆyt−1i) 与 ft(xi) 无关,可以移除,于是有
Lt≈n∑i=1(l′(yi,ˆyt−1i)ft(xi)+12l″(yi,ˆyt−1i)f2t(xi))+γT+12λT∑j=1w2j令:
- gi=l′(yi,ˆyt−1i) 为 l(yi,ˆyi) 对 ˆyi 的一阶导数在 ˆyi=ˆyt−1i 处的值
- hi=l″(yi,ˆyt−1i) 是 l(yi,ˆyi) 对 ˆyi 的二阶导数在 ˆyi=ˆyt−1i 处的值
则有:
Lt≈n∑i=1(gift(xi)+12hif2t(xi))+γT+12λT∑j=1w2j做一个重要的转换:
ft(xi)=wj,s.t. xi∈Ij- 上面的式子前半部分成立的条件是 xi 落在叶子结点 j 上
- 我们将条件xi 落在叶子结点 j 上表示为 xi∈Ij
于是: 我们可以将前面对样本的累加变成对叶子结点的累加
Lt≈T∑j=1((∑i∈Ijgi)wj+12(∑i∈Ijhi)w2j)+γT+12λT∑j=1w2j≈T∑j=1((∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)w2j)+γT令:
- Gj=∑i∈Ijgi
- Hj=∑i∈Ijhi
则有
Lt≈T∑j=1(Gjwj+12(Hj+λ)w2j)+γTLt 对 wj 求偏导有
∂Lt∂wj=Gj+(Hj+λ)wj令导数 ∂Lt∂wj=0 可得
w⋆j=−GjHj+λ同时
L⋆t≈min(Lt)≈T∑j=1(Gj⋅(−GjHj+λ)+12(Hj+λ)⋅(−GjHj+λ)2)+γT≈−12T∑j=1(G2jHj+λ)+γT目标函数的计算示例: 目标分数越小越好
结论
- 在第 t 轮回归树的结构确定后,我们得到的最优叶节点分数与结构无关 w⋆j=−GjHj+λ
- 最小损失与第 t 轮回归树的结构的复杂度(叶节点数量)相关
- 我们还需要确定第 t 轮回归树的结构
回归树的结构确定
普通决策树树结构的确定
- 详细情况可参考: ML——DT-决策树
ID3
- 最大化信息增益来选择分裂特征
C4.5
- 最大化信息增益比来选择分裂特征
CART
分类树
- 最小化基尼指数来选择分裂特征
回归树
- 最小化平方误差来选择分裂特征
XGBoost结点分裂前后的信息增益
- 信息增益应该与前面的损失函数相关, 损失越小越好
- 原始损失函数为
L⋆t≈−12T∑j=1(G2jHj+λ)+γT - 显然,要使得损失函数最小,我们需要使得下面的式子最大:
G2jHj+λ - 一个结点分裂后的信息为
G2LHL+λ+G2RHR+λ- 左子树的信息 + 右子树的信息
- 一个结点分裂前信息为
(GL+GR)2HL+HR+λ - 从而我们定义一个结点分列前后的信息增益为:
Gain=G2LHL+λ+G2RHR+λ−(GL+GR)2HL+HR+λ−γ- Gain 越大说明当前结点的当前分裂方式越好
- 其中 γ 是一个超参数用于防止过拟合,可以理解为有两层含义:
- 用于对叶节点数目进行控制
- 用于增大分裂前后Gain的阈值
- 事实上 γ 不是凭空来的,开始的定义中 γ 就是L1正则化(叶节点数量)的系数, 这里分裂后叶节点数量多了1个, 我们希望树的叶节点越少越好(模型越简单越好),而这个的信息增益越大越好, 所以减去 γ 值,防止结点分裂得太多
- 对于每个特征的每个分裂点, γ 值都相同,所以 γ 值对特征和分裂点的选择没有影响,只是影响了某个结点是否能够被分裂(信息增益太小或者为负时我们可以选择不分裂)
XGBoost树节点分裂
精确分裂算法
- 单个叶节点精确计算信息增益分裂流程(特征和特征分裂取值的选择, 假设一共m个特征)
- 注意: 每次只对叶节点分裂,已经分裂了的就不是叶节点了,不能二次分裂
- 原图来自: https://www.cnblogs.com/massquantity/p/9794480.html
近似分裂算法
分桶策略与GBDT的不同
- 传统的GBDT分桶时每个样本的权重都是相同的
- XGBoost中每个样本的权重为损失函数在该样本点的二阶导数(对不同的样本,计算得到的损失函数的二阶导数是不同的), 这里优点AdaBoost的思想,重点关注某些样本的感觉
- 这里影响的是划分点的位置(我们划分划分点[桶]时都是均匀划分样本到桶里面,当不同样本的权重不同时,每个桶里面的样本数量可能会不同)
- 下图是一个示例
- 详细推导解释,为什么选择损失函数在当前样本的二阶导数作为权重?
Lt≈n∑i=1(gift(xi)+12hif2t(xi))+γT+12λT∑j=1w2j≈n∑i=112hi(2gihift(xi)+f2t(xi))+γT+12λT∑j=1w2j≈n∑i=112hi(ft(xi)−gihi)2+n∑i=1(g2i2hi−2gift(xi))+γT+12λT∑j=1w2j- 上面的式子中第二项在原文中用constant来表示,可以被看成某种正则项
- 第一项是一个平方误差表达式,样本 xi 对应的输出值为 gihi, 而样本权重就是 hi
- 权重代表概率,概率越大说明该点出现的次数或者该点附近的值出现的次数就越多.
- XGBoost分桶流程
- [待更新]
XGBoost整棵树分裂流程
- 初始化f0(x)
- for t=1 to M:
- 计算损失函数对每个训练样本点的一阶导数 gi ,二阶导数 hi
- 递归对叶子节点运用树分裂算法生成一颗决策树 ft(x),
- (这一步包括叶子节点的分数 wj 也都确定下来)
- (这一步可以使用近似分裂算法加快训练速度)
- 把新生成的决策树加入到模型中, ˆyt=ˆyt−1+fm(x)
传统GDBT与XGBoost的比较
- 参考博客: ML——XGBoost-vs-传统GBDT