(作者:陈玓玏)

写在前面:这篇博客我自认为写得不太好,有些问题可能我自己也没有弄得多清楚,对文章有疑问的朋友可以留言讨论,不胜感激。

1、基本的查找分割点的贪婪算法

这样的算法称为精确贪婪算法,在计算分割点的过程中,它会去查找进入当前分支的每一个样本的每一个特征值,计算它们的增益,sklearn和单机版xgboost都支持这种算法。不过这种算法要求在一开始的时候先把所有样本按照特征值排好序,并计算好它们的一阶导数和二阶导数,这样才能快速地计算增益,选定分割的候选节点。

2、效率极高的分位点算法

以上算法在其他基于决策树的算法中是常用的,但是这样做的结果就是运算量极大,即使在xgboost中通过率先排序及计算梯度向量,在实施过程中的计算量仍旧非常大,尤其是样本量足够大的时候,因此xgboost中使用的是基于Weighted Quantile Sketch分位点算法。

xgboost所使用的分位点算法,其核心思想是根据特征的分布取其分位点,这些分位点将作为分割点将整个特征区间划分为多个段,所有特征值将进入对应分段,由分位点代替其真实特征值,其本质就是连续特征的分段离散,随后获取梯度向量,找出最佳分割点。

2.1 算法分类

实际计算分位点时也有两种算法:
1)全局算法:在树结构构建的初始阶段,计算出所有的候选分割点,在随后的建树过程中,无论构建哪一层,都使用同样的候选分割点,这种方法全局只需要计算一次,步骤更少,但是需要计算出的候选节点更多才能保证精度。
2)局部算法:每一次分裂都重新计算候选分割点,计算步骤更多,但是总的需要计算的候选节点更少,适用于更深的树的构建。

Weighted Quantile Sketch算法的基础是GK算法,GK算法可以看这一篇:https://blog.csdn.net/matrix_zzl/article/details/78641264 ,原始的论文:http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf。
GK算法和xgboost中所使用的算法的一个重要区别在于:

  1. GK算法中的rank使用的就是根据特征值从小到大排序之后的序号,而Weighted Quantile Sketch算法中所使用的rank是排序后小于特征值某个值的样本的权重和,而xgboost中使用的是一个Weighted Quantile Sketch中归一化的权重和,使用的是特征值小于某个值的样本的二阶导数之和除以所有样本的二阶导数之和。
  2. 2.GK算法中每个summary(我理解的summary就是一个集合的意思)存储为一个三元组,绝对位置的三元组存储的内容分别是:集合内的样本值集合,集合内最小样本的序号,集合内最大样本的序号。相对位置的三元组存储内容分别为:集合内的样本值集合,当前集合最小样本序号-前一个集合最小样本序号(从第一次集合开始可以依次确定出每个集合的起始位置),集合内最大样本序号-集合内最小样本序号(表征当前集合的长度)。而对于xgboost而言,它的每个summary是由一个四元组表示的:集合内的样本值集合,集合内的所有特征值<某个值的样本对应权重和,集合内的所有特征值<=某个值的样本对应权重和,集合内的所有特征值=某个值的样本对应权重和。

2.2 统一定义

Weighted Quantile Sketch算法中,有以下固定的定义:

DDD表示输入的数据集,xix_ixi​表示所有样本的某个特征值,wiw_iwi​表示样本对应的权重。

rD−(y)r_D^-(y)rD−​(y)即需要存入元组的第二项的上限,表示所有特征值小于y(这里的y不要理解成label)的样本的权重和。

rD+(y)r_D^+(y)rD+​(y)即需要存入元组的第三项的上限值,表示所有特征值小于等于y的样本的权重和。

wD(y)w_D(y)wD​(y)即需要存入元组的第四项的上限值,表示所有特征值等于y的样本的权重和。
另外,对于整个dateset来说,其权重为所有样本的权重和,公式如下:

summary的四元组内容如下:

Q(D)Q(D)Q(D)是集合DDD对应的分位数summary,SSS是DDD中的样本特征值的集合,即{x1,x2,....,xk{x_1,x_2,....,x_k}x1​,x2​,....,xk​},x1x_1x1​是此summary中的最小值,xkx_kxk​是最大值,summary中的每一个点都可以计算得到r−,r+和wr^-,r^+和wr−,r+和w(但加了波浪线的rank是什么运算,没有弄明白。。。有看懂的可以留言补充,感谢~),因为此处的集合DDD包含的是所有数据,这些操作自然也是在整个区间计算的了。

除了每个summary对应的四元组内容,算法还定义了每个summary中的点需要满足的约束:

不过当集合中的点是整个输入区间的最大值或最小值时,约束条件中的等号成立。
这几个变量还满足另外一个约束条件:

对于新插入的数据点yyy,其rank和www的计算逻辑如下:
1)如果y&lt;x1y&lt;x_1y<x1​,则

2)如果y&lt;x1y&lt;x_1y<x1​,则

3)如果yyy在集合范围内,处于某两个特征值之间,则

2.3 merge和prune操作

有了以上的基础,我们就可以来讨论下面的内容了。
我们当前所讨论的summary是没有进行切分的,如果直接这么使用,精度几乎为0,这就涉及到算法中最重要的两个操作:merge和prune。
1)merge
两个summary做merge操作,其实就是把两个summary中的数据放到一起,并且更新它们的rank值和www值。令需要merge的两个summary是D1和D2D_1和D_2D1​和D2​,它们merge后的结果是DDD,因此merge的结果如下:


2)prune
光是merge的话,其实一直执行merge最后的精度一定又会变为0,所以我们必须要进行prune操作。prune操作是基于一个新的函数g(Q,d)g(Q,d)g(Q,d),这个函数定义了找到prune操作分位点的方法,因为对于一个给定精度为ϵ\epsilonϵ的summaryQQQ而言,我们总是能找到一个点x∗=g(Q,d)x^*=g(Q,d)x∗=g(Q,d)满足以下两个不等式:

我的理解是,对于给定的ddd作为一个标尺,总能在summary内找到一个距离Dataset内最小的数的权重距离最接近ddd的样本点作为x∗x^*x∗。具体如何来确定样本点,需要分四种情况,论文中的prune算法中讲得很清楚了,下面贴出来:

有了寻找分割点的算法基础之后,我们就可以根据内存预算来找分割点了,比如我们内存的预算是bbb,我们需要找到b+1b+1b+1个分割点,也就是

构成的新的summary为

这里需要注意的是,DDD并不发生改变,还是包含所有训练数据的dateset,变的是summary,summary中的SSS样本点更新了。SSS中的每个样本点由以下公式确定:

iii是从1到b+1的,这样就能找出b+1个分位点了。更新之后的误差为ϵ+1/b\epsilon+1/bϵ+1/b。

2.4 xgboost中使用weighted quantile sketch算法

有了这个基础之后我们就可以来讨论xgboost中模糊查找分割点的具体情况了。
模糊算法中,每个样本的权重取的是hih_ihi​,这个可以通过将目标函数转换成以下形式而得:

目标函数转化成此形式之后,可以视为平方损失函数和正则项构成的目标函数,gi/hig_i/h_igi​/hi​视为样本的label值,而hih_ihi​就是每个样本的权重。
所以对于以下dataset

其rank表示为:

我们需要找到的分割点必须满足:

参考文献:

  1. 论文:https://arxiv.org/pdf/1603.02754.pdf
  2. https://blog.csdn.net/matrix_zzl/article/details/78641264
  3. https://blog.csdn.net/matrix_zzl/article/details/78660821

XGBoost中分位点算法快速查找分割点相关推荐

  1. XGBoost之分位点算法

    一.综述XGBoost 很多方法并非XGBoost第一次提出,当然也不是说XGBoost没改进,可以说XGBoost把算法和系统实现都做得淋漓尽致 1.系统实现 决策树的学习最耗时的一个步骤就是对特征 ...

  2. List中根据对象字段快速查找对象

    import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util. ...

  3. 算法---快速查找质数

    其实,找一个质数,很简单啊,就是全部遍历一次嘛, 但是! 我们这里讲一下,快速求解的办法好吧! 对于给定的一个数,求解这个数内的所有质数! 首先,对于一个数n,只要它根号n内的数,不能整除它,那么它就 ...

  4. Cadence OrCAD原理图中快速查找元件的方法

    Cadence OrCAD原理图中快速查找元件和网络方法 本章节将教大家如何在OrCAD原理图中根据元件位号快速查找元件的两个方法. 方法一:在.obj页面的"File"标签下查找 ...

  5. 减治法在查找算法中的应用(JAVA)--快速查找

    减治法在查找算法中的应用 快速查找:选择问题是求一个n个数列表的第k个最小元素的问题,这个数k被称为顺序统计量.对于k=1或k=n来说,这并没有什么意义,我们通常会要找出这样的元素:该元素比列表中一半 ...

  6. python寻峰算法_在python中快速查找峰和质心

    我正在尝试在python中开发一种快速算法,以查找图像中的峰值,然后找到这些峰值的质心.我使用scipy.ndimage.label和ndimage.find_objects编写了以下代码来查找对象. ...

  7. 索引:如何在海量数据中快速查找某个数据?

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 前面讲过MySQL数据库索引实现原理,底层是依赖B+树这种数据结构来实现的.那类似Redisp 这 ...

  8. 【索引】:如何在海量数据中快速查找某个数据?

    亲测可用,若有疑问请私信 在[B+树]:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理.MySQL底层依赖的是B+树这种数据结构.那类似Redis这样的Key-Value ...

  9. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

最新文章

  1. 2021-10-20开发计量系统遇到的问题之--1启动mysql--2mybatis谨慎注释--3mybatis返回多表查询结果
  2. Visual Studio 2017开发linux程序之libevent使用实例
  3. Eclipse中怎样使用ERMaster进行单表设计并导出为DDL
  4. Spring Cloud Alibaba:Sentinel实现熔断与限流
  5. [原创] 指针操作程序答案 — 谭浩强C语言习题答案
  6. mysql中查询一个字段属于哪一个数据库中的哪一个表的方式
  7. C ++ STL中的set :: upper_bound()函数
  8. 长在华人第一学霸家族的他,到底有多牛?
  9. 用NuGet掌管你的Vi“.NET研究”sual Studio扩展
  10. 【经验分享】linux交叉编译 - openssl动态库
  11. git 上的 python package 的安装
  12. 2. laravel 创建第一条路由
  13. BScroll 使用(Vue)
  14. 网页版Facebook第三方登陆
  15. 算法 图8 How Long Does It Take
  16. 【周末送新书】基于BERT模型的自然语言处理实战
  17. 小狗钱钱-博多·舍费尔
  18. 需求分析和数据分析那些事。
  19. html js获取天气预报,js 读取天气预报信息 示例代码(百度地图天气接口)
  20. 【渝粤题库】国家开放大学2021春2208政治学原理题目

热门文章

  1. target=_blank和target=_black
  2. 《游戏机制——高级游戏设计技术》一2.4 渐进型游戏
  3. ssh+Google双重认证
  4. 在Google使用Borg进行大规模集群的管理 7-8
  5. 一年365天每天进步 5‰或1%和每天退步 5‰或1%最后的结果分别是多少
  6. jadx反编译程序未响应
  7. 干货,新手小白做影视剪辑,这样做,帮你99%避免违规侵权
  8. mysql全文索引与停止词
  9. python之pycharm添加环境变量
  10. Python爬取百度指数搜索结果,查看你想了解的热点信息吧