【xgboost系列三】xgboost树节点分裂方式:带权分位图

第二节讲了几种树节点的分裂方式,本节具体讲述xgboost的带权分位图思想

本小节讲讲述分位图为什么能降低查找分裂点的个数,以及具体怎么操作的。

一、数学建模

假设我们有一堆带权重的点的集合D:
在这里插入图片描述
其中xi为点,wi为点的权重。假设这些wi加起来为1000。xi都从小到大排好序。

如果是普通的分位图,大家权重都是1,和就是n。

如果我们要计算1/4分位点,此时我们查找1/4的位置是计算权重和1/4的位置,也就是和为250的地方。

那么如何计算带权的分位图的分位点呢?比如我现在有n个点,我想设置一个参数b,输出b个分位点。

这个其实跟分位图的实现有关,跟xgboost无关,主要的两个操作为
Merge OperationPrune Operation,第一个是计算每个点的累计权重和,第二个是计算d个分位点对应的值(某个xi的值)

二、Merge Operation

Merge Operation就是说存储每个点的带权累计和结果,当我们把x排好序后,

分为两步:
step1:计算每个xi对应的权重和。

step2:从x1、x2、x3。。。慢慢合并xi的累计值。然后将之存起来。

这一步我们可以得到每个点的累计权重和。

下一步Prune Operation就是根据这个查找d个分位点。

三、Prune Operation
Prune Operation说白了就是计算分位图的操作,假设我们原来特征有n个值,我们可以选择一个参数b,让分裂点查询的范围变成b,其实就是分成b份,也就计算1/b分位点,2/b分位点。。

那么xgbosot如何计算的呢?

首先我们要定义一个query,这个query函数的作用是找相应权重对应的xi。比如我们的权重和为1000,query(100)的作用是查找累计加权和为100的xi的点,也就是说x < = xi的时候,加权和为100.

这个Prune Operation函数的返回值是:
在这里插入图片描述
这个序列表示b+1的分位点。

每一个xi一撇,就是用query函数找出来的,以和为1000,分位数为b为例。每个xi一撇的计算公式为:

xi = query(1000 * (i-1 / b))

这就是实现了分割点从n变成了b个,减少了分割点遍历的数量。

四、特殊情况:缺失值的处理
对于缺失值处理的算法,xgbosot称为:Sparsity-aware Split Finding

其实具体为,对于缺失值,xgboost同时测试将缺失值放左边或者右边,然后计算分裂的收益,选择收益大的方向。

对于训练中没有出现缺失值,而测试的时候出现缺失值,xgboost默认将数据分在右子节点。

具体的算法如下图所示:
在这里插入图片描述
在具体的工程实现中,可以指代缺失值的具体值:

missing (float, optional) – Value in the input data which needs to be present as a missing value. If None,
 defaults to np.nan.

总结:本小节写了xgboost 带权分位图的具体思想(weighted quantile Sketch)和xgboost对缺失值的处理,没看懂或觉得我写的比较栏的,欢迎评论一下,下一小节将写xgbosot的工程优化。

参考文献

[1] https://homes.cs.washington.edu/~tqchen/data/pdf/xgboost-supp.pdf
[2] https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值