一、近似算法

(二)提升树模型:Xgboost原理与实践这篇博客介绍了XGBoost使用exact greedy算法来寻找分割点建树,但是当数据量非常大难以被全部加载进内存时或者分布式环境下时,exact greedy算法将不再合适。因此作者提出近似算法(Approximate Algorithm)来寻找分割点。

近似算法的大致流程见下面的算法(参考文献【5】中3.2)。

对于某个特征kkk,算法首先根据特征分布的分位数找到特征切割点的候选集合Sk={sk1,sk2,...,skl}S_k = \{s_{k1}, s_{k2}, ... ,s_{kl} \}Sk​={sk1​,sk2​,...,skl​};然后将特征kkk的值根据集合SkS_kSk​划分到桶(bucket)中,接着对每个桶内的样本统计值G、H进行累加统计,最后在这些累计的统计量上寻找最佳分裂点。

不同于基本的穷举算法,paper指出两种近似算法:一种是全局算法,即在初始化tree的时候划分好候选分割点,并且在树的每一层都使用这些候选分割点;另一种是局部算法,即每一次划分的时候都重新计算候选分割点。这两者各有利弊,全局算法不需要多次计算候选节点,但需要一次获取较多的候选节点供后续树生长使用,而局部算法一次获取的候选节点较少,可以在分支过程中不断改善,即适用于生长更深的树,两者在effect和accuracy做trade off。

论文【5】实验中发现,全局k分位点取20和局部k分位点取3,得到了近似的效果。

!!!从算法伪代码可以看出近似算法的核心是如何根据分位数采样得到分割点的候选集合SSS。 Xgboost提出了Weighted Quantile Sketch来解决这个问题。

在讲述Weighted Quantile Sketch之前,必须先要介绍一下什么是Quantile。这是Weighted Quantile Sketch的关键,如果不理解Quantile,就不会理解,在当数据量非常大难以被全部加载进内存时或者分布式环境下时,Xgboost的近似算法是如何寻找分割点的候选集合SSS的。

二、 Quantile

2.1 ϕ\phiϕ-quantile

输入数据: 14, 19, 3, 15, 4, 6, 1, 13, 13, 7, 11, 8, 4, 5, 15, 2

排序后,该组数据为: 1, 2, 3, 4, 4, 5, 6, 7, 8, 11, 13, 13, 14, 15, 15, 19. 如下图所示:

在上面的序列中,

第1小的数是什么? 很明显是:1 (rank=1)
第4小的数是什么? 答案是:4 (rank=4)
第50%小的数是什么? 50% * 16 = 8(rank=8), 则答案为:7

什么是分位点呢?ϕ\phiϕ-quantile表示 rank=⌊ϕ×N⌋rank=\lfloor \phi \times N \rfloorrank=⌊ϕ×N⌋的元素,其中,N为序列中元素的个数。例如,在上面的例子中:

0.25-quantile是什么? rank=0.25×16=4,所以答案为:4
0.5-quantile是什么? rank=0.5×16=8,所以答案为:7

2.2 ϵ\epsilonϵ-approximate ϕ\phiϕ-quantiles

ϵ\epsilonϵ-approximate ϕ\phiϕ-quantiles的意思就是:在 ϕ\phiϕ-quantiles误差ϵ\epsilonϵ-approximate以内位置的取值。即近似分位点。

即ϕ\phiϕ-quantiles是在区间[⌊(ϕ−ϵ)×N⌋,⌊(ϕ+ϵ)×N⌋][ \lfloor (\phi - \epsilon) \times N \rfloor, \lfloor (\phi + \epsilon) \times N \rfloor][⌊(ϕ−ϵ)×N⌋,⌊(ϕ+ϵ)×N⌋],而不是之前的精确的⌊ϕ×N⌋\lfloor \phi \times N \rfloor⌊ϕ×N⌋。还是上面的例子,令ϵ=0.1\epsilon=0.1ϵ=0.1,ϕ=0.5\phi=0.5ϕ=0.5,由数据可知N=16N=16N=16,此时[⌊(ϕ−ϵ)×N⌋,⌊(ϕ+ϵ)×N⌋][ \lfloor (\phi - \epsilon) \times N \rfloor, \lfloor (\phi + \epsilon) \times N \rfloor][⌊(ϕ−ϵ)×N⌋,⌊(ϕ+ϵ)×N⌋]为[6.4,9.6],即rank为{7,8,9}\{7,8,9\}{7,8,9},0.1-appoximate 0.5-quantile为:{6,7,8}\{6,7,8\}{6,7,8}。

这个物理含义是什么呢?就是说,如果我们允许 ϵ∗N\epsilon*Nϵ∗N就是1.6的误差的话,那么0.5-quantile的值为6,7或者8都可以。都算对。详见参考文献【1】。

2.3 ϵ\epsilonϵ-approximate quantile summary

我们已经可以看到,即便是求一个序列的ϵ\epsilonϵ-approximate ϕ\phiϕ-quantiles,也必须先对数据进行排序,而如果我们的内存不足以让全部数据排序时,应该怎么解决?早在2001年,M.Greenwald和S. Khanna提出了GK Summay分位点近似算法(ϵ\epsilonϵ-approximate ϕ\phiϕ-quantiles)【2】,直到到2007年被Q. Zhang和W. Wang提出的多层level的merge与compress/prune框架进行高度优化,而被称为A fast algorithm for approximate quantiles【3】,目前XGBoost框架套用A fast algorithm算法结构。

GK Summay巧妙地设计了 ϵ\epsilonϵ-approximate quantile summary 。ϵ\epsilonϵ-approximate quantile summary 是一种数据结构,该数据结构能够以 εN的精度计算任意的分位查询。当一个序列无法全部加载到内存时,常常采用quantile suammary近似的计算分位点。

大致来讲下思路:ϵ\epsilonϵ-approximate quantile summary这个数据结构不需要一次存入所有的数据,它先用一些元组存入部分数据(当然在内部需要排序),这些元组记录的是现有的value值和一些位置信息,有了这些信息,就保证了能够以 εN的精度计算任意的分位查询。只要流式系统中每个时刻都维持这种summary结构,每次查询都能满足精度要求,但是流式数据实时更新,需要解决新增数据的summary更新问题。为此,算法提供了insert操作,insert操作可以保证现有的summary结构仍然可以保证 εN的精度。当然,每次数据插入都需要新增元组,summary结构不能持续增加而不删除,因此到达一定程度需要对summary进行delete。同时,delete操作也可以保证现有的summary结构仍然可以保证 εN的精度。
其实整个算法比较复杂,详见参考文献【1】【4】。建议认真阅读【1】

到这里,我们已经知道,有了ϵ\epsilonϵ-approximate quantile summary这个数据结构,无论多大的数据,我们只要给定查询的rank值,就可以得到误差在 εN以内的近似分位点。

三、Weighted Datasets

现在我们回到Xgboost中,在建立第iii棵树的时候已经知道数据集在前面i−1i−1i−1棵树的误差,因此采样的时候是需要考虑误差,对于误差大的特征值采样粒度要加大,误差小的特征值采样粒度可以减小,也就是说采样的样本是需要权重的。

重新审视目标函数
∑i[L(yi,y^iK−1)+gifK(xi)+12hifK2(xi)]+Ω(fK)+constant(1)\sum_i\left[L(y_i,\hat{y}_i^{K-1})+g_if_K(x_i)+\frac{1}{2}h_if_K^2(x_i)\right]+\Omega(f_K)+constant \tag 1 i∑​[L(yi​,y^​iK−1​)+gi​fK​(xi​)+21​hi​fK2​(xi​)]+Ω(fK​)+constant(1)

通过配方可以得到:
∑i[12hi(fK(xi)−(−gi/hi))2]+Ω(fK)+constant(2)\sum_{i} \left[ \frac {1}{2} h_i \left( f_K(x_i) - (-g_i/h_i)\right)^2 \right] + \Omega (f_K) + constant\tag 2 i∑​[21​hi​(fK​(xi​)−(−gi​/hi​))2]+Ω(fK​)+constant(2)

因此可以将该目标还是看作是关于标签为−gi/hi{-{g_i}/{h_i}}−gi​/hi​和权重为 hih_ihi​的平方误差形式。 hih_ihi​为样本的二阶导数。(注:源论文中公式(2)的地方是错误的,它写成了标签为gi/hi{{g_i}/{h_i}}gi​/hi​)

3.1 二阶导数h为权重的解释

如果损失函数是Square loss,即Loss(y,y^)=(y−y^)2Loss(y, \widehat y) = (y - \widehat y)^2Loss(y,y​)=(y−y​)2,则h=2h=2h=2,那么实际上是不带权(每个样本的权重一样)。 如果损失函数是Log loss,则h=pred∗(1−pred)h=pred∗(1−pred)h=pred∗(1−pred). 这是个开口朝下的一元二次函数,所以最大值在pred=0.5pred=0.5pred=0.5。当pred在0.5附近,值都比较大,也就是权重都比较大,在切直方图时,我们希望桶比较均匀,因此这部分就会被切分的更细。

3.2 问题转换


Dk={(x1k,h1),(x2k,h2),⋯(xnk,hn)}(3)D_k = \{(x_{1k}, h_1), (x_{2k}, h_2), \cdots (x_{nk}, h_n)\} \tag 3 Dk​={(x1k​,h1​),(x2k​,h2​),⋯(xnk​,hn​)}(3)

表示 每个训练样本的第kkk维特征值和对应二阶导数。接下来定义排序函数为rk(⋅):R→[0,+∞)r_k(\cdot):R \rightarrow[0, +\infty)rk​(⋅):R→[0,+∞)
rk(z)=1∑(x,h)∈Dkh∑(x,h)∈Dk,x<zh(4)r_k (z) = \frac {1} {\sum\limits_{\left( {x,h} \right) \in {D_k}} h } \sum\limits_{\left( {x,h} \right) \in {D_k},x < z} h \tag 4 rk​(z)=(x,h)∈Dk​∑​h1​(x,h)∈Dk​,x<z∑​h(4)

函数表示特征的值小于zzz的样本分布占比,其中二阶导数hhh可以视为权重。参考文献【6】有计算rk(z)r_k (z)rk​(z)的例子。

在这个排序函数下,我们找到一组点{sk1,sk2,...,skl}\{ s_{k1}, s_{k2}, ... ,s_{kl} \}{sk1​,sk2​,...,skl​},满足:
∣rk(sk,j)−rk(sk,j+1)∣<ε(5)| r_k (s_{k,j}) - r_k (s_{k, j+1}) | < \varepsilon \tag 5 ∣rk​(sk,j​)−rk​(sk,j+1​)∣<ε(5)

其中,sk1=min⁡ixik,skl=max⁡ixik{s_{k1}} = \mathop {\min }\limits_i {x_{ik}},{s_{kl}} = \mathop {\max }\limits_i {x_{ik}}sk1​=imin​xik​,skl​=imax​xik​,ε为采样率,直观上理解,我们最后会得到1/ε个分界点。注意,这里的ε就是每个桶的比例大小。

太数学了?用大白话说就是让相邻两个候选分裂点相差不超过某个值ε。因此,总共会得到1/ε个切分点。

一个例子如下:

要切分为3个,总和为1.8,因此第1个在0.6处,第2个在1.2处。

在Xgboost官方文档中设置tree_method=approx,然后设置sketch_eps,就可以确定有多少个候选分割点

四、Weighted Quantile Sketch

好了,如果我们的数据集比较小(特征的不同value不多),采用近似算法的话,我们只需要排序特征的所有特征值,然后根据公式(5)就可以求出候选的分割点。但是,如果这里的关键是:如果我们的数据量特别大(某些特征的不同value特别特别多),以致于无法排序找到分位点,我们应该怎么做?

对于每个样本都有相同权重的问题,本文第二部分已经介绍了有算法解决该问题。对于这种weighted datasets的情况,陈天奇博士提出了Weighted Quantile Sketch算法。Weighted Quantile Sketch算法的思想是基于参考文献【2】【3】,作者也证明该算法支持merge和prune操作,因此适合分布式场景。

Weighted Quantile Sketch的过程和证明也比较复杂,详见参考文献【5】补充材料,【8】,【9】。

有了Weighted Quantile Sketch,我们就可以求得一个大数据集每个特征的近似分位点,也就是求得了算法2中最核心的Sk={sk1,sk2,...,skl}S_k = \{s_{k1}, s_{k2}, ... ,s_{kl} \}Sk​={sk1​,sk2​,...,skl​}。且这个近似分位点的精度是在ε∗∑ihiε*\sum_ih_iε∗∑i​hi​之内的。∑ihi\sum_ih_i∑i​hi​就是第二部分的NNN的意思,只不过Xgboost中是Weighted Datasets

参考文献

【1】ε-approximate quantiles

【2】Space-efficient online computation of quantile summaries

【3】A fast algorithm for approximate quantiles in high speed data streams

【4】GK Summay算法(ϵ−approximate ϕ−quantile)

【5】XGBoost: A Scalable Tree Boosting System

【6】XGBoost之分位点算法

【7】XGBoost解读(2)–近似分割算法

【8】xgboost之分位点算法

【9】『我爱机器学习』集成学习(三)XGBoost

Xgboost近似分位数算法相关推荐

  1. R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)

    R语言plotly可视化:plotly可视化箱图.相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数.linear.inclusive.exclusive) 目录

  2. 白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法

    文章目录 概述 易并行聚合算法 三角选择原则 近似聚合算法 概述 继续跟中华石杉老师学习ES,第45篇 课程地址: https://www.roncoo.com/view/55 易并行聚合算法 有些聚 ...

  3. ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)

    ML之RF&XGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 比赛结果 设计思路 核心代码 ...

  4. 近似算法的近似率_选择最佳近似最近算法的数据科学家指南

    近似算法的近似率 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Willi ...

  5. 量子近似优化算法QAOA——解读与代码实现

    量子近似优化算法 近似优化,顾名思义就是只要近似的求得问题的解即可.近似优化算法不仅可以用于求解NP-完全问题,也可以用于求解复杂度较高的P问题. QAOA(Quantum Approximate O ...

  6. 高斯玻色采样enhance量子近似优化算法

    上篇博文,我们已经接触了QAOA量子近似优化算法,我们已经知道近似优化算法一般用于求解组合优化问题.这里我们再说明一下什么是组合优化问题: 给定一个数据集 X={x1,x2,...xN}X={{x_{ ...

  7. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

  8. xgboost和lightgbm算法总结(从决策树到xgboost)

    目录 一.背景知识合集 1.决策树 1.1 ID3.0 1.1.1 思想 1.1.2 划分标准 1.1.3 优缺点 1.2 C4.5 1.2.1 思想 1.2.2 划分标准 1.2.3 优缺点 1.3 ...

  9. xgboost 正则项_XGBoos算法背后的数学:尽可能简单地解释XGBoost算法背后的机制

    如果你想很好地理解某些内容,请尝试简单地给别人解释出来. --费曼 XGBoost是一个很优美的算法,它的过程不乏启发性.这些通常简单而美丽的概念在数学术语中消失了.我在理解数学的过程中也遇到过同样的 ...

最新文章

  1. python快速编程入门课后题答案-《Python编程:从入门到实践》第五章 if语句 习题答案...
  2. 《Zabbix-ICMP ping监控添加方法》-7
  3. sysfs cannot create duplicate filename问题
  4. Pandas打印所有行和列(显示所有的行和列)
  5. mysql 文件描述符_MySQL没有发布临时文件描述符
  6. sum(x) over( partition by y ORDER BY z ) 分析
  7. 2019年最好的前端进阶课,合同保障不过20w年薪全额退款!
  8. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
  9. 【Contact】结构体+动态内存管理+文件存储实现简易通讯录代码
  10. Trouble Shooting记录:服务 Microsoft Exchange Information Store 意外停止
  11. Pytext支持分布式训练,Facebook AI基于PyTorch的NLP框架,简化部署流程
  12. 废话少说 分析java抽象类与接口的区别
  13. 光环PMP一模知识点解析
  14. 腾讯云服务器如何安装宝塔面板?
  15. PostgreSQL中with和without time zone两者有什么区别
  16. 计算机音乐桃源恋歌,GARNiDELiA《桃源恋歌》[FLAC/MP3-320K]
  17. 移动应用的黑盒测试(1)
  18. 【Android App】实战项目之仿拼多多的直播带货(附源码和演示 超详细必看)
  19. RuntimeError: Distributed package doesn‘t have NCCL built in
  20. IAR工程某些文件字体改不过来

热门文章

  1. jQuery过滤器:筛选jquery对象数组中的DOM对象
  2. anaconda损坏的卸载方式
  3. php新闻删除功能设计,PHP开发 新闻发布系统之新闻删除页面
  4. Android,提供视频开发测试地址(视频下载和视频播放所用)
  5. php web程序漏洞,各种web程序漏洞
  6. strcpy和strncpy的区别
  7. strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法
  8. 影响计算机速度的有哪些配件,影响电脑上网速度的重要因素有哪些?
  9. python爬取推特的详细教程_使用Selenium Python进行网页抓取[Twitter+Instagram]
  10. 浮点数的加减运算(阶码、尾数)