深入理解XGBoost

本文详细介绍了XGBoost的核心概念,包括XGBoost的原理推导,如目标函数的泰勒展开、决策树的生成细节,以及工程实现中的列块并行学习、缓存访问和“核外”块计算。同时,探讨了XGBoost的优缺点,例如精度提升、正则化和并行计算。此外,还提供了XGBoost的实例和调参指导,以及对XGBoost与GBDT的联系和区别分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的主要内容概览:
在这里插入图片描述

1. XGBoost简介

XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。XGBoost是大规模并行boosting tree的工具,它是目前最快最好的开源 boosting tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量的Kaggle选手选用XGBoost进行数据挖掘比赛,是各大数据科学比赛的必杀武器;在工业界大规模数据方面,XGBoost的分布式版本有广泛的可移植性,支持在Kubernetes、Hadoop、SGE、MPI、 Dask等各个分布式环境上运行,使得它可以很好地解决工业界大规模数据的问题。本文将从XGBoost的数学原理和工程实现上进行介绍,然后介绍XGBoost的优缺点,并在最后给出面试中经常遇到的关于XGBoost的问题。

2. XGBoost的原理推导

2.1 从目标函数开始,生成一棵树

XGBoost和GBDT两者都是boosting方法,除了工程实现、解决问题上的一些差异外,最大的不同就是目标函数的定义。因此,本文我们从目标函数开始探究XGBoost的基本原理。

2.1.1 学习第 t 棵树

XGBoost是由 k k k 个基模型组成的一个加法模型,假设我们第 t t t 次迭代要训练的树模型是 f t ( x ) f_{t}(x) ft(x) ,则有:
在这里插入图片描述

2.1.2 XGBoost的目标函数

损失函数可由预测值 y ^ i \hat{y}_{i} y^i 与真实值 y i y_{i} yi 进行表示:
L = ∑ i = 1 n l ( y i , y ^ i ) L = \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i})} L=i=1nl(yi,y^i)
其中, n n n 为样本的数量。

我们知道模型的预测精度由模型的偏差和方差共同决定,损失函数代表了模型的偏差,想要方差小则需要在目标函数中添加正则项,用于防止过拟合。所以目标函数由模型的损失函数 L L L 与抑制模型复杂度的正则项 Ω \Omega Ω 组成,目标函数的定义如下:
O b j = ∑ i = 1 n l ( y i , y ^ i ) + ∑ i = 1 t Ω ( f i ) Obj = \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i})} + \sum_{i=1}^{t}{\Omega(f_{i})} Obj=i=1nl(yi,y^i)+i=1tΩ(fi)
其中, ∑ i = 1 t Ω ( f i ) \sum_{i=1}^{t}{\Omega(f_{i})} i=1tΩ(fi) 是将全部 t t t 棵树的复杂度进行求和,添加到目标函数中作为正则化项,用于防止模型过度拟合。

由于XGBoost是boosting族中的算法,所以遵从前向分步加法,以第 t t t 步的模型为例,模型对第 i i i 个样本 x i x_{i} xi 的预测值为:
y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_{i}^{(t)} = \hat{y}_{i}^{(t-1)} + f_{t}(x_{i}) y^i(t)=y^i(t1)+ft(xi)
其中, y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t1) 是由第 t − 1 t-1 t1 步的模型给出的预测值,是已知常数, f t ( x i ) f_{t}(x_{i}) ft(xi) 是这次需要加入的新模型的预测值。此时,目标函数就可以写成:
O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t \begin{aligned} Obj^{(t)} &= \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i}^{(t)})} + \sum_{i=1}^{t}{\Omega(f_{i})} \\ & = \sum_{i=1}^{n}{l(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}))} + \sum_{i=1}^{t}{\Omega(f_{i})} \\ &=\sum_{i=1}^{n}{l(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}))} + \Omega(f_{t}) +constant \end{aligned} Obj(t)=i=1nl(yi,y^i(t))+i=1tΩ(fi)=i=1nl(yi,y^i(t1)+ft(xi))+i=1tΩ(fi)=i=1nl(yi,y^i(t1)+ft(xi))+Ω(ft)+constant
注意上式中,只有一个变量,那就是第 t t t 棵树 f t ( x i ) f_{t}(x_{i}) ft(xi) ,其余都是已知量或可通过已知量可以计算出来的。细心的同学可能会问,上式中的第二行到第三行是如何得到的呢?这里我们将正则化项进行拆分,由于前 t − 1 t-1 t1 棵树的结构已经确定,因此前 t − 1 t-1 t1 棵树的复杂度之和可以用一个常量表示,如下所示:
∑ i = 1 t Ω ( f i ) = Ω ( f t ) + ∑ i = 1 t − 1 Ω ( f i ) = Ω ( f t ) + c o n s t a n t \begin{aligned} \sum_{i=1}^{t}{\Omega(f_{i})} &=\Omega(f_{t}) + \sum_{i=1}^{t-1}{\Omega(f_{i})} \\ &= \Omega(f_{t}) + constant \end{aligned} i=1tΩ(fi)=Ω(ft)+i=1t1Ω(fi)=Ω(ft)+constant

2.1.3 泰勒公式展开

泰勒公式是将一个在 x = x 0 x=x_{0} x=x0 处具有 n n n 阶导数的函数 f ( x ) f(x) f(x) 利用关于 ( x − x 0 ) (x-x_{0}) (xx0) n n n 次多项式来逼近函数的方法。若函数 f ( x ) f(x) f(x) 在包含 x 0 x_{0} x0 的某个闭区间 [ a , b ] [a,b] [a,b] 上具有 n n n 阶导数,且在开区间 ( a , b ) (a,b) (a,b) 上具有 n + 1 n+1 n+1 阶导数,则对闭区间 [ a , b ] [a,b] [a,b] 上任意一点 x x x 有:
f ( x ) = ∑ i = 0 n f ( i ) ( x 0 ) i ! ( x − x 0 ) i + R n ( x ) f(x) = \sum_{i=0}^{n}{\frac{f^{(i)}(x_{0})}{i!}}(x-x_{0})^{i}+R_{n}(x) f(x)=i=0ni!f(i)(x0)(xx0)i+Rn(x)
其中的多项式称为函数在 x 0 x_{0} x0 处的泰勒展开式, R n ( x ) R_{n}(x) Rn(x) 是泰勒公式的余项且是 ( x − x 0 ) n (x-x_{0})^{n} (xx0)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值