| 数据科学、数据分析、人工智能必备知识汇总-----机器学习-----主目录-----持续更新:https://blog.youkuaiyun.com/grd_java/article/details/144257225 |
|---|
XGBoost 是机器学习的算法,但不属于是深度学习(深度学习是机器学习子分支,XGBoost在这个子分支之外)。虽然现在深度学习取代了几乎所有传统机器学习算法,但是取代不了树模型,XGBoost就是树模型的一员。
目前所有的机器学习算法中,做有监督的回归或分类,XGBoost依旧是神器。处理图像和大语言模型深度学习自然是有先天优势,但是纯数值型的东西,XGBoost一类树模型算法效果更加好。
学习XGBoost的4个层次
一、知识回顾
1. 有监督机器学习概念
1.1 模型、参数和目标函数
| Notations 一些符号 |
|---|
x i ∈ R d x_i ∈ \R^d xi∈Rd:某条样本x,一定可以映射到d维的欧式空间中,例如d维空间的一个点
i:表示第i个训练样本
d:表示有d个维度
R d \R^d Rd:欧式空间
| Model 模型 |
|---|
当给定 x i x_i xi如何给定预测结果 y i ^ \hat{y_i} yi^
线性模型(Linear model): y i ^ = ∑ j w j x i j \hat{y_i}=\sum_j w_j x_{ij} yi^=∑jwjxij(包括线性/逻辑回归)。这个公式是线性回归的,为什么也可以称为逻辑回归呢?逻辑回归无非就是把线性回归的公式最终相加的结果做了非线性变换,本质上还是拟合的线性模型。
线性模型最重要的就是某条样本 x i x_i xi的纬度 j j j乘以对应维度的权重 w j w_j wj,最后将这个样本每个纬度 j j j的结果 w j x i j w_j x_{ij} wjxij加到一起,就得到了 y i ^ \hat{y_i} yi^
预测结果 y i ^ \hat{y_i} yi^可以拥有不同的解释
基于你做的任务
1. Linear regression 线性回归任务: y i ^ \hat{y_i} yi^就是你的预测值
2. Logistic regression 逻辑回归任务: 1 1 + exp ( − y i ^ ) \dfrac{1}{1+\exp(-\hat{y_i})} 1+exp(−yi^)1,就是将我们拟合出来的 y i ^ \hat{y_i} yi^代入SIGMOD函数预测出正例的概率值
3. 其它的… 例如 排序(比如推荐大模型), y i ^ \hat{y_i} yi^可以是排位分,分越高优先级越高。
| Parameters 参数 |
|---|
我们需要从数据中学习的东西(我们要从数据中找出规律,也就是一堆参数)
Linear model线性模型: θ = { w j ∣ j = 1 , ⋯ , d } \theta = \{w_ j | j = 1 , \cdots , d \} θ={wj∣j=1,⋯,d},就是找一组 θ \theta θ,找多少个就是看维度 d d d,几维的就找几个
| Objective Function 目标函数 |
|---|
在机器学习中,到处都是目标函数: O b j ( Θ ) = L ( Θ ) + Ω ( Θ ) Obj(\Theta)=L(\Theta) + \Omega(\Theta) Obj(Θ)=L(Θ)+Ω(Θ),目标函数=损失函数+正则函数。有人也经常将 O b j ( Θ ) Obj(\Theta) Obj(Θ)写成 T o t a l L o s s TotalLoss TotalLoss
L ( Θ ) L(\Theta) L(Θ):Training Loss 训练损失,评估我们模型拟合训练集的程度有多好
Ω ( Θ ) \Omega(\Theta) Ω(Θ):Regularization 正则(正则是提高模型泛化能力相关的),评估模型的复杂度
Loss on training data训练数据时的损失: L = ∑ i = 1 n l ( y i , y i ^ ) L = \sum_{i=1}^n l(y_i,\hat{y_i}) L=∑i=1nl(yi,yi^), l l l就是loss损失的缩写,loss一定是关于预测值 y i ^ \hat{y_i} yi^和真实值 y i y_i yi之间的损失,将每条样本的loss加起来就是最终所有训练样本的训练损失 L L L
Square loss 平方损失:一种常见的训练损失,数学语言的描述为 l ( y i , y i ^ ) = ( y i − y i ^ ) 2 l(y_i,\hat{y_i})=(y_i - \hat{y_i})^2 l(yi,yi^)=(yi−yi^)2
Logistic loss 逻辑损失: l ( y i , y i ^ ) = y i ln ( 1 + e − y ^ i ) + ( 1 − y i ) ln ( 1 + e y ^ i ) l(y_i,\hat{y_i})=y_i \ln{(1+e^{-\hat{y}_i})}+(1-y_i) \ln{(1+e^{\hat{y}_i})} l(yi,yi^)=yiln(1+e−y^i)+(1−yi)ln(1+ey^i),这里公式给出两部分,前面部分 y i ln ( 1 + e − y ^ i ) y_i \ln{(1+e^{-\hat{y}_i})} yiln(1+e−y^i)是关于正例的,后面 ( 1 − y i ) ln ( 1 + e y ^ i ) (1-y_i) \ln{(1+e^{\hat{y}_i})} (1−yi)ln(1+ey^i)是关于负例的,加起来就是二分类里面的交叉熵损失
Regularization:当前模型有多复杂
L2 norm(L2 正则项范数): Ω ( w ) = λ ∥ w ∥ 2 \Omega(w)=\lambda {\|w\|}^2 Ω(w)=λ∥w∥2,就是参数 w w w的平方加和,乘上正则项系数 λ \lambda λ。注意这里的范数是对向量w求模,也就是内积( λ ∥ w ∥ 2 \lambda {\|w\|}^2 λ∥w∥2相当于 λ ∑ w i 2 \lambda \sum w_i^2 λ∑wi2),不是p-范数,因为 ∥ w ∥ 2 {\|w\|}^2 ∥w∥2中的2是指数, ∥ w ∥ 2 {\|w\|}_2 ∥w∥2才是2-范数。
范数(norm)是数学中的一种基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即①非负性;②齐次性;③三角不等式。它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。
L1 norm(lasso): Ω ( w ) = λ ∥ w ∥ 1 \Omega(w)=\lambda{\|w\|}_1 Ω(w)=λ∥w∥1,就是w绝对值加和,乘上正则项系数 λ \lambda λ
| 结合上面几个已知概念观察下面综合的例子 |
|---|
Ridge regression岭回归: ∑ i = 1 n ( y i − w T x i ) 2 + λ ∥ w ∥ 2 \sum_{i=1}^n(y_i - w^Tx_i)^2+\lambda \|w\|^2 ∑i=1n(yi−wTxi)2+λ∥w∥2,好好学习上面的知识后,能够看出这个公式给出的是目标函数,或者说total loss
线性模型,平方损失(记住这玩意属于training loss 训练损失),L2正则项
Lasso: ∑ i = 1 n ( y I − w T x i ) 2 + λ ∥ w ∥ 1 \sum_{i=1}^n(y_I-w^Tx_i)^2+\lambda \|w\|_1 ∑i=1n(yI−wTxi)2+λ∥w∥1
线性模型,平方损失,L1正则项
Logistic regression 逻辑回归: ∑ i = 1 n [ y i ln ( 1 + e − w T x i ) + ( 1 − y i ) ln ( 1 + e w T x i ) ] + λ ∥ w ∥ 2 \sum_{i=1}^n [y_i \ln(1+e^{-w^Tx_i})+(1-y_i)\ln(1+e^{w^T x_i})]+\lambda \|w\|^2 ∑i=1n[yiln(1+e−wTxi)+(1−yi)ln(1+ewTxi)]+λ∥w∥2
线性模型,逻辑损失,L2正则项
明确模型、参数、目标函数是什么,将会给我们带来工程上的收益
回想我们通过SGD(随机梯度下降)实现岭回归,拉索回归和逻辑回归的时候,他们的实现是非常非常相似的。因为他们求的 θ \theta θ参数的数量都是 w 0 到 w n w_0到w_n w0到wn,初始化的时候都是n+1行,1列的,求梯度时也都是 y ^ − y \hat{y}-y y^−y,只是因为正则项的不同稍有不同
1.2 Objective and Bias Variance Trade-off
目标函数以及Bias偏差Variance方差的权衡(主要因为训练损失和正则项二者不可兼得,所以需要进行偏差和方差的权衡)
为什么我们想在目标函数中包含两个组成部分(训练损失、正则项)?
首先,优化的训练损失,有助于提高我们模型的预测性,和训练集样本的
偏差就越小拟合好训练集数据至少可以让你接近训练数据,接近训练数据的什么呢?期望接近这些训练数据的底层分布。
其次,优化正则项这一部分,会鼓励我们模型更加的简单,简单意味着通用,可以在各种场景有用武之地,也就是泛化能力更强。说白了就是让模型不要只在训练样本的准确率高,而是在未来通过全新数据进行预测时,也保证高的准确率。
更简单的模型会使得我们在未来预测过程中
方差更小,方差越小,我们预测的就越稳定(波动小)。
由下图可见,4张图从左到右,从上到下依次是低Bias偏差且低Variance方差,那么打靶就全是10环,也是我们最想要的(但往往无法实现)。然后是低偏差高方差,打靶时距离10环的偏差是小的,但是不稳定,经常打到9环合8环的10环附近的位置。然后是高偏差,低方差,打靶时,可能每次都无法命中10环,但是能稳定命中9环。然后是高偏差和高方差,就是个玩蛋玩意。
2. 回归树和集成学习
2.1 Regression Tree(CART)
regression tree(也称为classification and regression tree 分类与回归树,简称CART);经典的决策树算法
决策规则和决策树类似
每个叶子结点的值包含一个score分数
回顾GBDT,树结构方面,我们通过MSE作为分裂条件(决策规则),通过计算负梯度进行拟合,计算叶子结点分值方面,回归问题我们是求平均,二分类和多分类也有相应的公式来计算分值
而XGBoost也一样,我们的主要问题也是XGBoost的树结构是通过什么来进行拟合,还有叶子结点的分值如何计算
2.2 Regression Tree Ensemble
回归树集成在一起
上图例子中,训练了两棵小树,XGBoost和GBDT一样,也是Boosting思想,所以计算小男孩的分值,两棵树都需要代入,每棵树都会有一个分值,将所有分值加起来就是小男孩最终的分数
同理,老爷爷的分值也是先代入第一颗得到-1,第二棵得到0.9,最终得分-0.1
2.3 Tree Ensemble methods
集成"树"的方法,主要的4大优点
1. 非常广泛被使用的,比如GBM(Gradient Boosting Machine(梯度提升机),通过串行训练多个弱学习器(如决策树)逐步优化预测结果),随机森林等
常见的GBM实现库
XGBoost:优化了并行计算和稀疏数据处理,支持分布式训练。
LightGBM:基于直方图的决策树加速,适合大规模数据,支持类别特征。
CatBoost:自动处理类别特征,减少过拟合,适用于类别丰富的场景(如推荐系统)。
GBM vs. 其它方法
几乎一半的数据挖掘竞赛(data mining competition),由使用一些树集成算法的变体获胜
2. Invariant to scaling of inputs, so you do not need to do careful features normalization。对输入数据的尺度变化具有不变性,因此无需进行细致的特征归一化处理
Invariant to scaling of inputs
invariant:指模型对输入数据的缩放(如标准化、归一化等)不敏感,即数据尺度变化不会影响模型性能。
适用场景:常见于决策树、随机森林、梯度提升机(GBM)等树模型,因其分裂规则基于特征值的排序而非绝对值。
you do not need to do careful features normalization
特征归一化(feature normalization):指将不同量纲或分布的特征缩放到统一范围(如[0,1]或标准化为均值为0、方差为1),通常对线性模型(如SVM、逻辑回归)或神经网络至关重要。
不用特征归一化,不代表你不需要做特征工程,比如一些空值的处理,一些数据的离散化,文本变成数字等等
无需谨慎处理:树模型无需此步骤,因其天然适应不同尺度的特征。若使用线性回归或神经网络,则必须对特征进行归一化以加速收敛并提升性能。
3. Learn higher order interaction between features.学习/捕获特征间的高阶交互作用。
higher order interaction
高阶交互:指模型能够自动发现多个特征之间的复杂组合影响,例如:
二阶交互:特征 A 和特征 B 共同影响目标变量(如 A × B)。
三阶及以上交互:特征 A、B、C 三者间的联合效应。
典型应用:决策树类模型(如随机森林、GBM)通过树的分裂天然捕捉特征交互;神经网络通过隐藏层自动学习高阶非线性关系。
learn:此处强调模型通过数据驱动的方式自动发现特征间的复杂关系,而非人工设计特征组合。
4. Can be scalable, and are used in Industry.
Can be scalable
可扩展性:指算法或系统能高效处理大规模数据或高并发任务,例如通过分布式计算(如Spark、Hadoop)或优化计算效率(如并行训练)。这里指的是哪怕单颗决策树,对于计算分裂条件时,也可以并行去进行,例如一共50个分支,开多线程,一个线程计算10个
例如GBDT,虽然它本身是多个弱学习器(决策树)串行的,但是每棵决策树都可以并行的去训练。
典型技术:例如XGBoost、TensorFlow、PyTorch等支持分布式训练的框架。
used in Industry工业界应用:强调技术在实际生产环境中的成熟性和可靠性,例如互联网公司的推荐系统、金融风控、广告投放等场景。
2.4 Put into context: Model and parameters
基于树的集成学习,需要的模型和参数是什么
Model:假设我们有K棵树 f k x f_k{x} fkx,每一个 x i x_i xi对应的 y i ^ \hat{y_i} yi^都是由这K棵树集成来的(例如,求和)。也就是说,模型Model就是由 x i x_i xi得到我们的 y i ^ \hat{y_i} yi^中间到底做了什么。
y i ^ = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y_i}=\sum_{k=1}^K f_k(x_i),f_k ∈ \bold F yi^=∑k=1Kfk(xi),fk∈F, F \bold F F是包含全部回归树的函数空间,这里 y i ^ 其实就是 F ( x ) \hat{y_i}其实就是F(x) yi^其实就是F(x),只是符号用的不一样,不要被影响,公式不一定要每个字母都长得完全一样,所以要真正理解每个公式背后总结的含义,才不会被各种各样的符号所限制。
想一想,回归树是不就是一个将特征值x映射到score最终分值 y ^ \hat{y} y^的一个函数
Parameters:就是基于机器学习我们到达要求什么,我们想要什么东西。
包含每棵树的结构,以及每个叶子结点的score分数,这两个是必须要求得的东西
或者简单地像以前 θ \theta θ参数空间一样,用数学表达来表达函数空间, Θ = { f 1 , f 2 , ⋯ , f K } \Theta = \{f_1,f_2,\cdots,f_K\} Θ={f1,f2,⋯,fK},和线性回归等模型不一样的点在于,要求的参数 θ \theta θ,变成了一个个函数 f i f_i fi。因此需要求的东西变为了树的结构和叶子结点的分值。
不再是(参数空间求解最优化)在 R d \R^d Rd中学习权重weights(d维空间的w权重),而是学习函数functions(trees也就是一堆树结构弱学习,例如决策树)
2.5 例子:基于一个变量学习一棵树
我们如何学习函数?
定义objective目标函数(loss训练损失,regularization正则项),以及优化它!
例子:
考虑只有一个维度的一个简单的输入t (time)的回归树
我想预测我是否在时间t,喜欢浪漫氛围的音乐
根据MSE分裂指标我们学习到了上图中左边的树
这颗树等价于右边的二维坐标系,x轴为时间t,y轴为学习到的分数
可见在遇到女朋友之前的时间段,分数最低,遇到女朋友后,开始逐渐上升,分手后又逐渐下降,但是没有下降到遇到女朋友之前的分数
蓝色的小点是样本,也就是 x i 和 y i x_i和y_i xi和yi,而我们的树会对样本进行拟合,可见贯穿蓝色小点的黑色实线就是拟合结果( x i 和 y i ^ x_i和\hat{y_i} xi和yi^)
那么上图中两条竖线Splitting Positions,就是分裂条件
最终拟合出来的曲线是step function台阶状的曲线(就是The Height in each segment标注的那根,在每个分裂区间段内,高度是多高)
这个要好好理解,每个根据分裂条件分裂出来的区间段,拟合的是一条直线,分裂条件越多,越精细化。因此才能出现阶梯状的曲线。
总结:一个维度的回归树(strap functions)的Objective目标函数
Training Loss:function拟合目标的程度有多好呢?
Regularization:我们如何定义function的复杂度?
根据有多少个分裂条件来定义。根据每个区间中拟合直线的高度的L2范式(L2 正则项,L2 norm)来定义。为什么强调这个,主要因为GBDT中可没有正则项来防止过拟合。
2.6 通过目标函数Obj来达到准确率和复杂度的平衡
第一个图是我们要拟合的样本,是观察用户随着时间t对topic主题k的感兴趣程度
第二个图,Too many splits, Ω ( f ) \Omega(f) Ω(f) is high,太多的分裂条件,导致复杂度过高。这是不推荐的,因为很容易过拟合,导致样本数据拟合很好,但是实际使用中,通过新的数据(和样本数据有一定偏差)进行预测效果很差。
第三个图,Wrong split point, L ( f ) L(f) L(f) is high,错误的分裂条件位置,导致偏差(损失)过高,这也是不推荐的,容易欠拟合导致预测不准。
第四个图,Good balance of Ω ( f ) a n d L ( f ) \Omega(f)\space and \space L(f) Ω(f) and L(f),一个损失和复杂度很好的平衡的状态,可见曲线拟合的很好。既不过拟合,也不欠拟合。
上面是图形化的方式,虽然利于理解,但是终究不如数学语言描述的清晰且没有歧义。让我们再次回顾到集成树的目标函数。
Model: assuming we have K trees假设我们有K棵树
y i ^ = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y_i}=\sum_{k=1}^K f_k(x_i),f_k ∈ F yi^=∑k=1Kfk(xi),fk∈F
Objective: O b j = ∑ i = 1 n l ( y i , y i ^ ) + ∑ k = 1 K Ω ( f k ) Obj = \sum_{i=1}^n l(y_i,\hat{y_i})+\sum_{k=1}^K \Omega(f_k) Obj=∑i=1nl(yi,yi^)+∑k=1KΩ(fk)
定义 Ω \Omega Ω有哪些方法呢?
树中有多少个node结点,树的深度。也就是说想要复杂度低一些,那么能不能不明显影响效果的情况下,将树的叶子结点变少,深度变小。对应的分裂条件就越少。
叶子权重(叶子结点的分值)的L2 norm
… detailed later(之后会更详细的介绍)
2.7 Regression Tree 并不仅仅只能用于回归问题
回归树的集成学习定义了你如何做预测的score分值,它可以被用于
Classification 分类问题,Regression 回归问题,Ranking排序 …
它们全部都依赖于你如何定义Obj目标函数
目前为止我们复习了:
使用 Square loss 平方损失 l ( y i , y i ^ ) = ( y i − y i ^ ) 2 l(y_i,\hat{y_i})=(y_i - \hat{y_i})^2 l(yi,yi^)=(yi−yi^)2,进行加和后求平均就是MSE。也就是我们要做回归任务时使用。
在通用的梯度提升机器学习(gradient boosted machine)中的更好的结果
使用 Logistic loss 逻辑损失 l ( y i , y i ^ ) = y i ln ( 1 + e − y i ^ ) + ( 1 − y i ) ln ( 1 + e y i ^ ) l(y_i,\hat{y_i})=y_i \ln(1+e^{-\hat{y_i}})+(1-y_i)\ln(1+e^{\hat{y_i}}) l(yi,yi^)=yiln(1+e−yi^)+(1−yi)ln(1+eyi^),就是二分类交叉熵,用于二分类任务时使用。
在LogitBoost中有更好的结果
而无论是回归还是分类任务,我们使用的BaseModel基学习器,都可以使用回归树。
2.8 Objective目标式 vs. Heuristic启发式
当我们讨论(decision) trees时,通常指的是Heuristic启发式的
由information gain信息增益(一种分裂指标,算法.二分类是二分类交叉熵,多分类是多分类交叉熵)来进行分裂
Prune the tree剪枝,防止过拟合的手段,有前剪枝,后剪枝,通过一些算法,例如CCP剪枝算法(Cost-Complexity Pruning)
注意这里决策树的剪枝,是不包含正则项的。这也是学习XGBoost要强调的,我们想要将启发式构建为目标式,就需要将剪枝包含在目标函数中,那么自然就是包含正则项喽。
Maximum depth 树的最大深度,可以做到前剪枝,但是这个超参数并不好把握。所以是不是也可以做到正则项中,现在树的生长,相当于抑制函数空间的范围。
Smooth the leaf values 对叶子结点的值进行平滑,说白了就是变小一点,这一点在决策树中是没有去做的,但是XGBoost要不要去做呢?
很多heuristics启发式的maps映射的效果也不错,和objectives目标式的效果差不多,但是如果是目标式的,可以更加直观的了解到我们学习到的是什么东西(taking the formal(objective) view let us know what we are learning 通过obj公式来直观看到我们学的是啥。)。接下来是上面介绍的启发式的4点对应到目标式。
information gain信息增益(Gini系数) → \rightarrow →training loss训练损失
Pruning 剪枝 → \rightarrow → regularization defined by # nodes 通过结点定义的正则项,就是通过正则来达到剪枝的效果,缩减了结点数量。
Max depth 最大深度 → \rightarrow → constraint on the function space 在函数空间上进行限制
Smooth the leaf values 对叶子结点的值进行平滑 → \rightarrow → L2 regularization on leaf weights 在叶子权重上的L2 正则项(就是对叶子结点的score进行正则)
2.9 总结(需要记住的东西)
Bias-variance tradeoff is everywhere偏差-方差权衡无处不在
The loss + regularization objective pattern applies for regression tree learning(function learning)损失+正则化目标模式适用于回归树学习(函数学习)
We want predictive and simple functions我们想要具有预测性(偏差适当)并且简单(方差适当)的函数
This defines what we want to learn(objective, model)这也定义了我们想要学习的内容(目标函数、模型。有了目标函数就知道了怎么学,有了相关算法模型才知道怎么用)
How do we learn? 我们如何去学呢?——Gradient Boosting 梯度提升
二、梯度提升(How do we learn)
| 由于篇幅限制,将其放在这篇文章中:https://blog.youkuaiyun.com/grd_java/article/details/148305728 |
|---|
三、XGBoost安装,实战总结,与超参数列表
| 由于篇幅限制,将其放在这篇文章中:https://blog.youkuaiyun.com/grd_java/article/details/155234151 |
|---|












被折叠的 条评论
为什么被折叠?



