算法强化 —— XGBoost(二)

分裂点贪心算法

对现有的叶节点加入一个分裂,然后考虑分裂之后目标函数降低多少,如果目标函数下降,则说明可以分裂,如果目标函数不下降,则说明该叶节点不宜分裂
对于一个叶节点,加入给定其分裂点,定义划分到左子节点的样本的集合为 m a t h b b I L = { i ∣ q ( x → i ) = L } \\mathbb{I}_{L}=\left\{i | q\left(\overrightarrow{\mathbf{x}}_{i}\right)=L\right\} mathbbIL={iq(x i)=L}
定义划分到右子节点的样本的集合为 I R = { i ∣ q ( x → i ) = R } \mathbb{I}_{R}=\left\{i | q\left(\overrightarrow{\mathbf{x}}_{i}\right)=R\right\} IR={iq(x i)=R}则有
G L = ∑ i ∈ I L g i , G R = ∑ i ∈ I R g i H L = ∑ i ∈ I L h i H R = ∑ i ∈ I R h i G = ∑ i ∈ I L g i + ∑ i ∈ I R g i = G L + G R H = ∑ i ∈ I L h i + ∑ i ∈ I R h i = H L + H R \begin{aligned} \mathbf{G}_{L} &=\sum_{i \in \mathbb{I}_{L}} g_{i}, \mathbf{G}_{R}=\sum_{i \in \mathbb{I}_{R}} g_{i} \\ \mathbf{H}_{L} &=\sum_{i \in \mathbb{I}_{L}} h_{i} \mathbf{H}_{R}=\sum_{i \in \mathbb{I}_{R}} h_{i} \\ \mathbf{G}=& \sum_{i \in \mathbb{I}_{L}} g_{i}+\sum_{i \in \mathbb{I}_{R}} g_{i}=\mathbf{G}_{L}+\mathbf{G}_{R} \\ \mathbf{H}=& \sum_{i \in \mathbb{I}_{L}} h_{i}+\sum_{i \in \mathbb{I}_{R}} h_{i}=\mathbf{H}_{L}+\mathbf{H}_{R} \end{aligned} GLHLG=H==iILgi,GR=iIRgi=iILhiHR=iIRhiiILgi+iIRgi=GL+GRiILhi+iIRhi=HL+HR

定义叶节点的分裂增益为:
Gain = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ] − γ \text {Gain}=\frac{1}{2}\left[\frac{\mathbf{G}_{L}^{2}}{\mathbf{H}_{L}+\lambda}+\frac{\mathbf{G}_{R}^{2}}{\mathbf{H}_{R}+\lambda}-\frac{\mathbf{G}^{2}}{\mathbf{H}+\lambda}\right]-\gamma Gain=21[HL+λGL2+HR+λGR2H+λG2]γ
其中:
G L 2 H L + λ \frac{\mathbf{G}_{L}^{2}}{\mathbf{H}_{L}+\lambda} HL+λGL2表示:该叶节点的左子树的结构分

G R 2 H R + λ \frac{\mathbf{G}_{R}^{2}}{\mathbf{H}_{R}+\lambda} HR+λGR2表示:该叶节点的右子树的结构分

G 2 H + λ \frac{\mathbf{G}^{2}}{\mathbf{H}+\lambda} H+λG2表示:如果不分裂,则该叶节点本事的结构分

− λ -\lambda λ表示:因为分裂导师叶节点数量增大1,从而导致增益的下降
每次分裂只一个叶节点,因此其他叶节点不会发生变化,因此
G a i n > 0 Gain > 0 Gain>0,则该叶节点应该分裂
G a i n ≤ 0 Gain \leq 0 Gain0,则该叶节点不宜分裂

现在的问题是:不知道分裂点。对于每个叶节点,存在很多个分裂点,且可能很多分裂点都能带来增益。
解决办法是:对于叶节点中的所有可能的分裂点进行一次扫描,然后计算每个分裂点的增益,选取增益最大的分裂点作为本叶节点的最优分裂点。

贪心算法的缺点

分裂贪心算法尝试所有特征和所有分裂位置,从而求得最优分裂点,当样本太大且特征为连续值时,这种暴力做法的计算量太大。

近似算法

近似算法的思想

1.近似算法寻找最优分裂点时不会枚举所有的特征值,而是对特征值进行聚合统计,然后形成若干个桶。然后仅仅将桶边界上的特征的值作为分裂点的候选,从而获取计算性能的提升。
2.假设数据集 D = ( x 1 → , y 1 ~ ) , ( x 2 → , y 2 ~ ) , . . . , ( x N → , y N ~ ) D = {(\overrightarrow{x_1},\tilde{y_1}),(\overrightarrow{x_2},\tilde{y_2}),...,(\overrightarrow{x_N},\tilde{y_N})} D=(x1 ,y1~),(x2 ,y2~),...,(xN ,yN~) 样本 x i → = ( x i , 1 , x i , 2 , . . . , x i , n ) T \overrightarrow{x_i} = (x_{i,1},x_{i,2},...,x_{i,n})^T xi =(xi,1,xi,2,...,xi,n)T
对第k个特征进行分桶:
如果第k个特征为连续特征,则执行百分位分桶,得到分桶的区间为 S k = s k , 1 , s k , 2 , . . . , s k , l S_k = {s_{k,1},s_{k,2},...,s_{k,l}} Sk=sk,1,sk,2,...,sk,l,其中 s k , 1 < s k , 2 < . . . < s k , l s_{k,1} < s_{k,2} < ... <s_{k,l} sk,1<sk,2<...<sk,l
分桶的数量、分桶的区间都是超参数,需要仔细挑选
如果第k个特征为离散特征,则执行案离散值分桶,得到的分桶为 S k = s k , 1 , s k , 2 , . . . , s k , l S_k = {s_{k,1},s_{k,2},...,s_{k,l}} Sk=sk,1,sk,2,...,sk,l,其中 s k , 1 , s k , 2 , . . . , s k , l s_{k,1},s_{k,2},...,s_{k,l} sk,1,sk,2,...,sk,l为第k个特征的所有可能的离散值
分桶的数量l就是所有样本在第k个特征上的取值的数量。

分桶的模式

分桶有两种模式

全局模式:在算法开始时,对每个维度分桶一次,后续的分裂都依赖于该分桶并不在更新。
优点是:只需要计算一次,不需要重复计算
缺点是:在经过多次分裂之后,叶节点的样本可能在很多全局桶中是空的

局部模式:除了在算法开始时进行分桶,每次拆分之后再重新分桶
优点是:每次分桶都能保证各桶中的样本数量都是均匀的
缺点是:计算量较大

分桶的超参数

分桶时的桶区间间隔大小是个重要的参数
区间间隔越小,则桶越多,则划分的越精细,候选的拆分点就越多。

加权分桶

定义一个排序函数
假设候选样本的第K维特征,及候选样本的损失函数的二阶偏导数为: D k = ( x 1 , k , h 1 ) , ( x 2 , k , h 2 ) , . . . , ( x N , k , h N ) D_k = {(x_{1,k},h_1),(x_{2,k},h_2),...,(x_{N,k},h_N)} Dk=(x1,k,h1),(x2,k,h2),...,(xN,k,hN)
定义排序函数
r k ( z ) = ∑ { i ∣ ( x i , k , h i ) ∈ D k , x i , k < z } h i ∑ { i ∣ ( x i , k , h i ) ∈ D k } h i r_{k}(z)=\frac{\sum_{\left\{i |\left(x_{i, k}, h_{i}\right) \in \mathcal{D}_{k}, x_{i, k}<z\right\}} h_{i}}{\sum_{\left\{i |\left(x_{i, k}, h_{i}\right) \in \mathcal{D}_{k}\right\}} h_{i}} rk(z)={i(xi,k,hi)Dk}hi{i(xi,k,hi)Dk,xi,k<z}hi
它刻画的是:第K维小于z的样本的h之和,占总的h之和的比例
xgboost的作者提出了一种带权重的桶划分算法。定义候选样本的下标集合为 I \mathbb{I} I,拆分点为 S k = s k , 1 , s k , 2 , . . . , s k , l S_k = {s_{k,1},s_{k,2},...,s_{k,l}} Sk=sk,1,sk,2,...,sk,l定义为
s k , 1 = min ⁡ i ∈ I x i , k , s k , l = max ⁡ i ∈ I x i , k , ∣ r k ( s k , j ) − r k ( s k , j + 1 ) ∣ < ϵ s_{k, 1}=\min _{i \in \mathbb{I}} x_{i, k}, s_{k, l}=\max _{i \in \mathbb{I}} x_{i, k}, \quad\left|r_{k}\left(s_{k, j}\right)-r_{k}\left(s_{k, j+1}\right)\right|<\epsilon sk,1=iIminxi,k,sk,l=iImaxxi,k,rk(sk,j)rk(sk,j+1)<ϵ
其中 x i , k x_{i,k} xi,k表示样本 x i → \overrightarrow{x_i} xi 的第k个的特征,即:
最小的拆分点是所有样本第k维的最小值。
最大的拆分点是所有样本第k维的最大值。
中间的拆分点:选取拆分点,使得相邻拆分点的排序函数值小于 ϵ \epsilon ϵ(分桶的桶宽)
其意义为:第K维大于等于 s k , j s_{k,j} sk,j,小于 s k , j + 1 s_{k,j+1} sk,j+1的样本的h之和,占总的h之和的比例小于 ϵ \epsilon ϵ
这种拆分点使得每个桶内的以h为权重的样本数量比较均匀,而不是样本个数比较均匀。

加权分桶的方法的解释

改写以后可以发现,对于第t棵决策树而言,它等价于样本 x i x_i xi的真实label为 g i h i \frac{g_i}{h_i} higi,权重为 h i h_i hi,损失函数的平方损失。因此分桶时每个桶的权重为h。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值