树模型学习笔记整理

树模型学习笔记整理

  • 一、原理
  • 二、特征选择
    • 2.1信息增益
    • 2.2信息增益比
  • 三、生成算法
    • 3.1 ID3算法
    • 3.2 C4.5的生成算法
  • 四、决策树的剪枝
  • 五、CART算法
    • 5.1 CART生成
    • 5.2 分类树的生成
    • 5.3 CART剪枝
  • 六、提升树
    • 6.1 AdaBoost算法
    • 6.2 提升树
      • 6.2.1 提升树模型
      • 6.2.2 提升树算法
      • 6.2.3 梯度提升
      • 6.2.4 随机森林 VS 梯度提升树
    • 6.3 xgboost
      • 6.3.1 结构分
      • 6.3.2 分解结点
        • 6.3.2.1 贪心算法
        • 6.3.2.2 近似算法
      • 6.3.3 加权分桶
      • 6.3.4 缺失值
      • 6.3.5 其他优化
        • 6.3.5.1 正则化
        • 6.3.5.2 计算速度提升
    • 6.4 LightGBM
      • 6.4.1 原理
  • 参考

决策树是一种基本算法,可以解决分类和回归问题。在分类问题中,类似 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 G

你可能感兴趣的:(树模型,机器学习)