[Machine Learning] XGBoost

本文深入介绍了XGBoost模型的工作原理,包括树的组合方式、每棵树的结构分枝及枝节点预测值的确定方法,并通过数学推导展示了如何优化这些参数。

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

1. XGBoost介绍

XGBoost模型即是一些“串联”树结构的组合,最终预测结果由多棵树共同决定。

模型公式:y=f(z)=Kk=1fk(z)y=f(z)=∑k=1Kfk(z)
模型预测:y^i=Kk=1f^k(xi)y^i=∑k=1Kf^k(xi)

类似模型预测,第tt步的估计可以表示为 y^i=k=1tf^k(xi)。如何有效的估计每棵树,且如何重组多棵树使得XGBoost成为如今竞赛的常胜将军?我们需要解决以下三个问题:

问题0:树的组合方式
问题1:每棵树的结构-分枝
问题2:每个枝节点的预测值

下面分别按步骤依次解决上面三个问题:

  1. 解决方案0:树的组合方式是“串联”,即每一个树是建立在前面所有树预测残差的基础上优化得到。所以后续树的结构和枝节点的预测值也将按照“并联”方式逐个估计。

  2. 解决方案2:常规的解决方案是先解决树的结构,再确定每个节点的估计值,但XGBoost的推导过程是先假设树的结构的基础上先估计每个节点预测值,进而完善树的结构。任何优化问题之前,损失函数的确定是重中之重。XGBoost采用的是惩罚式损失Obj=L+ΩObj=L+Ω,其中LL为损失函数,Ω为惩罚项。且惩罚函数为:Ω=γT+λTj=1ω2jΩ=γT+λ∑j=1Tωj2,其中TT是枝节点的个数,ωjjj枝上的得分。假设已得到t1棵树,我们来估计第tt棵树的结构和节点估计。首先将数据和估计带入损失函数得:

    Obj(t)=i=1n(yi,y^i(t1)+fi)+γT+λj=1Tωj2
    将以上损失函数部分进行二次Taylor展开得:

    Obj(t)i=1n((yi,y^(t1)i)+gifi+12hif2i)+γT+λj=1Tω2ji=1n(gifi+12hif2i)+γT+λj=1Tω2jj=1TiIj(gifi+12hif2i)+γT+λj=1Tω2j=j=1T((iIjgi)ωj+12(iIjhi)ω2j)+γT+λj=1Tω2j=j=1T((iIjgi)ωj+12(iIjhi+λ)ω2j)+γT=j=1T12(iIjhi+λ)(ω2j+2iIjgiiIjhi+λωj)+γT=j=1T12(iIjhi+λ)(ωj+iIjgiiIjhi+λ)212j=1T(iIjgi)2iIjhi+λ+γT=0(788)(789)Obj(t)∼∑i=1n(ℓ(yi,y^i(t−1))+gifi+12hifi2)+γT+λ∑j=1Tωj2∼∑i=1n(gifi+12hifi2)+γT+λ∑j=1Tωj2∼∑j=1T∑i∈Ij(gifi+12hifi2)+γT+λ∑j=1Tωj2=∑j=1T((∑i∈Ijgi)ωj+12(∑i∈Ijhi)ωj2)+γT+λ∑j=1Tωj2(788)=∑j=1T((∑i∈Ijgi)ωj+12(∑i∈Ijhi+λ)ωj2)+γT=∑j=1T12(∑i∈Ijhi+λ)(ωj2+2∑i∈Ijgi∑i∈Ijhi+λωj)+γT(789)=∑j=1T12(∑i∈Ijhi+λ)(ωj+∑i∈Ijgi∑i∈Ijhi+λ)2−12∑j=1T(∑i∈Ijgi)2∑i∈Ijhi+λ+γT=0

    其中gi=y(t1)(yi,y^(t1)i)gi=∂y(t−1)ℓ(yi,y^i(t−1))hi=2y(t1)(yi,y^(t1)i)hi=∂y(t−1)2ℓ(yi,y^i(t−1)),且IjIjjj个节点包含的数据指标集。将上面(84)式对ωj求导得
    dObj(t)dωj=iIjgi+(iIjhi+λ)ωj=0dObj(t)dωj=∑i∈Ijgi+(∑i∈Ijhi+λ)ωj=0
    或从上式(85)的二次函数重组可以得到
    ωj=iIjgiiIjhi+λωj∗=−∑i∈Ijgi∑i∈Ijhi+λ
    且此时的目标函数可表达为:
    Obj(t)=12j=1T(iIjgi)2iIjhi+λ+γT=12j=1T((iIjgi)2iIjhi+λ+γ)=12j=1T(GH+λ2γ)Obj(t)=−12∑j=1T(∑i∈Ijgi)2∑i∈Ijhi+λ+γT=−12∑j=1T((∑i∈Ijgi)2∑i∈Ijhi+λ+γ)=−12∑j=1T(GH+λ−2γ)
  3. 解决方案1:如何得到树的结构呢?关键是确定每棵树的节点变量和如何划分节点。首先方案是:a. 对于每个节点,遍历全部变量 b. 对于每个变量,将所有的观测进行排序并进行扫描式,得到最好的切分点。如何判定切分点的好坏呢?根据以上增加该切分点,目标函数得变化量:
    Δ=Obj(t)(Obg(t)L+Obj(t)R)=12(GLHL+λ+GRHR+λGH+λ)γΔ=Obj(t)−(ObgL(t)+ObjR(t))=12(GLHL+λ+GRHR+λ−GH+λ)−γ
    达到最大。

2. R简单实现

# Load packages
library(xgboost)

# Read data from xgboost package
data('agaricus.train', package = 'xgboost')
data('agaricus.test', package = 'xgboost')

tr <- agaricus.train
te <- agaricus.test

# Investigate data set
str(tr$data)   ## dgCMatrix: Sparse matrix class from package Matrix

# Train xgboost model
## Input features: dense or sparse matrix both are ok
## Target variable: numeric vector(0-n for classification and real values for regression)
## Objective: 'reg:linear' for regression or 'binary:logistic'
## Number of iteration: number of trees added to the model


cv.res <- xgb.cv(data = tr$data, nfold = 5, label = tr$label,
               nround = 10, objective = 'binary:logistic')     # Cross Validation 
cv.res <- xgb.cv(data = tr$data, nfold = 5, label = tr$label,
              nround = 10, objective = 'binary:logistic',
              eval_metric = 'auc')                             # Cross Validation

bst <- xgboost(data = tr$data, label = tr$label,
               nround = 2, objective = 'binary:logistic',
               eval_metric = 'auc')
pred <- predict(bst, te$data)
table(pred, te$label)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值