机器学习----Xgboost与GBDT

本文详细介绍了GBDT和XGBoost的工作原理与算法流程,深入探讨了GBDT的决策树模型及其在回归任务中的应用,同时解析了XGBoost在算法优化方面的独特之处。

GBDT

1、首先理解一下Gradient boosting(GB)

机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm(x)的效果生成的,关系如下:
1 ≤ m ≤ M F m + 1 ( x ) = F m ( x ) + h ( x ) 1 \le m \le M F_{m+1}(x) = F_m(x) + h(x) 1mMFm+1(x)=Fm(x)+h(x)

GB算法的思想很简单,关键是怎么生成 h ( x ) h(x) h(x)?

        ~~~~~~~        如果目标函数是回归问题的均方误差,很容易想到最理想的h(x)应该是能够完全拟合$y - F_m(x) , 这 就 是 常 说 基 于 残 差 的 学 习 。 残 差 学 习 在 回 归 问 题 中 可 以 很 好 的 使 用 , 但 是 为 了 一 般 性 ( 分 类 , 排 序 问 题 ) , 实 际 中 往 往 是 基 于 l o s s F u n c t i o n 在 函 数 空 间 的 的 负 梯 度 学 习 , 对 于 回 归 问 题 ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题 使lossFunction\frac{1}{2}(y - F(x))^2 残 差 和 负 梯 度 也 是 相 同 的 。 残差和负梯度也是相同的。 L(y, f) 中 的 f , 不 要 理 解 为 传 统 意 义 上 的 函 数 , 而 是 一 个 函 数 向 量 中的f,不要理解为传统意义上的函数,而是一个函数向量 f! f(x_1), \ldots, f(x_n)$,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为“伪残差”。

GB算法的步骤:

        ~~~~~~~         1.初始化模型为常数值:
     F 0 ( x ) = arg ⁡ min ⁡ γ ∑ i = 1 n L ( y i , γ ) . F_0(x) = \underset{\gamma}{\arg\min} \sum_{i=1}^n L(y_i, \gamma). F0(x)=γargmini=1nL(yi,γ).
        ~~~~~~~         2.迭代生成M个基学习器
               ~~~~~~~~~~~~~~                1.计算伪残差
    KaTeX parse error: Undefined control sequence: \mbox at position 97: …m-1}(x)} \quad \̲m̲b̲o̲x̲{for } i=1,\ldo…
               ~~~~~~~~~~~~~~                2.基于 { ( x i , r i m ) } i = 1 n \{(x_i, r_{im})\}_{i=1}^n {(xi,rim)}i=1n生成基学习器  ⁣ h m ( x ) \! h_m(x) hm(x)
               ~~~~~~~~~~~~~~                3.计算最优的  ⁣ γ m \! \gamma_m γm
       γ m = arg min ⁡ γ ∑ i = 1 n L ( y i , F m − 1 ( x i ) + γ h m ( x i ) ) . \gamma_m = \underset{\gamma}{\operatorname{arg\,min}} \sum_{i=1}^n L\left(y_i, F_{m-1}(x_i) + \gamma h_m(x_i)\right). γm=γargmini=1nL(yi,Fm1(xi)+γhm(xi)).
               ~~~~~~~~~~~~~~                4.更新模型
       F m ( x ) = F m − 1 ( x ) + γ m h m ( x ) . F_m(x) = F_{m-1}(x) + \gamma_m h_m(x). Fm(x)=Fm1(x)+γmhm(x).

2、GBDT

         ~~~~~~~~          GB算法中最典型的基学习器是决策树,尤其是CART,正如名字的含义,GBDT是GB和DT的结合。要注意的是这里的决策树是回归树,GBDT中的决策树是个弱模型,深度较小一般不会超过5,叶子节点的数量也不会超过10,对于生成的每棵决策树乘上比较小的缩减系数(学习率<0.1),有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。因此GBDT实际的核心问题变成怎么基于 { ( x i , r i m ) } i = 1 n \{(x_i, r_{im})\}_{i=1}^n {(xi,rim)}i=1n使用CART回归树生成  ⁣ h m ( x ) \! h_m(x) hm(x)

         ~~~~~~~~          CART分类树在很多书籍和资料中介绍比较多,但是再次强调GDBT中使用的是回归树。作为对比,先说分类树,我们知道CART是二叉树,CART分类树在每次分枝时,是穷举每一个feature的每一个阈值,根据GINI系数找到使不纯性降低最大的的feature以及其阀值,然后按照feature<=阈值,和feature>阈值分成的两个分枝,每个分支包含符合分支条件的样本。用同样方法继续分枝直到该分支下的所有样本都属于统一类别,或达到预设的终止条件,若最终叶子节点中的类别不唯一,则以多数人的类别作为该叶子节点的性别。回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是GINI系数,而是最小化均方差--即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

Xgboost

1、理解

• 回归树(也称为分类和回归树):
• 与决策树相同的决策规则
• 每个叶子值包含一个分数
这里写图片描述

•使用非常广泛,寻找GBM,随机森林…
•几乎一半的数据挖掘竞争都是通过使用一些来赢得的树集合方法的变体
•不变缩放输入,因此您不需要小心功能正常化。
•了解功能之间的高阶交互。
•可以扩展,并在工业中使用

•模型:假设我们有K树
想一想:回归树是一个将属性映射到分数的函数
● 参数
● 包括每棵树的结构,以及叶子中的分数或者只是使用函数作为参数
● 相反学习权重,我们正在学习函数(树)

•回归树集合定义了如何制作
预测分数,它可以用于
分类,回归,排名…
公式为:
y i ^ = ∑ j w j x x j \hat{y_i}=\sum_{j}w_jx_{xj} yi^=jwjxxj
•这一切都取决于您如何定义目标函数!
•到目前为止我们已经了解到:
使用平方损失:
l ( y i , y ^ i ) = ( y i − y ^ i ) 2 l(y_i, \hat{y}_i)=(y_i-\hat{y}_i)^2 l(yi,y^i)=(yiy^i)2
会导致普通梯度增强机器
使用物流损失:
l ( y i , y ^ i ) = y i l n ( 1 + e − y i ^ + ( 1 − y i ) l n ( 1 + e − y i ^ ) l(y_i, \hat{y}_i)=y_iln(1+e^{-\hat{y_i}}+(1-y_i)ln(1+e^{-\hat{y_i}}) l(yi,y^i)=yiln(1+eyi^+(1yi)ln(1+eyi^)

如何最优函数,即下面这个式子最小:
F ( x ⃗ ) = a r g m i n E x , y [ L ( y , F ( x ⃗ ) ) ] F(\vec{x})=argminE_{x,y}[L(y,F(\vec{x}))] F(x )=argminEx,y[L(y,F(x ))]
集成算法的表示:
y ^ = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}=\sum_{k=1}^{K}f_k(x_i),f_k\in F y^=k=1Kfk(xi),fkF

这里写图片描述
我们通过叶子中的分数向量和叶子索引来定义树,将实例映射到叶子的映射函数

f t ( x ) = w q ( x ) , w ∈ R T , q : R d → 1 , 2 , 3 , 4... T f_t(x)=w_{q(x)},w\in R^T,q:R^d\rightarrow {1,2,3,4...T} ft(x)=wq(x),wRT,q:Rd1,2,3,4...T

           ~~~~~~~~~~           这里写图片描述
将复杂性定义为(这不是唯一可能的定义)
Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega (f_t)=\gamma T+\frac{1}{2}\lambda \sum_{j=1}^{T}w_j^2 Ω(ft)=γT+21λj=1Twj2
γ是叶子的个数,后面用的是L2平方正则。
这里写图片描述

###2、算法
这里写图片描述

xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。

xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:

        ~~~~~~~         在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。

        ~~~~~~~         xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍

        ~~~~~~~         特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行

        ~~~~~~~         按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。

        ~~~~~~~         xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升框架的优化分布式计算机器学习算法。其核心原理在于通过迭代构建多个弱预测模型(通常是决策树),并不断减少模型偏差和方差,最终将这些弱模型组合成一个强预测模型。XGBoost在传统梯度提升决策树(GBDT)的基础上进行了多项改进,包括正则化项引入、支持自定义损失函数、对缺失值的处理以及利用二阶泰勒展开优化目标函数等[^1]。 ### 基本原理 XGBoost的核心思想是通过加法训练的方式逐步构建模型。在每一步中,新的树模型被训练以拟合当前模型的残差。具体来说,XGBoost的目标函数由两部分组成:一是衡量当前模型真实值之间的误差(损失函数),二是对模型复杂度的惩罚项(正则化项)。目标函数的形式可以表示为: $$ \text{Obj}(\theta) = \sum_{i=1}^{n} L(y_i, \hat{y}_i) + \sum_{k=1}^{K} \Omega(f_k) $$ 其中,$L$ 是损失函数,$\Omega$ 是正则化项,$f_k$ 表示第 $k$ 棵树的输出。为了优化这个目标函数,XGBoost采用了二阶泰勒展开的方法来近似损失函数,从而使得每次迭代中可以更精确地找到最优解。此外,XGBoost还引入了特征列采样机制,类似于随机森林中的做法,进一步提升了模型的泛化能力[^2]。 ### 算法细节 XGBoost的算法流程主要包括以下几个步骤: 1. 初始化模型,通常设置初始预测值为常数。 2. 对于每一次迭代,计算当前模型的残差。 3. 使用残差作为目标变量,训练一个新的决策树。 4. 将新训练得到的树加入到现有模型中,同时调整学习率以控制每棵树的影响。 5. 重复上述步骤直到达到预设的最大迭代次数或者满足提前停止条件。 在构建单棵树的过程中,XGBoost通过贪心算法选择最佳分裂点,即对于每个节点尝试分割后增益最大的特征及阈值。这种增益计算考虑到了一阶导数和二阶导数的信息,有助于找到更加精确的分裂位置。此外,XGBoost还实现了高效的内存管理和缓存优化技术,提高了大规模数据集上的运行效率[^1]。 ### 应用场景 XGBoost因其出色的性能和灵活性,在众多领域得到了广泛应用。例如,在金融行业,XGBoost可用于信用评分卡建模、欺诈检测等任务;在电商领域,它可以用来进行用户购买行为预测、点击率预估等工作;而在生物信息学中,则可能用于基因表达数据分析或蛋白质结构预测等问题。除此之外,XGBoost也是许多Kaggle竞赛获胜方案中的常见选择之一,尤其是在处理表格型数据时表现尤为突出。 ### 示例代码 以下是一个简单的XGBoost分类任务的Python实现示例: ```python import xgboost as xgb from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 转换为DMatrix格式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数 params = { 'objective': 'multi:softmax', 'num_class': 3, 'max_depth': 3, 'eta': 0.3, 'eval_metric': 'merror' } # 训练模型 model = xgb.train(params, dtrain, num_boost_round=20) # 预测 y_pred = model.predict(dtest) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") ``` 这段代码演示了如何使用XGBoost库来进行多类分类任务,其中包括了数据准备、模型训练、预测以及评估的基本流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值