树模型学习笔记整理


决策树是一种基本算法,可以解决分类和回归问题。在分类问题中,类似 if-then的规则,基于样本特征对其进行空间划分并分类,其优点是可读性强、分类速度快。

一、原理

  1. 决策树由结点和有向边组成,结点分为内部结点(表示一个特征)、叶节点(表示一个分类),有向边代表了划分规则。
  2. 决策树还表示给定特征条件下类的条件概率分布。假设 X X X为表示特征的随机变量, Y Y Y表示类的随机变量,这个条件概率就可表示为 P ( Y ∣ X ) P(Y|X) P(YX)。各叶节点上的条件概率往往偏向于某一类,即属于某一类的概率较大。决策树分类时将该结点的实例强行分到条件概率大的那一类。
  3. 决策树学习本质上是从训练数据集中归纳出一组分类规则,这组规则对应的条件概率模型不仅对训练数据有很好的拟合能力,对未知数据也需要有很好的泛化能力。
  4. 决策树学习用损失函数表示目标。决策树学习的损失函数通常是正则化的极大似然函数。决策树学习的策略是最小化损失函数。
  5. 决策树生成算法:
    ① 构建根结点:将所有训练数据放在根结点。
    ② 选择一个最优特征,根据这个特征将训练数据分割成子集,使得各个子集有一个在当前条件下最好的分类。若这些子集已能够被基本正确分类,则将该子集构成叶结点。若某个子集不能够被基本正确分类,则对该子集选择新的最优的特征,继续对该子集进行分割,构建相应的结点。
    ③ 如此递归下去,直至所有训练数据子集都被基本正确分类,或者没有合适的特征为止。
  6. 上述生成的决策树可能对训练数据有很好的分类能力,但是对于未知的测试数据却未必有很好要的分类能力,即可能发生过拟合的现象。
  7. 过拟合解决的方法是:对生成的决策树进行剪枝,从而使得决策树具有更好的泛化能力。
  8. 决策树学习算法包含特征选择、决策树的生成、决策树的剪枝过程。决策树的生成对应着模型的局部最优,决策树的剪枝则考虑全局最优。

二、特征选择

  1. 特征选择在于选取对训练数据有较强分类能力的特征。若一个特征的分类结果与随机分类的结果没有什么差别,则称这个特征是没有分类能力的。通常特征选择的准则是信息增益或者信息增益比。
  2. 直观上,如果一个特征具有更好的分类能力,或者说,按照这一特征将训练集分割成子集,使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征。
  3. 在信息论和概率统计中,熵是表示随机变量不确定性的度量。假设 X X X的概率分布为 P ( X = x i ) = p i P(X=x_i)=p_i P(X=xi)=pi,则熵为 H ( X ) = − ∑ i = 0 n p i log ⁡ p i H(X)=-\sum_{i=0}^n p_i \log p_i H(X)=i=0npilogpi
    由定义可知,熵只依赖于 X X X的分布,而与 X X X的取值无关,所以也可将 X X X的熵记作 H ( p ) H(p) H(p),即 H ( p ) = − ∑ i = 0 n p i log ⁡ p i H(p)=-\sum_{i=0}^n p_i \log p_i H(p)=i=0npilogpi
    条件熵 H ( Y ∣ X ) H(Y|X) H(YX)表示在已知随机变量 X X X的条件下随机变量 Y Y Y的不确定性,定义为 X X X给定条件 Y Y Y下的条件概率分布的熵对的数学期望 H ( Y ∣ X ) = − ∑ i = 0 n p i H ( Y ∣ X = x i ) H(Y|X)=-\sum_{i=0}^n p_i H(Y|X=x_i) H(YX)=i=0npiH(YX=xi)
    其中, p i = P ( X = x i ) , i = 1 , 2 , . . . , n . p_i=P(X=x_i),i=1,2,...,n. pi=P(X=xi)i=1,2,...,n.

2.1信息增益

      信息增益表示得知特征 X X X的信息而使得类 Y Y Y的信息的不确定性减少的程度。
      特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的经验熵与特征 A A A给定条件下的经验条件熵 H ( D ∣ A ) H(D|A) H(DA)之差,即 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D) - H(D|A) g(D,A)=H(D)H(DA)
      一般地,熵 H ( Y ) H(Y) H(Y)与条件熵 H ( Y ∣ X ) H(Y|X) H(YX)之差成为互信息,决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
      决策树学习应用信息增益准则选择特征。对于数据集 D D D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
      根据信息增益准则的特征选择方法是 D D D:对训练数据集,计算器每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
      设训练数据集 D D D,表示 ∣ D ∣ |D| D其样本容量,即样本个数。设有 K K K个类 C k , k = 1 , 2 , . . . K C_k,k=1,2,...K Ck,k=1,2,...K ∣ K ∣ |K| K为属于类 C k C_k Ck的样本个数, ∑ k = 1 K ∣ C k ∣ = ∣ D ∣ \sum_{k=1}^K |C_k|= |D| k=1KCk=D。设特征 A A A n n n个不同的取值 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} {a1,a2,...,an},根据特征 A A A的取值将 D D D划分为 n n n个子集 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn ∣ D i ∣ |D_i| Di D i D_i Di的样本个数, ∑ i = 1 n ∣ D i ∣ = ∣ D ∣ . \sum_{i=1}^n |D_i|= |D|. i=1nDi=D.记子集 D i D_i Di中属于 C k C_k Ck类的样本集合为 D i k D_{ik} Dik,即 D i k = D i ⋂ C k D_{ik} = D_i \bigcap C_k Dik=DiCk ∣ D i k ∣ |D_{ik}| Dik D i k D_{ik} Dik的样本个数。于是信息增益的算法如下:
     (1)输入:训练数据集 D D D和特征 A A A
     (2)输出:特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) . g(D,A). g(D,A).
               ① 计算数据集 D D D的经验熵 H ( D ) H(D) H(D) H ( D ) = − ∑ k = 1 K ∣ C k ∣ D log ⁡ 2 ∣ C k ∣ D H(D)=-\sum_{k=1}^K \frac{|C_k|}{D} \log_2 \frac{|C_k|}{D} H(D)=k=1KDCklog2DCk
               ② 计算特征 A A A对数据集 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(DA) H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ D H ( D i ) = − ∑ i = 1 n ∣ D i ∣ D ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ log ⁡ 2 ∣ C k ∣ D ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}^n \frac{|D_i|}{D} H(D_i) = -\sum_{i=1}^n \frac{|D_i|}{D} \sum_{k=1}^K \frac{|D_{ik}|}{|D_i|} \log_2 \frac{|C_k|}{D}\frac{|D_{ik}|}{|D_i|} H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DCkDiDik
               ③ 计算信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D) - H(D|A) g(D,A)=H(D)H(DA)

2.2信息增益比

      以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益 比可以对这一问题进行校正,这是特征选择的另一准则。
      特征 A A A对训练数据集 D D D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集 D D D关于特征$
A 的 值 的 熵 的值的熵 H_A(D) 之 比 , 即 之比,即 g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A) = \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)$
      其中 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ D log ⁡ 2 ∣ D i ∣ D H_A(D)=-\sum_{i=1}^n \frac{|D_i|}{D} \log_2 \frac{|D_i|}{D} HA(D)=i=1nDDilog2DDi n n n是特征 A A A取值的个数。

三、生成算法

3.1 ID3算法

      ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树,ID3相当于用极大似然法进行概率模型的选择。
      ID3算法:
      输入:训练数据集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
      输出:决策树 T . T. T.
      (1)若 D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,并将类 C k C_k Ck作为该结点的类标记,返回 T T T
      (2)若 A = ∅ A=\varnothing A=,则 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
      (3)否则,按信息增益计算算法计算 A A A中各特征对 D D D的信息增益,选择信息增益最大的特征 A g A_g Ag
      (4)如果 A g A_g Ag的信息增益小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
      (5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai D D D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
      (6)对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A{Ag}为特征集,递归地调用步(1)~步(5),得到子树 T i T_i Ti,返回 T i T_i Ti

3.2 C4.5的生成算法

      C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进。C4.5在生成的过程中,用信息增益比来选择特征。
      输入:训练数据集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
      输出:决策树 T . T. T.
      (1)若 D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,并将类 C k C_k Ck作为该结点的类标记,返回 T T T
      (2)若 A = ∅ A=\varnothing A=,则 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
      (3)否则,按信息增益比计算算法计算 A A A中各特征对 D D D的信息增益比,选择信息增益比最大的特征 A g A_g Ag
      (4)如果 A g A_g Ag的信息增益比小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
      (5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai D D D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
      (6)对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A{Ag}为特征集,递归地调用步(1)~步(5),得到子树 T i T_i Ti,返回 T i T_i Ti

四、决策树的剪枝

      决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
      在决策树学习中将已生成的树进行简化的过程称为剪枝。
      决策树的剪枝往往通过极小化决策树整体的损失函数来实现。设树 T T T的叶结点个数为 ∣ T ∣ |T| T t t t是树 T T T的叶结点,该叶结点有 N t N_t Nt个样本点,其中 k k k类的样本点有 N t k N_{tk} Ntk个, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K H t ( T ) H_t(T) Ht(T)为叶结点 t t t上的经验熵, α ≥ 0 \alpha \ge 0 α0为参数,则决策树学习的损失函数可以定义为 C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|} N_tH_t(T) + \alpha |T| Cα(T)=t=1TNtHt(T)+αT
      其中经验熵为 H t ( T ) = − ∑ k N t k N t log ⁡ 2 N t k N t H_t(T)=-\sum_{k} \frac{N_{tk}}{N_t} \log_2 \frac{N_{tk}}{N_t} Ht(T)=kNtNtklog2NtNtk
      另外,损失函数还可以表示为 C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+ \alpha |T| Cα(T)=C(T)+αT
      其中, C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k log ⁡ N t k N t C(T)=\sum_{t=1}^{|T|} N_tH_t(T) = -\sum_{t=1}^{|T|} \sum_{k=1}^{K} N_{tk} \log \frac{N_{tk}}{N_t} C(T)=t=1TNtHt(T)=t=1Tk=1KNtklogNtNtk
       C ( T ) C(T) C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| T表示模型复杂度,参数 α ≥ 0 \alpha \ge 0 α0控制两者之间的影响,较大的 α \alpha α促使选择较简单的模型,较小的 α \alpha α促使选择较复杂的模型, α = 0 \alpha = 0 α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
      剪枝,就是当 α \alpha α确定时,选择损失函数最小的模型,即损失函数最小的子树。当 α \alpha α值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度越高;相反,子树越小,模型的复杂度越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
      决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
      上面损失函数的极小化等价于正则化的极大似然估计。所以,利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
      剪枝算法介绍如下:
             输入:生成算法产生的整个树 T T T,参数 α \alpha α
             输出:修剪后的子树 T α T_\alpha Tα
             (1)计算每个结点的经验熵。
             (2)递归地从树的叶结点向上回缩。
             设一组叶结点回缩到其父结点之前与之后的整体树分别为 T B T_B TB T A T_A TA,其对应的损失函数值分别是 C α ( T B ) C_\alpha(T_B) Cα(TB) C α ( T A ) C_\alpha(T_A) Cα(TA),如果 C α ( T A ) ≤ C α ( T B ) C_\alpha(T_A) \le C_\alpha(T_B) Cα(TA)Cα(TB)
             则进行剪枝,即将父结点变为新的叶结点。
             (3)返回(2),直至不能继续为止,得到损失函数最小的子树 T A T_A TA

五、CART算法

      CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。
      CART是在给定输入随机变量 X X X条件下输出随机变量 Y Y Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
      CART算法由以下两步组成:
      (1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
      (2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

5.1 CART生成

      决策树的生成及时递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼系数最小化准则,进行特征选择,生成二叉树。
      1. 回归树的生成
      假设 X X X Y Y Y分别为输入和输出变量,并且 Y Y Y是连续变量,给定训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \} D={(x1,y1),(x2,y2),...,(xN,yN)}
      一个回归树对应着输入空间的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为 M M M个单元 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,并且在每个单元 R M R_M RM上有一个固定的输出值 c m c_m cm,于是回归树模型可表示为 f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^{M} c_mI(x \in R_m) f(x)=m=1McmI(xRm)
      当输入空间的划分确定时,可以用平方误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i \in R_m} (y_i - f(x_i))^2 xiRm(yif(xi))2来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。易知,单元 R M R_M RM上的 c m c_m cm的最优估计值 c ^ m \hat c_m c^m R M R_M RM上的所有输入实例 x i x_i xi对应的输出 y i y_i yi的均值,即 c ^ m = a v e ( y i ∣ x i ∈ R m ) \hat c_m = ave(y_i | x_i \in R_m) c^m=ave(yixiRm)
      问题是怎样对输入空间进行划分。这里采用启发式的方法,选择第 j j j个变量 x j x^j xj和它取的值 s s s,作为切分变量和切分点,并定义两个区域: R 1 ( j , s ) = { x ∣ x j ≤ s } 和 R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s) = \{ x | x^j \le s \} 和 R_2(j,s) = \{ x | x^j \gt s \} R1(j,s)={xxjs}R2(j,s)={xxj>s}
      然后寻找最优切分变量 j j j和最优切分点 s s s。具体地,求解 min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 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[c1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2]
      对固定输入变量 j j j可以找到最优切分点 s s s c ^ 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) 和 c ^ 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) \hat c_1 = ave(y_i | x_i \in R_1(j,s)) 和 \hat c_2 = ave(y_i | x_i \in R_2(j,s)) c^1=ave(yixiR1(j,s))c^2=ave(yixiR2(j,s))
      遍历所有输入变量 j j j,找到最优的切分变量,构成一个对 ( j , s ) (j,s) (j,s)。依次将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止。这样就生成一颗回归树。这样的回归树通常称为最小二乘回归树,现将算法整理如下:
      最小二乘回归树生成算法:
      输入,训练数据集 D D D
      输出:回归树 f ( x ) f(x) f(x)
      在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树;
      (1)选择最优切分变量 j j j与切分点 s s s,求解 min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 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[c1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2]
      遍历变量 j j j,对固定的切分变量 j j j扫描切分点 s s s,选择使上式达到最小值的对 ( j , s ) (j,s) (j,s).
      (2)用选定的对 ( j , s ) (j,s) (j,s)划分区域并决定相应的输出值: R 1 ( j , s ) = { x ∣ x j ≤ s } , R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s) = \{ x | x^j \le s \} ,R_2(j,s) = \{ x | x^j \gt s \} R1(j,s)={xxjs}R2(j,s)={xxj>s} c ^ m = 1 N m ∑ ( x i ∈ R m ( j , s ) ) y i , x ∈ R m , m = 1 , 2 \hat c_m = \frac{1}{N_m} \sum{(x_i \in R_m(j,s))} y_i,x \in R_m,m=1,2 c^m=Nm1(xiRm(j,s))yi,xRm,m=1,2
      (3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。
      (4)将输入空间划分为 M M M个区域 R 1 , R 2 , . . . R M R_1,R_2,...R_M R1,R2,...RM,生成决策树: f ( x ) = ∑ m = 1 M c ^ m I ( x ∈ R m ) f(x)=\sum_{m=1}^{M} \hat c_mI(x \in R_m) f(x)=m=1Mc^mI(xRm)

5.2 分类树的生成

      分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
      在分类问题中,假设有 K K K个类,样本点属于第 k k k类的概率为 p k p_k pk,则概率分布的基尼指数定义为 G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p) = \sum_{k=1}^{K} p_k(1-p_k) = 1- \sum_{k=1}^{K} p_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
      对于二分类问题,弱样本点属于第1个类的概率是 p p p,则概率分布的基尼指数为 G i n i ( p ) = 2 p ( 1 − p ) Gini(p) = 2p(1-p) Gini(p)=2p(1p)
      对于给定的样本集合 D D D,其基尼指数为 G i n i ( p ) = 1 − ∑ k = 1 K ( ∣ C k ∣ D ) 2 Gini(p) = 1 - \sum_{k=1}^{K} (\frac{|C_k|}{D})^2 Gini(p)=1k=1K(DCk)2
      这里, C k C_k Ck D D D中属于第 k k k类的样本子集, K K K是类的个数。
      如果样本集合 D D D根据特征 A A A是否取某一可能值 a a a被分割成 D 1 D_1 D1 D 2 D_2 D2两部分,即 D 1 = { ( x , y ) ∈ D ∣ A ( x ) = α } , D 2 = D − D 1 D_1 = \{ (x,y) \in D | A(x) = \alpha \},D_2 = D - D_1 D1={(x,y)DA(x)=α},D2=DD1
      则在特征 A A A的条件下,集合 D D D的基尼指数定义为 G i n i ( D , A ) = ∣ D 1 ∣ D G i n i ( D 1 ) + ∣ D 2 ∣ D G i n i ( D 2 ) Gini(D,A) = \frac{|D_1|}{D} Gini(D_1) + \frac{|D_2|}{D} Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)
      基尼指数 G i n i ( D ) Gini(D) Gini(D)表示集合 D D D的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) Gini(D,A)表示经 A = α A = \alpha A=α分割后集合 D D D的不确定性。基尼指数值越大,样本集合的不确定性也就越大。
      CART生成算法:
      输入:训练数据集 D D D,停止计算的条件:
      输出:CART决策树
      根据训练数据集,从根结点开始,递归地对每个结点进行操作,构建二叉决策树:
      (1)设结点的训练数据集为 D D D,计算现有特征对该数据集的基尼指数。此时,对每一个特征 A A A,对其可能取的每个值 α \alpha α,根据样本点对 A = α A = \alpha A=α 的测试为“是”或“否”将 D D D分割成 D 1 D_1 D1 D 2 D_2 D2两部分,计算 A = α A = \alpha A=α 时的基尼指数。
      (2)在所有可能的特征 A A A以及它们所有可能的切分点 α \alpha α中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
      (3)对两个子结点递归地调用(1),(2),直至满足停止条件。
      (4)生成CART决策树。
      算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或者没有更多特征。

5.3 CART剪枝

      CART剪枝算法:
      输入:CART算法生成的决策 T 0 T_0 T0
      输出:最优决策树 T α T_{\alpha} Tα
      (1)设 k = 0 , T = T 0 k=0,T=T_0 k=0,T=T0
      (2)设 α = + ∞ \alpha= +\infty α=+
      (3)自下而上地对各内部结点 t t t计算 C ( T t ) C(T_t) C(Tt) ∣ T t ∣ |T_t| Tt以及 g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t) = \frac{C(t)-C(T_t)}{|T_t|-1} g(t)=Tt1C(t)C(Tt) α = m i n ( α , g ( t ) ) \alpha = min(\alpha,g(t)) α=min(α,g(t))
      这里, T t T_t Tt表示以 t t t为根结点的子树, C ( T t ) C(T_t) C(Tt)是对训练数据的预测误差, ∣ T t ∣ |T_t| Tt T t T_t Tt的叶结点个数。
      (4)对 g ( t ) = α g(t) = \alpha g(t)=α的内部结点 t t t进行剪枝,并对叶结点 t t t以多数表决法决定其类,得到树 T T T
      (5)设 k = k + 1 , α k = α , T k = T k = k + 1 , \alpha_k = \alpha , T_k = T k=k+1,αk=α,Tk=T.
      (6)如果 T k T_k Tk不是由根结点及两个叶结点构成的树,则回到步骤(3);否则令 T k = T n T_k = T_n Tk=Tn.
      (7)采用交叉验证法在子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn中选取最优子树 T α T_{\alpha} Tα

六、提升树

6.1 AdaBoost算法

  1. 原理介绍
  2. AdaBoost算法的解释
            AdaBoost算法还有另外一个解释,即可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类学习方法。
    前向分步算法:
    输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T = \{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)};损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))$;基函数集 { b ( x ; γ ) } \{b(x;\gamma)\} {b(x;γ)}
    输出:加法模型 f ( x ) f(x) f(x)
    (1)初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
    (2)对 m = 1 , 2 , . . . M m = 1,2,...M m=1,2,...M
    (a)极小化损失函数 ( β m , γ m ) = a r g min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m ,\gamma_m) = arg\min_{\beta,\gamma} \sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))
    得到参数 β m \beta_m βm γ m \gamma_m γm
    (b)更新 f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x) = f_{m-1}(x) + \beta_mb(x;\gamma_m) fm(x)=fm1(x)+βmb(x;γm)
    (3)得到加法模型 f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x) = f_M(x) = \sum_{m=1}^{M}\beta_mb(x;\gamma_m) f(x)=fM(x)=m=1Mβmb(x;γm)
    这样,前向分步算法将同时求解从 m = 1 m=1 m=1 M M M所有参数 β m , γ m \beta_m ,\gamma_m βm,γm,的优化问题简化为逐次求解各个 β m , γ m \beta_m ,\gamma_m βm,γm的优化问题。

6.2 提升树

      提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习性能最好的方法之一。

6.2.1 提升树模型

      提升方法实际使用加法模型与前向分步算法。以决策树为基函数的提升方法称为提升树。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。
      提升树模型可以表示为决策树的加法模型: f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^{M} T(x;\Theta_m) fM(x)=m=1MT(x;Θm)
      其中, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)表示决策树; Θ m \Theta_m Θm为决策树的参数; M M M为树的个数。

6.2.2 提升树算法

      提升树算法采用前向分步算法。首先确定初始提升树 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0,第 m m m步的模型是 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_m(x) = f_{m-1}(x) + T(x;\Theta_m) fm(x)=fm1(x)+T(x;Θm)
      其中, f m − 1 ( x ) f_{m-1}(x) fm1(x)为当前模型,通过经验风险极小化确定下一颗决策树的参数 Θ m \Theta_m Θm Θ ^ m = a r g min ⁡ Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x ; Θ m ) ) \hat \Theta_m = arg \min_{\Theta_m} \sum_{i=1}^{N} L(y_i,f_{m-1}(x_i)+T(x;\Theta_m)) Θ^m=argΘmmini=1NL(yi,fm1(xi)+T(x;Θm))
      这里没有引入正则化,而在xgboost中会引入正则化。
      针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
      对于二分类问题,提升树算法只需要将AdaBoost算法中的基本分类器限制为二类分类器即可。下面讨论回归问题的提升树。
      已知一个训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T = \{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)} x i ∈ X ⊆ ℜ n x_i \in \mathcal X \subseteq \real^n xiXn X \mathcal X X为输入空间, y i ∈ Y ⊆ ℜ y_i \in \mathcal Y \subseteq \real yiY Y \mathcal Y Y为输出空间。如果将输入空间 X \mathcal X X划分为 J J J个互不相交的区域 R 1 , R 2 , . . . R J R_1,R_2,...R_J R1,R2,...RJ,并且在每个区域上确定输出的常量 c j c_j cj,那么树可表示为 T ( x ; Θ m ) = ∑ j = 1 J c j I ( x ∈ R j ) T(x;\Theta_m) = \sum_{j=1}^{J} c_jI(x \in R_j) T(x;Θm)=j=1JcjI(xRj)
      其中,参数 Θ = { ( R 1 , c 1 ) , ( R 2 , c 2 ) , . . . , ( R J , c J ) } \Theta = \{ (R_1,c_1),(R_2,c_2),...,(R_J,c_J) \} Θ={(R1,c1),(R2,c2),...,(RJ,cJ)}表示树的划分区域和各个区域上的常数。 J J J是回归树的复杂度即叶结点个数。
      回归问题提升树使用以下前向分步算法: f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) , m = 1 , 2 , . . . M f_m(x) = f_{m-1}(x) + T(x;\Theta_m),m=1,2,...M fm(x)=fm1(x)+T(x;Θm),m=1,2,...M f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^{M} T(x;\Theta_m) fM(x)=m=1MT(x;Θm)
      在前向分步算法的第 m m m步,给定当前模型 f m − 1 ( x ) f_{m-1}(x) fm1(x),需求解 Θ ^ m = a r g min ⁡ Θ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x ; Θ m ) ) \hat \Theta_m = arg \min_{\Theta_m} \sum_{i=1}^{N} L(y_i,f_{m-1}(x_i)+T(x;\Theta_m)) Θ^m=argΘmmini=1NL(yi,fm1(xi)+T(x;Θm))
      得到 Θ ^ m \hat \Theta_m Θ^m,即第 m m m颗树的参数。
      当采用平方误差损失函数时, L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x)) = (y - f(x))^2 L(y,f(x))=(yf(x))2
      其损失变为 L ( y , f m − 1 ( x ) + T ( x ; Θ m ) ) = [ y − f m − 1 ( x ) − T ( x ; Θ m ) ] 2 = [ r − T ( x ; Θ m ) ] 2 L(y,f_{m-1}(x) + T(x;\Theta_m)) = [y - f_{m-1}(x) - T(x;\Theta_m)]^2 = [r-T(x;\Theta_m)]^2 L(y,fm1(x)+T(x;Θm))=[yfm1(x)T(x;Θm)]2=[rT(x;Θm)]2
      这里, r = y − f m − 1 ( x ) r = y-f_{m-1}(x) r=yfm1(x)
      是当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。
      回归问题的提升树算法整理如下:
      输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T = \{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)} x i ∈ X ⊆ ℜ n , y i ∈ Y ⊆ ℜ x_i \in \mathcal X \subseteq \real^n,y_i \in \mathcal Y \subseteq \real xiXnyiY
      提升树 f M ( x ) f_M(x) fM(x).
      (1)初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
      (2)对 m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M
      (a)计算残差 r m i = y i − f m − 1 ( x i ) r_{mi} = y_i - f_{m-1}(x_i) rmi=yifm1(xi)
      (b)拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)
      (c)更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_m(x) = f_{m-1}(x) + T(x;\Theta_m) fm(x)=fm1(x)+T(x;Θm)
      (3)得到回归问题提升树 f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^{M} T(x;\Theta_m) fM(x)=m=1MT(x;Θm)

6.2.3 梯度提升

      提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失时,每一步优化是简单的。但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,Freidman提出了梯度提升算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值 − [ ∂ L ( y , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -[\frac{\partial L(y,f(x_i)))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)} [f(xi)L(y,f(xi)))]f(x)=fm1(x)
      原因:
      根据: L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + h m ( x ; Θ m ) ) = L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h m ( x ; Θ m ) L(y,f_m(x)) = L(y,f_{m-1}(x) + h_m(x;\Theta_m)) = L(y,f_{m-1}(x)) +\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)} h_m(x;\Theta_m) L(y,fm(x))=L(y,fm1(x)+hm(x;Θm))=L(y,fm1(x))+fm1(x)L(y,fm1(x))hm(x;Θm)
      其中 h m ( x ; Θ m ) h_m(x;\Theta_m) hm(x;Θm)表示基函数。
      则有 Δ L = L ( y , f m ( x ) ) − L ( y , f m − 1 ( x ) = ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h m ( x ; Θ m ) \Delta L = L(y,f_m(x)) - L(y,f_{m-1}(x) = \frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)} h_m(x;\Theta_m) ΔL=L(y,fm(x))L(y,fm1(x)=fm1(x)L(y,fm1(x))hm(x;Θm)
      要使得损失函数降低,一个可选的方案就是: h m ( x ; Θ m ) = − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h_m(x;\Theta_m)=-\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)} hm(x;Θm)=fm1(x)L(y,fm1(x))
      梯度提升算法:
      输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T = \{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)} x i ∈ X ⊆ ℜ n , y i ∈ Y ⊆ ℜ x_i \in \mathcal X \subseteq \real^n,y_i \in \mathcal Y \subseteq \real xiXnyiY;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))
      输出回归树 f ^ ( x ) \hat f(x) f^(x)
      (1)初始化 f 0 ( x ) = a r g min ⁡ c ∑ i = 1 N L ( y i , c ) f_0(x) = arg \min_c \sum_{i=1}^{N} L(y_i,c) f0(x)=argcmini=1NL(yi,c)
      (2)对 m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M
      (a)对 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,计算 r m i = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi} = -[\frac{\partial L(y_i,f(x_i)))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)} rmi=[f(xi)L(yi,f(xi)))]f(x)=fm1(x)
      (b)对 r m i r_{mi} rmi拟合一个回归树,得到第颗树的叶结点区域 R m j , j = 1 , 2 , . . . , J R_{mj},j=1,2,...,J Rmj,j=1,2,...,J
      (c)对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算 c m j = a r g min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj} = arg \min_c \sum_{x_i \in R_{mj}} L(y_i,f_{m-1}(x_i)+c) cmj=argcminxiRmjL(yi,fm1(xi)+c)
      (d)更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x) = f_{m-1}(x) + \sum_{j=1}^{J} c_{mj}I(x \in R_{mj}) fm(x)=fm1(x)+j=1JcmjI(xRmj)
      (3)得到回归树 f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat f(x) = f_M(x) = \sum_{m=1}^{M} \sum_{j=1}^{J} c_{mj}I(x \in R_{mj}) f^(x)=fM(x)=m=1Mj=1JcmjI(xRmj)
      算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值、第2(b)步估计回归树叶结点区域,以拟合残差的近似值。第2©步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步得到输出的最终模型 f ^ ( x ) \hat f(x) f^(x)
      梯度提升树用于分类模型时,是梯度提升决策树GBDT;用于回归问题时,是梯度提升回归树GBRT。

6.2.4 随机森林 VS 梯度提升树

  1. 从模型框架的角度来看:梯度提升树为boosting 模型,随机森林为bagging 模型。
  2. 从偏差分解的角度来看:①梯度提升树采用弱分类器(高偏差,低方差)。梯度提升树综合了这些弱分类器,在每一步的过程中降低了偏差,但是保持低方差。②随机森林采用完全成长的子决策树(低偏差,高方差)。随机森林要求这些子树之间尽可能无关,从而综合之后能降低方差,但是保持低偏差。
  3. 如果在梯度提升树和随机森林之间二选一,几乎总是建议选择梯度提升树。
  4. 随机森林的优点:天然的支持并行计算,因为每个子树都是独立的计算。
  5. 梯度提升树的优点:①梯度提升树采用更少的子树来获得更好的精度。因为在每轮迭代中,梯度提升树会完全接受现有树(投票权为1)。而随机森林中每棵树都是同等重要的(无论它们表现的好坏),它们的投票权都是 1 N \frac{1}{N} N1 ,因此不是完全接受的。②梯度提升树也可以修改从而实现并行化。③梯度提升树有一个明确的数学模型。因此任何能写出梯度的任务,都可以应用梯度提升树。而随机森林并没有一个明确的数学模型。

6.3 xgboost

  1. xgboost 也是使用与提升树相同的前向分步算法。其区别在于:xgboost 通过结构风险极小化来确定下一个决策树的参数 Θ m \Theta_m Θm Θ ^ m = a r g min ⁡ Θ m ∑ i = 1 N L ( y i , f m ( x i ) ) + Ω ( h m ( x ) ) \hat \Theta_m = arg \min_{\Theta_m} \sum_{i=1}^{N} L(y_i,f_{m}(x_i))+\Omega(h_m(x)) Θ^m=argΘmmini=1NL(yi,fm(xi))+Ω(hm(x))
    其中:① Ω ( h m ) \Omega(h_m) Ω(hm)为第 m m m个决策树的正则化项。这是xgboost与提升树的一个重要区别;② L L = ∑ i = 1 N L ( y i , f m ( x i ) ) + Ω ( h m ( x ) ) LL = \sum_{i=1}^{N} L(y_i,f_{m}(x_i))+\Omega(h_m(x)) LL=i=1NL(yi,fm(xi))+Ω(hm(x)) 为目标函数。
  2. 定义: y ^ i m − 1 = f m − 1 ( x i ) , g i = ∂ L ( y i , y ^ i m − 1 ) ∂ y ^ i m − 1 , h i = ∂ 2 L ( y i , y ^ i m − 1 ) ∂ 2 y ^ i m − 1 \hat y_i^{m-1}=f_{m-1}(x_i),g_i=\frac{\partial L(y_i,\hat y_i^{m-1})}{\partial \hat y_i^{m-1}},h_i=\frac{\partial ^2 L(y_i,\hat y_i^{m-1})}{\partial ^2 \hat y_i^{m-1}} y^im1=fm1(xi),gi=y^im1L(yi,y^im1),hi=2y^im12L(yi,y^im1)
    即:① g i g_i gi L ( y i , y ^ i m − 1 ) L(y_i,\hat y_i^{m-1}) L(yi,y^im1) y i m − 1 y_i^{m-1} yim1的一阶导数;② h i h_i hi L ( y i , y ^ i m − 1 ) L(y_i,\hat y_i^{m-1}) L(yi,y^im1) y i m − 1 y_i^{m-1} yim1的二阶导数。
    对目标函数 L L L执行二阶泰勒展开: L L = ∑ i = 1 N L ( y i , f m ( x i ) ) + Ω ( h m ( x ) ) = ∑ i = 1 N L ( y i , y ^ i m − 1 + h m ( x i ) ) + Ω ( h m ( x ) ) ≈ ∑ i = 1 N [ L ( y i , y ^ i m − 1 ) + g i h m ( x i ) + 1 2 h i h m 2 ( x i ) ] + Ω ( h m ( x ) ) + c o n s t a n t \begin{aligned} L L & = \sum_{i=1}^{N} L(y_i,f_{m}(x_i))+\Omega(h_m(x))=\sum_{i=1}^{N} L(y_i,\hat y_i^{m-1}+h_m(x_i))+\Omega(h_m(x)) \\ & \approx \sum_{i=1}^{N} [L(y_i,\hat y_i^{m-1}) +g_i h_m(x_i) + \frac{1}{2}h_i h_m^2(x_i)]+\Omega(h_m(x)) +constant \\ \end{aligned} LL=i=1NL(yi,fm(xi))+Ω(hm(x))=i=1NL(yi,y^im1+hm(xi))+Ω(hm(x))i=1N[L(yi,y^im1)+gihm(xi)+21hihm2(xi)]+Ω(hm(x))+constant
    提升树模型只采用一阶泰勒展开。这也是xgboost与提升树的另外一个区别。
  3. 对一个决策树 h m ( x ) h_m(x) hm(x),假设不考虑复杂的推导过程,仅考虑决策树的效果:
    ①给定一个输入 x x x,该决策树将该输入经过不断的划分,最终划分到某个叶结点上去;②给定一个叶结点,该叶结点有一个输出值。
    因此将决策树拆分成结构部分 q ( ⋅ ) q(\cdot) q(),和叶结点权重部分 w = ( w 1 , w 2 , . . . , w T ) w=(w_1,w_2,...,w_T) w=(w1,w2,...,wT) ,其中 T T T为叶结点的数量。
    ①结构部分 q ( x ) q(x) q(x)的输出是叶结点编号 d d d。它的作用是将输入 x x x映射到编号为 d d d的叶结点;②叶结点权重部分就是每个叶结点的值。它的作用是输出编号为 d d d的叶结点的值 w d w_d wd
    因此决策树改写为: h m ( x ) = w q ( x ) h_m(x) = w_{q(x)} hm(x)=wq(x)

6.3.1 结构分

  1. 定义一个决策树的复杂度为: Ω ( h m ( x ) ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(h_m(x)) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2 Ω(hm(x))=γT+21λj=1Twj2
    其中: T T T为叶结点的个数; w j w_j wj为每个叶结点的输出值; γ , λ ≥ 0 \gamma ,\lambda \ge 0 γ,λ0为系数,控制这两个部分的比重。
    ①叶结点越多,则决策树越复杂。②每个叶结点输出值的绝对值越大,则决策树越复杂。
    注意:该复杂度是一个经验公式。事实上还有很多其他的定义复杂度的方式,只是这个公式效果还不错。
  2. 将树的拆分、树的复杂度代入 L L L的二阶泰勒展开,有: L L ≈ ∑ i = 1 N [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 + c o n s t a n t LL \approx \sum_{i=1}^{N} [g_i w_{q_{(x_i)}} + \frac{1}{2} h_i w_{q_{(x_i)}}^2]+\gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2 +constant LLi=1N[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2+constant
    对每个样本 x i x_i xi,它必然被划分到树 h m h_m hm的某个叶结点。定义划分到叶结点 j j j的样本的集合为: I j = { i ∣ q ( x i ) = j } I_j=\{i|q(x_i)=j\} Ij={iq(xi)=j}。则有: L L ≈ ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T + c o n s t a n t LL \approx \sum_{j=1}^{T} [(\sum_{i \in I_j} g_i )w_{j} + \frac{1}{2} (\sum_{i \in I_j} h_i +\lambda)w_{j}^2]+\gamma T +constant LLj=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT+constant
  3. 定义: G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h i G_j = \sum_{i \in I_j} g_i ,H_j = \sum_{i \in I_j} h_i Gj=iIjgiHj=iIjhi
    G j G_j Gj刻画了隶属于叶结点 j j j的那些样本的一阶偏导数之和。② H j H_j Hj刻画了隶属于叶结点 j j j的那些样本的二阶偏导数之和。③偏导数是损失函数 L L L关于当前模型的输出 y ^ i m − 1 \hat y_i^{m-1} y^im1的偏导数。
    则上式简化为: L L ≈ ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T + c o n s t a n t LL \approx \sum_{j=1}^{T} [G_j w_{j} + \frac{1}{2} (H_j +\lambda)w_{j}^2]+\gamma T +constant LLj=1T[Gjwj+21(Hj+λ)wj2]+γT+constant
    假设 w j w_j wj T , G j , H j T,G_j,H_j T,Gj,Hj无关,对 w j w_j wj求导等于0,则得到 w j ∗ = − G j H j + λ w_j^*=-\frac{G_j}{H_j+\lambda} wj=Hj+λGj
    忽略常数项,于是定义目标函数为: L ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T L* = -\frac{1}{2} \sum_{j=1}^{T} \frac{G_j^2}{H_j+\lambda} + \gamma T L=21j=1THj+λGj2+γT
  4. 在推导过程中假设 w j w_j wj T , G j , H j T,G_j,H_j T,Gj,Hj无关,这其实假设已知树的结构。其实, L ∗ L* L是与 T T T相关的,甚至与树的结构相关,因此定义 L ∗ L* L为结构分。结构分刻画了:当已知树的结构时目标函数的最小值。

6.3.2 分解结点

  1. 现在的问题是:如何得到最佳的树的结构,从而使得目标函数全局最小。
6.3.2.1 贪心算法
  1. 第一种方法是对现有的叶结点加入一个分裂,然后考虑分裂之后目标函数降低多少。如果目标函数下降,则说明可以分裂。如果目标函数不下降,则说明该叶结点不宜分裂。
  2. 对于一个叶结点,假如给定其分裂点,定义划分到左子结点的样本的集合为: I L = { i ∣ q ( x i ) = L } I_L=\{i|q(x_i)=L\} IL={iq(xi)=L};定义划分到右子结点的样本的集合为: I R = { i ∣ q ( x i ) = R } I_R=\{i|q(x_i)=R\} IR={iq(xi)=R}。则有: G L = ∑ i ∈ I L g i , G R = ∑ i ∈ I R g i G_L = \sum_{i \in I_L} g_i,G_R = \sum_{i \in I_R} g_i GL=iILgi,GR=iIRgi H L = ∑ i ∈ I L h i , H R = ∑ i ∈ I R h i H_L = \sum_{i \in I_L} h_i,H_R = \sum_{i \in I_R} h_i HL=iILhi,HR=iIRhi G = ∑ i ∈ I L g i + ∑ i ∈ I R g i = G L + G R G = \sum_{i \in I_L}g_i + \sum_{i \in I_R} g_i = G_L+G_R G=iILgi+iIRgi=GL+GR H = ∑ i ∈ I L h i + ∑ i ∈ I R h i = H L + H R H = \sum_{i \in I_L}h_i + \sum_{i \in I_R} h_i = H_L+H_R H=iILhi+iIRhi=HL+HR
  3. 定义叶结点的分裂增益为: G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ] − λ Gain = \frac{1}{2} [\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ] - \lambda Gain=21[HL+λGL2+HR+λGR2H+λG2]λ
    其中:
    G L 2 H L + λ \frac{G_L^2}{H_L+\lambda} HL+λGL2表示:该叶结点的左子树的结构分。
    G R 2 H R + λ \frac{G_R^2}{H_R+\lambda} HR+λGR2表示:该叶结点的右子树的结构分。
    G 2 H + λ \frac{G^2}{H+\lambda} H+λG2表示:如果不分裂,则该叶结点本身的结构分。
    − λ -\lambda λ表示:因为分裂导致叶结点数量增大1,从而导致增益的下降。
    每次分裂只一个叶结点,因此其它叶结点不会发生变化。因此:
    ①若 G a i n > 0 Gain \gt 0 Gain>0,则该叶结点应该分裂。
    ②若 G a i n ≤ 0 Gain \le 0 Gain0,则该叶结点不宜分裂。
  4. 现在的问题是:不知道分裂点。对于每个叶结点,存在很多个分裂点,且可能很多分裂点都能带来增益。
    解决的办法是:对于叶结点中的所有可能的分裂点进行一次扫描。然后计算每个分裂点的增益,选取增益最大的分裂点作为本叶结点的最优分裂点。
  5. 最优分裂点贪心算法:
    (1)输入:
    ①数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D=\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \} D={(x1,y1),(x2,y2),...,(xN,yN)},其中样本 x i = ( x i , 1 , x i , 2 , . . . , x i , n ) T x_i = (x_{i,1},x_{i,2},...,x_{i,n})^T xi=(xi,1,xi,2,...,xi,n)T.
    ②属于当前叶结点的样本集的下标集合 Ⅱ Ⅱ
    (2)输出:当前叶结点最佳分裂点。
    (3)算法:
    ①初始化: s c o r e ← 0 , G ← ∑ i ∈ Ⅱ g i , H ← ∑ i ∈ Ⅱ h i score ← 0,G←\sum_{i \in Ⅱ} g_i,H←\sum_{i \in Ⅱ} h_i score0,Gigi,Hihi
    ②遍历各维度: k = 1 , 2 , . . . , n k=1,2,...,n k=1,2,...,n
    (a)初始化: G L ← 0 , H L ← 0 G_L←0,H_L←0 GL0,HL0
    (b)遍历各拆分点:沿着第 k k k维:
    如果第 k k k维特征为连续值,则将当前叶结点中的样本从小到大排序。然后用 j j j顺序遍历排序后的样本下标: G L ← G L + g j , H L ← H L + h j G_L←G_L+g_j,H_L←H_L+h_j GLGL+gj,HLHL+hj G R ← G − G L , H R ← H − H L G_R←G-G_L,H_R←H-H_L GRGGL,HRHHL s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    如果第 k k k维特征为离散值 { a 1 , a 2 , . . . , a m k } \{ a_1,a_2,...,a_{m_k} \} {a1,a2,...,amk},设当前叶结点中第 k k k维取值 a j a_j aj样本的下标集和为 Ⅱ j Ⅱ_j j,则遍历 j = 1 , 2 , . . . , m k j=1,2,...,m_k j=1,2,...,mk G L ← ∑ i ∈ Ⅱ j g i , H L ← ∑ i ∈ Ⅱ j h i G_L←\sum_{i \in Ⅱ_j} g_i,H_L←\sum_{i \in Ⅱ_j} h_i GLijgi,HLijhi G R ← G − G L , H R ← H − H L G_R←G-G_L,H_R←H-H_L GRGGL,HRHHL s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    ③选取最大的 s c o r e score score对应的维度和拆分点作为最优拆分点。
  6. 分裂点贪心算法尝试所有特征和所有分裂位置,从而求得最优分裂点。
    当样本太大且特征为连续值时,这种暴力做法的计算量太大。
6.3.2.2 近似算法
  1. 近似算法寻找最优分裂点时不会枚举所有的特征值,而是对特征值进行聚合统计,然后形成若干个桶。
    然后仅仅将桶边界上的特征的值作为分裂点的候选,从而获取计算性能的提升。
  2. 假设数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)},样本 x i = ( x i , 1 , x i , 2 , . . . , x i , n ) T x_i = (x_{i,1},x_{i,2},...,x_{i,n})^T xi=(xi,1,xi,2,...,xi,n)T.
    对第 k k k个特征进行分桶:
    (1)如果第 k k k个特征为连续特征,则执行百分位分桶,得到分桶的区间为: S k = { s k , 1 , s k , 2 , . . . , s k , l } S_k =\{s_{k,1},s_{k,2},...,s_{k,l}\} Sk={sk,1,sk,2,...,sk,l},其中 s k , 1 < s k , 2 < . . . < s k , l s_{k,1} \lt s_{k,2} \lt... \lt s_{k,l} sk,1<sk,2<...<sk,l
    分桶的数量、分桶的区间都是超参数,需要仔细挑选。
    (2)如果第 k k k个特征为离散特征,则执行按离散值分桶,得到的分桶为: S k = { s k , 1 , s k , 2 , . . . , s k , l } S_k =\{s_{k,1},s_{k,2},...,s_{k,l}\} Sk={sk,1,sk,2,...,sk,l},其中 s k , 1 , s k , 2 , . . . , s k , l s_{k,1},s_{k,2} ,... , s_{k,l} sk,1,sk,2,...,sk,l为第 k k k个特征的所有可能的离散值。
    分桶的数量 l l l就是所有样本在第 k k k个特征上的取值的数量。
  3. 最优分裂点近似算法:
    (1)输入:
    ①数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)},样本 x i = ( x i , 1 , x i , 2 , . . . , x i , n ) T x_i = (x_{i,1},x_{i,2},...,x_{i,n})^T xi=(xi,1,xi,2,...,xi,n)T
    ②属于当前叶结点的样本集的下标集合 Ⅱ Ⅱ
    (2)输出:当前叶结点最佳分裂点。
    (3)算法:
    ①对每个特征进行分桶。 假设对第 k k k个特征上的值进行分桶为: S k = { s k , 1 , s k , 2 , . . . , s k , l } S_k =\{s_{k,1},s_{k,2},...,s_{k,l}\} Sk={sk,1,sk,2,...,sk,l}
    如果第 k k k个特征为连续特征,则要求满足 s k , 1 < s k , 2 < . . . < s k , l s_{k,1} \lt s_{k,2} \lt... \lt s_{k,l} sk,1<sk,2<...<sk,l
    ②初始化: s c o r e ← 0 , G ← ∑ i ∈ Ⅱ g i , H ← ∑ i ∈ Ⅱ h i score ← 0,G←\sum_{i \in Ⅱ} g_i,H←\sum_{i \in Ⅱ} h_i score0,Gigi,Hihi
    ③遍历各维度: k = 1 , 2 , . . . , n k=1,2,...,n k=1,2,...,n
    (a)初始化: G L ← 0 , H L ← 0 G_L←0,H_L←0 GL0,HL0
    (b)遍历各拆分点:即遍历 j = 1 , 2 , . . . , l j=1,2,...,l j=1,2,...,l
    如果是连续特征,则设叶结点的样本中,第 k k k个特征取值在区间 ( s k , j , s k , j + 1 ] (s_{k,j},s_{k,j+1}] (sk,j,sk,j+1]的样本的下标集合为 Ⅱ j Ⅱ_j j,则: G L ← G L + ∑ i ∈ Ⅱ j g i , H L ← H L + ∑ i ∈ Ⅱ j h i G_L←G_L+\sum_{i \in Ⅱ_j} g_i,H_L←H_L+\sum_{i \in Ⅱ_j} h_i GLGL+ijgi,HLHL+ijhi G R ← G − G L , H R ← H − H L G_R←G-G_L,H_R←H-H_L GRGGL,HRHHL s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    如果是离散特征,则设叶结点的样本中,第 k k k个特征取值等于 s k j s_{kj} skj的样本的下标集合为 Ⅱ j Ⅱ_j j,则: G L ← ∑ i ∈ Ⅱ j g i , H L ← ∑ i ∈ Ⅱ j h i G_L←\sum_{i \in Ⅱ_j} g_i,H_L←\sum_{i \in Ⅱ_j} h_i GLijgi,HLijhi G R ← G − G L , H R ← H − H L G_R←G-G_L,H_R←H-H_L GRGGL,HRHHL s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    ③选取最大的 s c o r e score score对应的维度和拆分点作为最优拆分点。
  4. 分桶有两种模式:
    全局模式:在算法开始时,对每个维度分桶一次,后续的分裂都依赖于该分桶并不再更新。
    ①优点是:只需要计算一次,不需要重复计算。②缺点是:在经过多次分裂之后,叶结点的样本有可能在很多全局桶中是空的。
    局部模式:除了在算法开始时进行分桶,每次拆分之后再重新分桶。
    ①优点是:每次分桶都能保证各桶中的样本数量都是均匀的。②缺点是:计算量较大。
    全局模式会构造更多的候选拆分点。而局部模式会更适合构建更深的树。
  5. 分桶时的桶区间间隔大小是个重要的参数。
    区间间隔越小,则桶越多,则划分的越精细,候选的拆分点就越多。

6.3.3 加权分桶

  1. 假设候选样本的第 k k k维特征,及候选样本的损失函数的二阶偏导数为: D k = { ( x 1 , k , h 1 ) , ( x 2 , k , h 2 ) , . . . , ( x N , k , h N ) } D_k = \{(x_{1,k},h_1),(x_{2,k},h_2),...,(x_{N,k},h_N)\} Dk={(x1,k,h1),(x2,k,h2),...,(xN,k,hN)}
    定义排序函数: r k ( z ) = ∑ i ∣ ( x i , k , h i ) ∈ D k , x i , k < z h i ∑ i ∣ ( x i , k , h i ) ∈ D k h i r_k(z)=\frac{\sum_{i | (x_{i,k},h_i) \in D_k, x_{i,k} \lt z} hi}{\sum_{i | (x_{i,k},h_i) \in D_k} hi} rk(z)=i(xi,k,hi)Dkhii(xi,k,hi)Dk,xi,k<zhi
    它刻画的是:第 k k k维小于 z z z的样本的 h h h之和,占总的 h h h之和的比例。
  2. xgboost 的作者提出了一种带权重的桶划分算法。定义候选样本的下标集合为 Ⅱ Ⅱ ,拆分点 S k = { s k 1 , s k 2 , . . . , s k l } S_k =\{s_{k1},s_{k2},...,s_{kl}\} Sk={sk1,sk2,...,skl}定义为: s k , 1 = min ⁡ i ∈ Ⅱ x i , k , s k , l = max ⁡ i ∈ Ⅱ x i , k , ∣ r k ( s k , j ) − r k ( s k , j + 1 ) ∣ < ϵ s_{k,1}=\min_{i \in Ⅱ} x_{i,k},s_{k,l}=\max_{i \in Ⅱ} x_{i,k},|r_k(s_{k,j})- r_k(s_{k,j+1})| \lt \epsilon sk,1=iminxi,k,sk,l=imaxxi,k,rk(sk,j)rk(sk,j+1)<ϵ
    其中 x i , k x_{i,k} xi,k表示样本 x i x_i xi的第 k k k个特征。即:
    ①最小的拆分点是所有样本第 k k k维的最小值。②最大的拆分点是所有样本第 k k k维的最大值。③中间的拆分点:选取拆分点,使得相邻拆分点的排序函数值小于 ϵ \epsilon ϵ(分桶的桶宽),其意义为:第 k k k维大于等于 s k , j s_{k,j} sk,j,小于 s k , j + 1 s_{k,j+1} sk,j+1的样本的 h h h之和,占总的 h h h之和的比例小于 ϵ \epsilon ϵ,这种拆分点使得每个桶内的以 h h h为权重的样本数量比较均匀,而不是样本个数比较均匀。

6.3.4 缺失值

  1. 真实场景中,有很多可能导致产生稀疏。如:数据缺失、某个特征上出现很多 0 项、人工进行 one-hot 编码导致的大量的 0。
    (1)理论上,数据缺失和数值0的含义是不同的,数值 0 是有效的。
    (2)实际上,数值0的处理方式类似缺失值的处理方式,都视为稀疏特征。
    在xgboost 中,数值0的处理方式和缺失值的处理方式是统一的。这只是一个计算上的优化,用于加速对稀疏特征的处理速度。
    (3)对于稀疏特征,只需要对有效值进行处理,无效值则采用默认的分裂方向。
    注意:每个结点的默认分裂方向可能不同。
  2. 在xgboost 算法的实现中,允许对数值0进行不同的处理。可以将数值0视作缺失值,也可以将其视作有效值。
    如果数值0是有真实意义的,则建议将其视作有效值。
  3. 缺失值处理算法:
    (1)输入:
    ①数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)},样本 x i = ( x i , 1 , x i , 2 , . . . , x i , n ) T x_i = (x_{i,1},x_{i,2},...,x_{i,n})^T xi=(xi,1,xi,2,...,xi,n)T
    ②属于当前叶结点的样本集的下标集合 Ⅱ Ⅱ
    ③属于当前叶结点,且第 k k k维特征有效的样本的下标集合 Ⅱ k = { i ∈ Ⅱ ∣ x k , i ≠ m i s s i n g } Ⅱ_k=\{ i \in Ⅱ | x_{k,i} \neq missing\} k={ixk,i=missing}
    (2)输出:当前叶结点最佳分裂点。
    (3)算法:
    ①初始化: s c o r e ← 0 , G ← ∑ i ∈ Ⅱ g i , H ← ∑ i ∈ Ⅱ h i score ← 0,G←\sum_{i \in Ⅱ} g_i,H←\sum_{i \in Ⅱ} h_i score0,Gigi,Hihi
    ②遍历各维度: k = 1 , 2 , . . . , n k=1,2,...,n k=1,2,...,n
    1)先从左边开始遍历:
    (a)初始化: G L ← 0 , H L ← 0 G_L←0,H_L←0 GL0,HL0
    (b)遍历各拆分点:沿着第 k k k维,将当前有效的叶结点的样本从小到大排序。
    这相当于所有无效特征值的样本放在最右侧,因此可以保证无效的特征值都在右子树。
    然后用 j j j顺序遍历排序后的样本下标:
    G L ← G L + g j , H L ← H L + h j G_L←G_L+g_j,H_L←H_L+h_j GLGL+gj,HLHL+hj G R ← G − G L , H R ← H − H L G_R←G-G_L,H_R←H-H_L GRGGL,HRHHL s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    2)再从右边开始遍历:
    (a)初始化: G R ← 0 , H R ← 0 G_R←0,H_R←0 GR0,HR0
    (b)遍历各拆分点:沿着第 k k k维,将当前叶结点的样本从大到小排序。
    这相当于所有无效特征值的样本放在最左侧,因此可以保证无效的特征值都在左子树。
    然后用 j j j逆序遍历排序后的样本下标:
    G R ← G R + g j , H R ← H R + h j G_R←G_R+g_j,H_R←H_R+h_j GRGR+gj,HRHR+hj G L ← G − G R , H L ← H − H R G_L←G-G_R,H_L←H-H_R GLGGR,HLHHR s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) score←max(score,\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda} -\frac{G^2}{H+\lambda} ) scoremax(score,HL+λGL2+HR+λGR2H+λG2)
    ③选取最大的 s c o r e score score对应的维度和拆分点作为最优拆分点。
  4. 缺失值处理算法中,通过两轮遍历可以确保稀疏值位于左子树和右子树的情形。

6.3.5 其他优化

6.3.5.1 正则化
  1. xgboost 在学习过程中使用了如下的正则化策略来缓解过拟合:
    通过学习率 v v v来更新模型: f m ( x ) = f m − 1 ( x ) + v h m ( x ; Θ m ) , 0 < v < 1 f_m(x)=f_{m-1}(x)+vh_m(x;\Theta_m),0 \lt v \lt 1 fm(x)=fm1(x)+vhm(x;Θm),0<v<1
    类似于随机森林,采取随机属性选择。
6.3.5.2 计算速度提升
  1. xgboost 在以下方面提出改进来提升计算速度:
    预排序pre-sorted ;cache-aware 预取;Out-of-Core 大数据集
    (1)预排序
    ①xgboost 提出column block 数据结构来降低排序时间。
    每一个block 代表一个属性,样本在该block 中按照它在该属性的值排好序。
    这些block 只需要在程序开始的时候计算一次,后续排序只需要线性扫描这些block 即可。
    由于属性之间是独立的,因此在每个维度寻找划分点可以并行计算。
    ②block 可以仅存放样本的索引,而不是样本本身,这样节省了大量的存储空间。
    如:block_1 代表所有样本在feature_1 上的从小到大排序:sample_no1,sample_no2,… 。
    其中样本编号出现的位置代表了该样本的排序。
    (2)预取
    ①由于在column block 中,样本的顺序会被打乱,这会使得从导数数组中获取 g i g_i gi时的缓存命中率较低。因此xgboost 提出了cache-aware 预取算法,用于提升缓存命中率。
    ②xgboost 会以minibatch 的方式累加数据,然后在后台开启一个线程来加载需要用到的导数 g i g_i gi。这里有个折中:minibatch 太大,则会引起cache miss ;太小,则并行程度较低。
    (3)Out-of-Core
    ①xgboost 利用硬盘来处理超过内存容量的大数据集。其中使用了下列技术:
    使用block 压缩技术来缓解内存和硬盘的数据交换IO : 数据按列压缩,并且在硬盘到内存的传输过程中被自动解压缩。
    数据随机分片到多个硬盘,每个硬盘对应一个预取线程,从而加大"内存-硬盘"交换数据的吞吐量。

6.4 LightGBM

  1. 提升树的缺点:在构建子决策树时为了获取分裂点,需要在所有特征上扫描所有的样本,从而获得最大的信息增益。
    当样本的数量很大,或者样本的特征很多时,效率非常低。同时提升树也无法使用类似mini batch 方式进行训练。
  2. xgboost 缺点:
    (1)每轮迭代都需要遍历整个数据集多次。
    如果把整个训练集装载进内存,则限制了训练数据的大小。
    如果不把整个训练集装载进内存,则反复读写训练数据会消耗非常大的IO 时间。
    (2)空间消耗大。
    预排序(pre-sorted)需要保存数据的feature 值,还需要保存feature 排序的结果(如排序后的索引,为了后续的快速计算分割点)。因此需要消耗训练数据两倍的内存。
    (3)时间消耗大。
    为了获取分裂点,需要在所有特征上扫描所有的样本,从而获得最大的信息增益,时间消耗大
    (4)对cache 优化不友好,造成cache miss 。
    预排序后,feature 对于梯度的访问是一种随机访问,并且不同feature 访问的顺序不同,无法对cache 进行优化。
    在每一层的树生长时,需要随机访问一个行索引到叶子索引的数组,并且不同feature 访问的顺序也不同。
  3. LightGBM 的优点:
    更快的训练效率:在达到同样的准确率的情况下,可以达到比提升树约20倍的训练速度。
    低内存使用。
    更高的准确率。
    支持并行化学习。
    可处理大规模数据。

6.4.1 原理

  1. LightGBM 的思想:若减少训练样本的数量,或者减少样本的训练特征数量,则可以大幅度提高训练速度。
  2. LightGBM 提出了两个策略:
    Gradient-based One-Side Sampling(GOSS): 基于梯度的采样。该方法用于减少训练样本的数量。
    Exclusive Feature Bundling(EFB): 基于互斥特征的特征捆绑。该方法用于减少样本的特征。

参考

  1. 李航《统计学习方法》
  2. http://www.huaxiaozhuan.com/%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0/chapters/7_GBT.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值