机器学习之理解xgboost模型
xgboost是boosting算法的一种,其主要思想就是基于弱分类器集成在一起形成强分类器。训练时从一棵树开始直到k棵树,而最终预测的结果是:yi^=Ø(xi)=∑k=1Kfk(xi),fk∈ϝ\hat{y_i}=\text{\O}(x_i)=\sum_{k=1}^{K}f_k(x_i), f_k \in \digammayi^=Ø(xi)=k=1∑Kfk(xi),fk∈ϝ其中ϝ=
xgboost是boosting算法的一种,其主要思想就是基于弱分类器集成在一起形成强分类器。训练时从一棵树开始直到k棵树,而最终预测的结果是:
yi^=Ø(xi)=∑k=1Kfk(xi),fk∈ϝ\hat{y_i}=\text{\O}(x_i)=\sum_{k=1}^{K}f_k(x_i), f_k \in \digammayi^=Ø(xi)=k=1∑Kfk(xi),fk∈ϝ
其中 ϝ={f(x)=wq(x)}(q:Rm→T,w∈RT)\digamma=\{ f(x)=w_{q(x)}\}(q:\R^m\to T,w \in \R^T)ϝ={f(x)=wq(x)}(q:Rm→T,w∈RT) 是CART。如下图训练两棵树老人和小孩的预测结果计算。
CART假设决策树是一棵二叉树,内部节点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。CART算法分两步:
1、决策树生成:递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树;
回归树生成:假设X与Y分别为输入和输出变量,并且Y是连续变量,给定训练集D={(x1,y1),(x2,y2),...,(xN,yN)}D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}D={(x1,y1),(x2,y2),...,(xN,yN)},将输入空间(特征空间)划分为M个单元R1,R2,...,RMR_1,R_2,...,R_MR1,R2,...,RM,并且在每个单元RmR_mRm上有一个固定的输出值cmc_mcm,于是回归树模型可表示为:f(x)=∑m=1McmI(x∈Rm)f(x)=\sum_{m=1}^{M}c_mI(x\in R_m)f(x)=m=1∑McmI(x∈Rm)当输入空间的划分确定时,可以用平方误差∑xi∈Rm(yi−f(xi))2\sum_{x_i\in R_m}(y_i-f(x_i))^2∑xi∈Rm(yi−f(xi))2来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。而单元RmR_mRm上的cmc_mcm的最优值c^m\hat{c}_mc^m是RmR_mRm上的所有输入实例xix_ixi对应的输出yiy_iyi的均值,c^m=1N∑xi∈Rmyi,x∈Rm,m=1,2,...\hat{c}_m=\frac{1}{N}\sum_{x_i\in R_m}y_i, x \in R_m, m=1,2,...c^m=N1∑xi∈Rmyi,x∈Rm,m=1,2,...。这里划分输入空间(特征空间)采用的启发式方法,选择第jjj个变量x(j)x^{(j)}x(j)和它的取值sss,作为切分变量和切分点,并定义两个区域:R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s}R_1(j,s)=\{x|x^{j}\le s\} 和 R_2(j,s)=\{x|x^{j}> s\}R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s}然后寻找最优切分变量j和最优切分点s,具体地,求解minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]\min_{j,s}[\min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i-c_1)^2 + \min_{c_2}\sum_{x_i \in R_2(j,s)}(y_i-c_2)^2]j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]对固定输入变量jjj可以找到最优切分点sss。遍历所有的输入变量,找到最优的切分变量jjj,构成一个(j,s)(j,s)(j,s)对。
算法描述:
输入:训练数据集D;
输出:回归树f(x)
在训练集所在的输入空间中,递归地将每个区域划分为两个子区域并决定子区域上的输出值,构建二叉决策树:
(1). 选择最优切分变量j与切分点s,求解:minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]\min_{j,s}[\min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i-c_1)^2 + \min_{c_2}\sum_{x_i \in R_2(j,s)}(y_i-c_2)^2]j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]遍历遍历jjj,对固定的切分变量jjj扫描切分点sss,选择使上式达到最小值的(j,s)(j,s)(j,s)对。
(2). 用选定的(j,s)(j,s)(j,s)对划分区域并决定相应的输出值:R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s}R_1(j,s)=\{x|x^{j}\le s\} 和 R_2(j,s)=\{x|x^{j}> s\}R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s}c^m=1N∑xi∈Rmyi,x∈Rm,m=1,2,...\hat{c}_m=\frac{1}{N}\sum_{x_i\in R_m}y_i, x \in R_m, m=1,2,...c^m=N1xi∈Rm∑yi,x∈Rm,m=1,2,...
(3). 继续对两个子区域调用(1)(2),直至满足停止条件。
(4). 将输入空间划分MMM个区域R1,R2,...,RMR_1,R_2,...,R_MR1,R2,...,RM,生成决策树:f(x)=∑m=1McmI(x∈Rm)f(x)=\sum_{m=1}^{M}c_mI(x\in R_m)f(x)=m=1∑McmI(x∈Rm)
分类树生成:使用基尼指数选择最优特征,同时决定该特征的最优二值切分点。分类问题中,假设有K个类,样本点属于第k类的概率为,则概率分布的基尼指数定义为:Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2对于二分类问题,若样本点属于第1个类的概率是ppp,则概率分布的基尼指数为Gini(p)=p(1−p)Gini(p)=p(1-p)Gini(p)=p(1−p)。对于给定的样本集合DDD,其基尼指数为Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2Gini(D)=1−∑k=1K(∣D∣∣Ck∣)2,其中CkC_kCk是DDD中属于第kkk类的样本子集,KKK是类的个数。如果样本集合DDD根据特征AAA是否取某一可能值aaa被分割成和两部分,即:D1={(x,y)∈D∣A(x)=a},D2=D−D1D_1=\{(x,y) \in D|A(x)=a\},D_2=D-D_1D1={(x,y)∈D∣A(x)=a},D2=D−D1则特征AAA的条件下,集合DDD的基尼指数定义为:Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)基尼指数Gini(D)Gini(D)Gini(D)表示集合DDD的不确定性,基尼指数Gini(D,A)Gini(D,A)Gini(D,A)表示经A=aA=aA=a分割后集合DDD的不确定性。基尼指数值越大,样本集合的不确定性越大。
算法描述:
输入:训练集D,停止算的条件
输出:CART决策树
根据训练集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树:
(1). 设节点的训练数据集为DDD,计算现有特征对该数据集的基尼指数。此时,对每一个特征AAA,对其可能取的每个值aaa,根据样本点对A=aA=aA=a的测试为“是”或“否”将DDD分割成D1D_1D1和D2D_2D2两部分,利用公式Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)计算A=aA=aA=a时的基尼指数。
(2). 在所有可能的特征AAA以及它们所有可能的切分点aaa中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
(3). 对两个子节点递归地调用(1)(2),直至满足停止条件。
(4). 生成CART决策树。
2、决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法有两步组成:1)从生成算法产生的决策树底端开始不断剪枝,直到的根节点,形成一个子树序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\}{T0,T1,...,Tn};2)通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
CART剪枝算法描述:
输入:CART算法生成的决策树T0T_0T0
输出:最优决策树TaT_aTa
(1). 设k=0,T=T0k=0,T=T_0k=0,T=T0
(2). 设a=+∞a = +\inftya=+∞
(3). 自上而下地对各内部节点ttt计算C(Tt)C(T_t)C(Tt),∣Tt∣|T_t|∣Tt∣以及g(t)=C(t)−C(Tt)∣Tt∣−1,a=min(a,g(t))g(t)=\frac{C(t)-C(T_t)}{|T_t|-1},a=\min(a,g(t))g(t)=∣Tt∣−1C(t)−C(Tt),a=min(a,g(t))这里,表示以ttt为根节点的子树,C(Tt)C(T_t)C(Tt)是对训练数据的预测误差,∣Tt∣|T_t|∣Tt∣是TtT_tTt的叶结点个数
(4). 自上而下地访问内部节点ttt,如果有g(t)=ag(t)=ag(t)=a,进行剪枝,并对叶结点ttt以多数表决法决定其类,得到树TTT
(5). 设k=k+1,ak=a,Tk=Tk=k+1,a_k=a,T_k=Tk=k+1,ak=a,Tk=T
(6). 如果T不是由根节点单独构成树,则回到步骤(4)
(7). 采用交叉验证法在子树序列T0,T1,...,TnT_0,T_1,...,T_nT0,T1,...,Tn中选取最优子树TaT_aTa。
XGBoost目标函数由预测值与真实值的误差和正则化项组成:L(ϕ)=∑i=1nℓ(yi,y^i)+∑k=1KΩ(fk)L(\phi)=\sum_{i=1}^n\ell(y_i,\hat{y}_i)+\sum_{k=1}^K\Omega(f_k)L(ϕ)=i=1∑nℓ(yi,y^i)+k=1∑KΩ(fk)其中正则化项表达式为Ω(f)=γT+12λ∣∣ω∣∣2\Omega(f)=\gamma T+\frac{1}{2}\lambda ||\omega||^2Ω(f)=γT+21λ∣∣ω∣∣2。TTT表示叶子节点的个数,ω\omegaω表示叶子节点的分数。γ\gammaγ可以控制叶子节点的个数,λ\lambdaλ可以制叶子节点的分数不会过大,防止过拟合。
如一开始所说,每新训练一棵树都要拟合上次预测的残差,即当生成ttt棵树后,预测分数可以表示为:y^i(t)=y^i(t−1)+ft(xi)\hat{y}_i^{(t)}=\hat{y}_i^{(t-1)}+f_t(x_i)y^i(t)=y^i(t−1)+ft(xi),此表达式是xgboost的训练梯度提升树的解决方案。则目标函数可以表示为L(ϕ)(t)=∑i=1nℓ(yi,y^i(t−1)+ft(xi))+∑k=1KΩ(fk)L(\phi)^{(t)}=\sum_{i=1}^n\ell(y_i,\hat{y}_i^{(t-1)}+f_t(x_i))+\sum_{k=1}^K\Omega(f_k)L(ϕ)(t)=∑i=1nℓ(yi,y^i(t−1)+ft(xi))+∑k=1KΩ(fk),此时需要找到一个ftf_tft能够最小化目标函数。这里XGBoost利用ft=0f_t=0ft=0处的泰勒二阶展开的方法求解目标函数。如下图是梯度提升树的训练过程。每增加一棵树都比上一次更加准确。因为每训练一棵树都会对数据集中预测不准确的样本进行权重标记,增加下一轮训练采样的几率(shrinkage subsampling)。
在决策树生成时xgboost在CART算法基础上做了一些改进,就是在寻找最优特征划分点时使用目标函数作为评价函数。在特征划分之前进行预排序,Weighted Quantile Sketch算法处理带权样本数据,Sparsity-aware Split Finding处理稀疏数据。
xgboost在系统设计时支持并行处理(Column Block for Parallel Learning
),在特征预排序时将数据加入内存单元;缓存的设置。
更多推荐
所有评论(0)