XGBoost: A Scalable Tree Boosting System

本文深入解析了XGBoost的设计原理和优化技术,包括目标函数、稀疏数据处理、近似算法、系统设计等。文章介绍了如何通过优化算法减少过拟合,如缩减和列采样,并探讨了缓存感知访问和外存计算策略,以应对大规模数据处理挑战。

系统设计那里不是很明白。

ABSTRACT

提出xgboost,一个端到端的梯度提升算法的实现。具有如下特点:
1.提出稀疏感知算法来处理稀疏数据
2.加权分位点概要算法进行近似
3.在缓存命中模式、数据压缩和分片上的创新

目标函数

在这里插入图片描述
第一部分是损失函数,用来拟合label,第二部分是正则项,用来防止过拟合。

去掉正则项之后,目标函数就是传统的GBDT。

GBDT 算法通过加性学习,每轮迭代学习一棵CART树来优化损失函数,并将新的树加入到模型中。
在这里插入图片描述
对该损失函数进行泰勒二阶展开,如下
在这里插入图片描述
其中,一阶梯度和二阶梯度如下:
在这里插入图片描述
在这里插入图片描述

去掉常数项,损失函数变成如下形式:
在这里插入图片描述
将上式由样本维度改写成叶节点维度:
在这里插入图片描述

在这里插入图片描述
表示叶子节点j上的样本集合。

假设树模型结构固定,那么每个叶子节点的最优权重为:
在这里插入图片描述
并求得此时的最优损失函数:
在这里插入图片描述
文中给出了最优损失函数的计算的一个示例:
在这里插入图片描述
每个样本计算一阶和二阶梯度,得到树结构之后即可计算最优损失函数。

由于树结构不可能都遍历一遍,文中使用贪心算法,从根节点开始每次迭代都加入一个分支。并使用如下公式评估候选切分点

在这里插入图片描述
即切分前的损失函数减去切分后左右子节点的损失函数之和,即使用该切分点划分后损失函数的降幅。

缩减和列采样

这两个方法也是用来防止过拟合的。

缩减(shrinkage)类似学习率,减小单个tree的影响。

列采样是随机森林的做法。 文中提到,列采样比行采样更能防止过拟合。

切分点查找算法

精确贪心算法

在这里插入图片描述
k表示特征。
该算法遍历每个特征的每个可能的切分点。
在遍历前需要对样本的特征值进行排序。
复杂度为m∗n∗log(n)m*n*log(n)mnlog(n)

近似算法

精确算法在数据无法全部放入内存和分布式环境下 效率都比较低,为此有了如下的近似算法。

即,首先在查找候选切分点之前计算每个特征的分位点,分为全部模式和局部模式。
然后,在查找切分点时将连续特征分到对应的特征分桶(分桶即使用上面的分位点进行切分的)中,然后聚合每个分桶中的统计值(一阶梯度和二阶梯度)算出最优的切分点(分位点)。
在这里插入图片描述
sk,vs_k,vsk,v表示特征k的第v个分位点。

前面提到,有两个模式,一个是全局模式。该模式在初始化阶段就算出所有特征的分位点。然后后面在所有分裂的地方都使用这些分位点。
局部模式,或者叫本地模式。即在每次分裂的时候都再算一遍分位点。明显全局模式需要的计算更少,但是需要更多的分位点来保证选出来的切分点是比较精确的。 后面也有实验证明,全局模式在分位点足够多时可以达到和本地模式一样的效果。
在这里插入图片描述
xgboost 支持单机模式下的精确查找和所有场景(分布式、单机和单机数据无法放入内存?)下的近似查找。

加权分位点概要算法

顾名思义,这个算法不是简单的分位点作为候选切分点,而是使用了权重。这个权重就是样本的二阶梯度。
使用二阶梯度的原因后面说。
先说下使用二阶梯度计算分位点的逻辑:
在这里插入图片描述
上式表示第k个特征值小于z时 使用二阶梯度作为权重时的带权分位点。
在这里插入图片描述
表示样本的第k个特征和对应的二阶梯度。
根据上式,带权分位点满足如下条件:
在这里插入图片描述

ϵ\epsilon

<think>我们正在回答关于B+Tree索引优点的问题。根据引用内容,我们知道B+Tree索引是MySQL等数据库系统中常用的索引结构。与Hash索引、二叉搜索树(如红黑树)相比,B+Tree具有显著优势。下面我将结合引用内容,详细说明B+Tree索引的优点。 ### 1. **树高度可控,适合磁盘存储** - B+Tree是一种多路平衡搜索树(引用[2]中提到),每个节点可以有多个子节点(通常为几百个)。这相比于二叉搜索树(每个节点最多两个子节点)大大降低了树的高度。 - 例如,对于千万级别的数据量,B+Tree的高度通常维持在3-5层(引用[2]),而红黑树的高度可能达到几十层。树高度低意味着磁盘I/O次数少(因为每次访问节点可能对应一次磁盘读取),这对数据库性能至关重要。 - 数学表达:设B+Tree的阶数为$m$(即每个节点最多$m$个子节点),则树高$h$与数据量$N$的关系为: $$ h \approx \log_m N $$ 当$m$较大时,$h$远小于二叉树的$O(\log_2 N)$。 ### 2. **范围查询高效** - B+Tree的数据全部存储在叶子节点,且叶子节点间通过指针连接成有序链表(引用[2])。这使得范围查询(如`WHERE id BETWEEN 100 AND 200`)非常高效:只需定位到起始值,然后顺序遍历链表即可。 - 相比之下,Hash索引仅支持等值查询(引用[1][3]),无法高效处理范围查询;二叉搜索树虽有序,但范围查询需要多次回溯父节点,效率较低。 ### 3. **数据有序性,避免全表扫描** - B+Tree索引本身是排序的(引用[2]),因此对于排序操作(`ORDER BY`)、分组操作(`GROUP BY`)以及最值查询(`MAX/MIN`)可以直接利用索引的有序性,避免全表扫描。 - 例如,查询最大值时,只需遍历最右侧叶子节点链表的末尾。 ### 4. **减少磁盘I/O,提高缓存命中率** - B+Tree的非叶子节点仅存储键值(不存储实际数据),因此单个节点可容纳更多键值(引用[2])。这使得非叶子节点可以缓存到内存中,减少磁盘访问。 - 实际数据(或数据指针)仅存在于叶子节点,保证了查询路径长度一致(稳定性能)。 ### 5. **自适应Hash优化(InnoDB特性)** - InnoDB存储引擎在特定条件下会自动将频繁访问的B+Tree索引转换为Hash索引(引用[3]),结合了Hash的等值查询速度和B+Tree的范围查询优势。 ### 6. **对比其他索引的劣势** - **Hash索引**: - 优点:等值查询$O(1)$复杂度(引用[1])。 - 缺点:不支持范围查询、排序;哈希冲突影响性能;内存需求高(引用[3])。 - **二叉平衡树(如红黑树)**: - 优点:查询单个值$O(\log N)$。 - 缺点:树高较大(尤其海量数据时),导致磁盘I/O多;范围查询效率低于B+Tree(引用[2])。 ### 总结 B+Tree索引的核心优势在于**低树高**(减少磁盘I/O)、**有序性**(高效范围查询)和**结构优化**(非叶子节点仅存键值)。这些特性使其成为数据库索引的标准选择。实际应用中,InnoDB的自适应Hash功能进一步提升了高频等值查询的性能[^3]。 §§相关问题§§ 1. B+Tree索引的节点分裂与合并机制如何实现平衡? 2. 在什么场景下应优先选择Hash索引而非B+Tree? 3. InnoDB的自适应Hash索引是如何工作的? 4. 如何通过B+Tree索引优化SQL查询性能? 5. B+Tree索引的页大小对性能有何影响? [^1]: 索引是对数据库表中一列或多列的值进行处理后的一种结构,使用索引可快速访问数据库表中的特定信息。本文主要对Hash索引和B+tree索引的区别做说明。 [^2]: B+树是B-树的加强版,是一种多路平衡搜索树,既然它是多路平衡的,那么就不在像红黑树那样只有2个子节点了,既然有多个子节点,树的高度就可以控制了。 [^3]: 在MySQL中,支持hash索引的是Memory存储引擎。而InnoDB中具有自适应hash功能,hash索引是InnoDB存储引擎根据B+Tree索引在指定条件下自动构建的。</think>### B+Tree索引的核心优势详解 B+Tree索引是数据库系统的核心数据结构,相较于Hash索引、二叉搜索树等结构,其优势体现在以下关键维度: --- #### 1. **树高度可控,减少磁盘I/O** - **多路平衡设计**: B+Tree每个节点可存储多个键值(通常数百个),形成**多路平衡树**。设阶数为$m$,树高$h$与数据量$N$满足: $$ h \approx \log_m N $$ 例如:$m=500$时,10亿数据仅需$h=4$层,而二叉树需$\log_2 N \approx 30$层。 - **磁盘优化**: 数据库以页(通常4KB)为单位读写磁盘。B+Tree节点大小匹配磁盘页,**单次I/O可加载大量键值**,显著减少磁盘访问次数[^2]。 --- #### 2. **高效范围查询** - **叶子节点链表结构**: B+Tree所有数据存储在叶子节点,并通过指针**双向链接**(如图示)。 ```mermaid graph LR A[根节点] --> B[内部节点] A --> C[内部节点] B --> D[叶子节点 10→20→30] B --> E[叶子节点 40→50] D -->|指针| E ``` 范围查询(如`WHERE id BETWEEN 30 AND 50`)只需定位起始叶子节点,沿链表遍历即可[^2]。 - **对比劣势**: - **Hash索引**:仅支持等值查询,无法处理范围扫描[^1]。 - **二叉树**:范围查询需回溯父节点,效率低下。 --- #### 3. **查询性能稳定** - **路径等长特性**: B+Tree所有叶子节点位于同一深度,**任何查询的I/O次数恒等于树高$h$**。 - **对比红黑树**: 红黑树高度不平衡(最深路径可达最短路径2倍),查询性能波动大[^2]。 --- #### 4. **高缓存命中率** - **非叶节点纯索引**: 非叶子节点仅存储键值和子节点指针(**不存实际数据**),使得: - 单节点可容纳更多键值 - 高频访问的根/非叶节点**常驻内存**,减少磁盘访问[^2]。 - **数据局部性**: 叶子节点存储连续数据,顺序访问时**预读机制**可批量加载相邻数据。 --- #### 5. **自适应优化能力(InnoDB)** - **动态Hash转换**: InnoDB监测高频等值查询时,**自动构建自适应Hash索引**,将B+Tree键值映射到Hash表,实现$O(1)$查询[^3]。 - **混合优势**: 保留B+Tree范围查询能力,同时获得Hash的等值查询速度。 --- #### 6. **对比其他索引的劣势总结** | 索引类型 | 等值查询 | 范围查询 | 树高控制 | 磁盘I/O优化 | |----------------|----------|----------|----------|-------------| | **B+Tree** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | **Hash** | ⭐⭐⭐⭐⭐ | ❌ | - | ⭐⭐ | | **红黑树** | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐ | | **二叉搜索树** | ⭐⭐⭐ | ⭐ | ❌ | ❌ | > ⭐:优势等级(5星最优);❌:不支持/弱项 --- ### 总结 B+Tree的核心优势在于:**多路平衡控制树高**(减少I/O)、**叶子链表支持高效范围扫描**、**稳定查询路径**及**缓存友好设计**。结合InnoDB的自适应Hash,成为数据库索引的黄金标准。实际应用中,B+Tree在范围查询占比高的场景(如日志分析、时间序列数据)优势尤为显著[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值