从DT到GBDT
2022-01-06

 

算法架构

模型架构

名词解释:

预备知识

信息量

对某个事件发生概率的度量。一般情况下,概率越低,则事件包含的信息量越大。衡量事件信息量的公式如下:

(1)I=log1p=logp

熵(Entropy

熵是随机变量不确定性的度量。

设X是一个取值个数为n的离散随机变量,其概率分布为:

(2)P(X=xi)=pi,i=1,2,...,n

则随机变量X的熵定义为:

(3)H(X)=i=1npilogpi

熵越大,随机变量取值的不确定性越大,反之越小。当随机变量的分布为均匀分布时,该随机变量的熵最大。下图为二分类时熵与概率的变化曲线,可以看出,当P(X=1)=0.5时,H(X)最大。

二元信息熵

条件熵

表示在已知随机变量X的条件下随机变量Y的不确定性。

设随机变量(X,Y),其联合概率分布为:

(4)P(X,Y)=pij(i=1,2,...,n;j=1,2,...,m)

给定随机变量X的条件下随机变量Y的条件熵为H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:

(5)H(Y|X)=piH(Y|X=xi)pi=P(X=xi),i=1,2,3,...,n

 

信息增益

表示得知特征X的信息从而使得类Y的信息的不确定性减少的程度。

特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即

(6)g(D,A)=H(D)H(D|A)

特征A的取值越多,g(D,A)越大,反之越小。

信息增益比

特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)训练数据集D关于特征A的值的熵HA(D)之比,即:

(7)gR(D,A)=g(D,A)HA(D)
(8)HA(D)=i=1n|Di||D|log2|Di||D|nA

特征A的取值越多,gR(D,A)越小,反之越大。

基尼指数

分类问题中,假设有K个类,样本点属于第k类的概率为pk,则概率分布的基尼指数定义为:

(9)Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

对于给定的样本集合D,其基尼指数为:

(10)Gini(D)=1k=1K(|Ck||D|)2CkDkK

如果样本集合D根据特征A是否取某一可能值a被分割成D1和D2两部分,即:

(11)D1={(x,y)D|A(x)=a}D2=DD1

则在特征A是否取a的条件下,集合D的基尼指数定义为:

(12)Gini(D,A)=|D1||D|Gini(D1)+|D2||D|Gini(D2)

Gini(D)表示集合D的不确定性,Gini(D,A)表示将A=a分割后集合D的不确定性。

基尼指数越大,样本集合的不确定性(不纯度)越大,与熵类似。

下式表明基尼指数为熵的一阶泰勒近似值:

(13)f(x)=lnxx=1f(x)=f(x0)+f(xx0)+o()=f(1)+f(1)(x1)+o()1x
X:(14)H(X)=i=1npi(logpi)i=1npi(1pi)=Gini(p)

自助法

自助法(bootstrapping)是一种数据采样方法,过程如下:

给定包含m个样本的数据集D,采用有放回的方法,每次从D中挑选一个样本放入D,执行m次后,生成一个包含m个样本的数据集D。根据计算,初始数据集D中约36.8%的样本未出现在数据集D中,因此,可以将D作为训练集,DD用作测试集。

将上述过程重复N次,便可以得到N个采样后的样本集。

bootstrapping

Bias-Variance Trade-off

符号含义
x测试样本
D数据集
yx的真实标记
yDx在数据集中的标记
f(x;D)基于数据集D上学到的模型fx上的预测输出
f¯(x)不同f(x;D)x的期望预测输出
ε数据集中标记的噪声,等于yyD

符号图形化展示如下:

bias_and_variance_desc

(16)E(ε)=E(yyD)=0Var(ε)=Var(yyD)2=E(yyD)2(E(yyD))2=E(yyD)2

噪声用于刻画学习问题本身的难度。

(17)Var(x)=E[(f(x;D)f¯)2]

方差用于刻画数据扰动对模型的影响,即不同训练数据集训练出的不同模型对同一个待预测x的预测结果的离散程度。

(18)bias2(x)=(f¯y)2

偏差用于刻画学习算法本身的拟合能力。

(19)E(f;D)=E[(f(x;D)yD)2]=E[(f(x;D)f¯+f¯yD)2]=E[(f(x;D)f¯)2]+E[(f¯yD)2]+2E[(f(x;D)f¯)(f¯yD)]=Var(x)+E[(f¯y+yyD)2]=Var(x)+E[(f¯y)2]+E[(yyD)2]+2E[(f¯y)(yyD)]=Var(x)+(f¯y)2+Var(ε)=Var(x)+bias2(x)+Var(ε)

偏差-方差分解说明,泛华性能由学习算法的能力、数据的充分性以及学习任务本身的难度共同决定。

bias_variance_tradeoff

决策树

概述

决策树是一种基本的分类与回归方法,它可以认为是一种if-then规则的集合。决策树由节点和有向边组成,内部节点代表特征,叶子节点代表类别。

下图为决策树的一个图例,判断用户是否有贷款意向:

决策树示例

 

决策树递归地选择特征并对整个特征空间进行划分,从而对样本进行分类,其过程如下所示:

决策树生成过程

从上图可以看出,决策树划分的方式有无数种,如何得到最优的决策树?即对训练数据有较好分类效果,同时对测试数据有较低的误差率。

根据特征选择依据的不同,决策树有三种生成算法,包括:ID3、C4.5、CART(Classification and Regression Tree)。

 

ID3

一、特征选择依据:选择信息增益最大的特征。

二、构建过程:

输入:训练数据集D,特征集A,阈值ε

输出:决策树T

主要过程:

1、计算A中各特征对D的信息增益,即G(D, A),选择信息增益最大的特征Ag

2、若Ag的信息增益小于ε,则置T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;

3、对Ag的每一可能值ai,根据Ag=ai将D分割为非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;

4、对第i个子节点,以Di为训练集,以A{Ag}为特征集,递归地调用步骤1~3,得到子树Ti,返回Ti

三、优点

1、构建决策树的速度比较快,算法实现简单,生成的规则容易理解。

四、缺点

1、倾向选择取值较多的特征。

2、只能处理离散特征,不能处理连续特征。

3、无修剪过程。

 

C4.5

一、特征选择依据:选择信息增益比最大的特征。

二、构建过程

输入:训练数据集D,特征集A,阈值ε

输出:决策树T

主要过程:

1、计算特征A中各特征对D的信息增益比,即gR(D,A),选择信息增益比最大的特征Ag

2、若Ag的信息增益比小于ε,置T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;

3、对Ag的每一可能值ai,根据Ag=ai将D分割为非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;

4、对第i个子节点,以Di为训练集,以A{Ag}为特征集,递归地调用步骤1~3,得到子树Ti,返回Ti

三、优点

1、能够处理缺失值

a、计算信息增益比时缺失:忽略;将此属性出现频率最高的值赋予该样本。

b、按该属性创建分支时缺失:忽略;将此属性出行频率最高的值赋予该样本;为缺失值创建一个分支。

c、预测时,待分类样本的属性缺失:到达该属性时结束,将该属性所对应子树中概率最大的类别作为预

测类别;将此属性出行频率最高的值赋予该样本,然后继续预测。

2、能够处理离散值和连续值(按属性值排序,按二分法枚举两两属性值之间的阈值点进行离散化)。

3、构造树有后有剪枝操作,防止过拟合。

四、缺点

1、倾向选择取值较少的特征。

2、针对连续值特征,计算效率低。

CART

一、特征选择依据:选择基尼指数最小的特征。

二、构建过程 - 回归树

输入:训练数据集D

输出:回归树f(x)

主要过程:

1、遍历特征j,对特征j遍历其切分点s,按照下式,求解最优的(j,s)

(20)minj,s[minc1xiR1(j,s))(yic1)2+minc1xiR2(j,s))(yic2)2]

2、用选定的(j,s)划分区域并决定相应的输出值:

(21)R1(j,s)={x|x(j)s}R2(j,s)={x|x(j)>s}c^m=1NmxiRm(j,s)yi,xRm,m=1,2,NmRm

3、继续对两个子区域调用步骤1~2,直到满足停止条件。

4、将输入空间划分为M个区域R1,R2,...,RM,生成决策树:

(22)f(x)=m=1Mc^mI(xRm)

三、构建过程 - 分类树

输入:训练数据集D,停止计算的条件

输出:CART决策树

主要过程:

1、对训练数据集D,对每个特征A,对A可能取的每个值a,根据对A=a的测试为“是”或“否”,将D分成D1D2两部分,计算A=a时的Gini(D,A)

2、对所有可能的特征及其取值,选择基尼指数最小的特征及其取值,作为最优特征及最优切分点。根据最优特征及最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。

3、继续对两个子区域调用步骤1~2,直到满足停止条件。

4、生成CART决策树。

小结

算法场景树结构特征选择连续值缺失值剪枝
ID3分类多叉树信息增益不支持不支持不支持
C4.5分类多叉树信息增益比支持支持支持
CART分类,回归二叉树基尼指数,MSE支持支持支持

 

集成学习

集成学习是通过训练若干个弱学习器,通过一定的组合策略,从而形成一个强学习器。按照基学习器之间是否存在依赖关系,可以分为两类:

Bagging

Bagging(bootstrap aggregating)是并行式集成学习方法的代表。

以分类为例,假设训练集为X,利用自助法,可以生成N个样本集X1,X2,...XN,针对每个样本集训练一个单独的分类器fi(x),最终分类结果由N个分类器投票得出:

(23)f(x)=sign(1Ni=1Nfi(x))

算法流程如下:

bagging

假设N个模型预测的结果分别为Y1,Y2,...,YN,则组合后的预测结果为Y=1Ni=1NYi。设单模型预测结果的期望是μ,方差是σ2。则bagging的期望预测为:

(24)E(Y)=E(1Ni=1NYi)=1NE(i=1NYi)=E(Yi)μ

说明bagging模型预测的期望近似于单模型的期望,意味着bagging模型的bias与单模型的bias近似,所以bagging通常选择偏差低的强学习器。

bagging的抽样是有放回抽样,因此数据集之间会有重复的样本,模型的预测结果不独立。假设单模型之间具有一定相关性,相关系数为0<ρ<1,则bagging模型的方差为:

(25)Var(Y)=Var(1Ni=1NYi)=1N2Var(i=1NYi)=1N2Cov(i=1NYi,i=1NYi)=1N2(i=1NVar(Yi)+ijNCov(Yi,Yj))=1N2(Nσ2+N(N1)ρσ2)=ρσ2+1ρNσ2

所以,当N较大时,Var(Y)ρσ2,bagging能降低整体预测结果的variance,而对bias优化有限。

Boosting

Adaboost

需要解决的两个问题:

分类

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN),其中xiXRN,yiY={1,+1};弱学习器算法。

输出:最终分类器G(x)

算法步骤如下:

  1. 初始化训练数据的权值分布(该值影响分类误差率)

    D1=(w11,...,w1i,...,w1N)w1i=1Ni=1,2,...,N

  2. m=1,2,...,M

(26)Gm(x):X{1,+1}

 

(29)Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)wm+1,i=wmiZmeαmyiGm(xi),i=1,2,...,N

其中,Zm是规范化因子:

(30)Zm=i=1NwmieαmyiGm(xi)

由上式可知,规范化后使得Dm+1成为一个概率分布。

 

  1. 构建弱分类器的线性组合

    (31)f(x)=m=1MαmGm(x)
  2. 最终分类器

    (32)G(x)=sign(f(x))=sign(m=1MαmGm(x))

 

回归

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN),其中xiXRN,yiYR;弱学习器算法。

输出:最终分类器G(x)

算法步骤如下:

  1. 初始化训练数据的权值分布(该值影响分类误差率)

    D1=(w11,...,w1i,...,w1N)w1i=1Ni=1,2,...,N

  2. 对迭代次数m=1,2,...,M

    • 使用具有权值分布Dm的训练数据集学习,得到基本分类器:Gm(x)

    • 计算训练集上的最大误差

      (33)Em=max|yiGm(xi)|
    • 计算单个样本的相对误差

      (34)线emi=|yiGm(xi)|Ememi=(yiGm(xi))2Em2emi=1e|yiGm(xi)|Em
    • 计算弱分类器Gm(x)在训练数据集上的误差率:

      (35)em=i=1mwmiemi
    • 计算弱分类器的系数

      (36)αm=em1em
    • 更新训练数据集的权值分布

      (37)Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)wm+1,i=wmiZmαm1emi,i=1,2,...,N

      其中,Zm是规范化因子:

      (38)Zm=i=1mwmiαm1em,i

      由上式可知,规范化后使得Dm+1成为一个概率分布。

  3. 构建弱分类器的线性组合,得到最终的强学习器

(39)f(x)=m=1M(ln1αm)Gm(x)

 

BDT

BDT(boosting decision tree),提升决策树。

分类

将Adaboost分类算法中的基本分类器限定为二分类树模型即可。

回归

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN),xiXRn,yiYR

输出:提升树fM(x),基模型为树模型

算法步骤:

  1. 定义模型

    (40)fM(x)=m=1MTm(x;Θm)Tm(x;Θm)=j=1JmcjI(xRj)

    其中,参数Θm=(R1,c1),(R2,c2),...,(RJm,cJm)表示树的划分及各区域上的输出值。Jm为第m棵回归树的叶子节点数(也可认为是树的复杂度)。

  2. 定义损失函数

    损失函数使用MSE,因此,第m轮的损失为:

    (41)L[y,fm(x)]=L[y,fm1(x)+Tm(x;Θm)]=[yfm1(x)Tm(x;Θm)]2=[rTm(x;Θm)]2r=yfm1(x)

    因此,对回归提升树来讲,只需拟合当前模型的残差即可。

  3. m=1,2,...,M

    • 计算残差:

      (42)rmi=yifm1(x),i=1,2,...,N
    • 生成第m棵回归树Tm(x;Θm)

      根据(x1,rm1),(x2,rm2),...,(xN,rmN)学习一个回归树,得到Tm(x;Θm)

    • 更新模型

      (43)fm(x)=fm1(x)+T(x;Θm)
  4. 生成最终的回归问题提升树

    (44)fM(x)=m=1MTm(x;Θm)

GBDT

GBDT(gradient boosting decision tree),梯度提升决策树。

回归

以回归为例,解释GBDT原理。

 

二分类

对二分类问题,可以使用0和1表示预测类别。预测值的区间为(0,1),预测结果为:

(55)class={0 if y^<θ1 if y^>=θθ
(56)yi^=11+eFM(xi)FM(xi)=m=1Mhm(xi)hm(x)

模型初始化为:

(57)F0(x)=h0(x)=logi=1Nyii=1N(1yi)

 

(59)L(yi,yi^)F(xi)={yilogyi^(1yi)log(1yi^)}F(xi)={yi1yi^yi^F(xi)(1yi)11yi^yi^F(xi)}={yiyi^yi^(1yi^)yi11yi^yi^(1yi^)}={(yiyi^+yi11yi^)yi^(1yi^)}=yiyi^

所以,在第m轮,L(yi,F(xi))关于F(xi)的的负梯度值(伪残差)为:

(60)rmi=[{yilogyi^(1yi)log(1yi^)}F(xi)]F(x)=Fm1(x)=yi11+eFm1(xi)

 

 

多分类

假设有K个类别,对类别进行one-hot处理后,样本集形式为(x,0,.,1,.,0k),label中只有一个维度为1。

模型最终生成K棵集成决策树。

 

 

总结

集成方法优点缺点示例
bagging能处理过拟合;
能够降低variance;
学习器独立,可并行训练;
噪声大时会过拟合;
可能会有很多相似的决策树;
小数据或低维数据效果一般;
随机森林
boosting能够降低bias和variance;容易过拟合;
串行训练;
GBDT

 

Bagging实现

随机森林

假设数据样本数为N,每个样本的属性个数为M,在每个决策树构造过程中,每个节点随机选择m个属性计算最佳分裂方式进行分裂。具体步骤如下:

  1. 有放回地随机选择N个样本,用这N个样本来训练一棵决策树。
  2. 每个样本有M个属性,在决策树中需要分裂节点时,从这M个属性中随机选取m个属性,一般来说m << M,然后从这m个属性中采用某种策略选择最佳属性作为当前节点的分裂属性。
  3. 每棵决策树的每个节点的分裂都按照步骤(2)进行,直到不能分裂为止。
  4. 重复建立K棵决策树,然后对预测结果进行一定组合,即可得随机森林模型。

Boosting-GBDT实现

XGBoost

模型概述

(75)XGBoost=eXtreme+GBDT=eXtreme+(Gradient+BDT)=eXtreme+Gradient+(Boosting+DecisionTree)

BoostingBDTGBDTXGBoost

原理推导

输入:训练数据集D={(x1,y1),(x2,y2),...,(xN,yN)},其中,xiRM,yiR,|D|=N

输出:提升决策树模型,由K个基本树模型组成

 

(76)y^i=ϕ(xi)=k=1Kfk(xi)Kfk(x)k

决策树定义为:

(77)f(x)=wq(x)

其中,q(x)为输入x叶子节点编号的映射,即Rm{1,...,T}T为决策树叶子节点数目。

wRT是叶子节点输出值向量,形式为(w1,w2,...,wT)

决策树结构图如下所示:

(78)L(ϕ)=il(y^i,yi)+kΩ(fk)l(y^i,yi)Ω(f)Ω(f)=γT+12λw2=γT+12λj=1Twj2

t 轮损失函数:

(79)L(t)=i=1Nl(yi,y^i(t1)+ft(xi))+Ω(ft)

t 轮损失函数L(t)y^(t1)处的二阶泰勒展开为:

(80)L(t)i=1n[l(yi,y^(t1))+y^(t1)l(yi,y^(t1))ft(xi)+12y^(t1)2l(yi,y^(t1))ft2(xi)]+Ω(ft)=i=1n[l(yi,y^(t1))+gift(xi)+12hift2(xi)]+Ω(ft)

gi=y^(t1)l(yi,y^(t1)),hi=y^(t1)2l(yi,y^(t1))

t 轮目标函数L(t)的二阶泰勒展开移除常数项:

(81)L~(t)=i=1N[gift(xi)+12hift2(xi)]+Ω(ft)=i=1N[gift(xi)+12hift2(xi)]+γT+12λj=1Twj2

T

 

定义叶结点 j 上的 样本的下标集合 Ij={i|q(xi)=j},则目标函数可表示为 按叶结点 累加的形式:

(82)L~(t)=i=1n[gift(xi)+12hift2(xi)]+γT+12λj=1Twj2=j=1T[(iIjgi)wj+12(iIjhi)wj2]+12λj=1Twj2+γT=j=1T[(iIjgi)wj+12(iIjhi+λ)wj2]+γT

由于:

(83)wj=argminwjL~(t)

可令:

(84)L~(t)wj=0

得到每个叶结点 j 的最优输出值为:

(85)wj=iIjgiiIjhi+λ

代入每个叶结点 j 的输出值,得到第 t 个决策树损失函数的最小值:

(86)L~(t)(q)=12j=1T(iIjgi)2iIjhi+λ+γTTt

假设ILIR分别为分裂后左右结点的实例集,令I=ILIR,则分裂后损失减少量由下式得出:

(87)Lsplit=L~I(t)(L~IL(t)+L~IR(t))=12(iIgi)2iIhi+λ+γ[12(iILgi)2iILhi+λ+γ][12(iIRgi)2iIRhi+λ+γ]=12[(iILgi)2iILhi+λ+(iIRgi)2iIRhi+λ(iIgi)2iIhi+λ]γ

使用 Lsplit 评估待分裂结点。

 

算法说明:枚举所有特征,对每个特征,枚举每个分裂点,根据 Lsplit 查找最优分裂点

输入:当前节点实例集I,特征维度d

输出:根据最大score分裂

算法步骤:

gain0

GiIgiHiIhi

for k=1 to d do

GL0HL0

for j in sorted(I, by xjk) do

GLGL+gjHLHL+hj

GRGGLHR=HHL

scoremax(score,GL2HL+λ+GR2HR+λG2H+λ)

end

end

 

LightGBM

 

基于决策树某节点的数据集O特征 j分裂点 d 分裂后的方差收益为:

(88)Vj|O(d)=1nO((xiO;xijdgi)2nl|Oj(d)+(xiO;xij>dgi)2nr|Oj(d))nO=I[xiO],nl|Oj(d)=I[xiO:xijd],nr|Oj(d)=I[xiO:xij>d]

特征j的最佳分裂点:

(89)dj=argmaxdVj(d)

解释一:基于CART树寻找最优分裂点

gi 为当前步骤要拟合的值,损失函数使用MSE,分裂后使得损失最小,即:

(90)min{pL(gpg¯L)2+qR(gqg¯R)2}=min{pLgp2+pLg¯L22pLgpg¯L+qRgq2+qRg¯R22qRgqg¯R}=min{pLg¯L2qRg¯R2}=max{pLg¯L2+qRg¯R2}=max{n(1npLgp)2+m(1mqRgq)2}=max{(pLgp)2n+(qLgq)2m}LRg¯Lg¯Rg

解释二:参考XGBoost的信息增益

(91)max[(iILgi)2iILhi+λ+(iIRgi)2iIRhi+λ(iIgi)2iIhi+λ]=max[(iILgi)2iILhi+λ+(iIRgi)2iIRhi+λ]=max[(iILgi)2iILhi+(iIRgi)2iIRhi]

因为使用的是平方损失,那么样本的二阶导数为1,即 hi 为1,故上式与 Vj|O(d) 等价。

 

由于梯度较大的数据实例在信息增益的计算中起着更重要的作用,所以GOSS可以在较小的数据量下获得相 当准确的信息增益估计。

 

参考资料

  1. https://statisticallearning.org/biasvariance-tradeoff.html
  2. https://www.cs.cornell.edu/courses/cs4780/2018fa/lectures/lecturenote12.html
  3. https://bcheggeseth.github.io/CorrelatedData/index.html
  4. http://www.milefoot.com/math/stat/rv-sums.htm
  5. https://stats.stackexchange.com/questions/391740/variance-of-average-of-n-correlated-random-variables
  6. https://github.com/Freemanzxp/GBDT_Simple_Tutorial
  7. https://scikit-learn.org/stable/modules/ensemble.html
  8. https://scikit-learn.org/stable/modules/tree.html#tree-algorithms-id3-c4-5-c5-0-and-cart