if-then
的规则,基于样本特征对其进行空间划分并分类,其优点是可读性强、分类速度快。
信息增益表示得知特征 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(D∣A)之差,即 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D) - H(D|A) g(D,A)=H(D)−H(D∣A)
一般地,熵 H ( Y ) H(Y) H(Y)与条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)之差成为互信息,决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
决策树学习应用信息增益准则选择特征。对于数据集 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=1K∣Ck∣=∣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=1n∣Di∣=∣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=Di⋂Ck, ∣ 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=1∑KD∣Ck∣log2D∣Ck∣
② 计算特征 A A A对数据集 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A) 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(D∣A)=i=1∑nD∣Di∣H(Di)=−i=1∑nD∣Di∣k=1∑K∣Di∣∣Dik∣log2D∣Ck∣∣Di∣∣Dik∣
③ 计算信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D) - H(D|A) g(D,A)=H(D)−H(D∣A)
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益 比可以对这一问题进行校正,这是特征选择的另一准则。
特征 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=1nD∣Di∣log2D∣Di∣, n n n是特征 A A A取值的个数。
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。
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=1∑∣T∣NtHt(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)=−k∑NtNtklog2NtNtk
另外,损失函数还可以表示为 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=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
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是在给定输入随机变量 X X X条件下输出随机变量 Y Y Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
决策树的生成及时递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼系数最小化准则,进行特征选择,生成二叉树。
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=1∑McmI(x∈Rm)
当输入空间的划分确定时,可以用平方误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i \in R_m} (y_i - f(x_i))^2 ∑xi∈Rm(yi−f(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(yi∣xi∈Rm)
问题是怎样对输入空间进行划分。这里采用启发式的方法,选择第 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)={x∣xj≤s}和R2(j,s)={x∣xj>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[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)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(yi∣xi∈R1(j,s))和c^2=ave(yi∣xi∈R2(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[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)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)={x∣xj≤s},R2(j,s)={x∣xj>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∑(xi∈Rm(j,s))yi,x∈Rm,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=1∑Mc^mI(x∈Rm)
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
在分类问题中,假设有 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=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,弱样本点属于第1个类的概率是 p p p,则概率分布的基尼指数为 G i n i ( p ) = 2 p ( 1 − p ) Gini(p) = 2p(1-p) Gini(p)=2p(1−p)
对于给定的样本集合 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)=1−k=1∑K(D∣Ck∣)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)∈D∣A(x)=α},D2=D−D1
则在特征 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)=D∣D1∣Gini(D1)+D∣D2∣Gini(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决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或者没有更多特征。
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)=∣Tt∣−1C(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α
提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习性能最好的方法之一。
提升方法实际使用加法模型与前向分步算法。以决策树为基函数的提升方法称为提升树。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。
提升树模型可以表示为决策树的加法模型: f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_M(x) = \sum_{m=1}^{M} T(x;\Theta_m) fM(x)=m=1∑MT(x;Θm)
其中, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)表示决策树; Θ m \Theta_m Θm为决策树的参数; M M M为树的个数。
提升树算法采用前向分步算法。首先确定初始提升树 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)=fm−1(x)+T(x;Θm)
其中, f m − 1 ( x ) f_{m-1}(x) fm−1(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=1∑NL(yi,fm−1(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 xi∈X⊆ℜn, X \mathcal X X为输入空间, y i ∈ Y ⊆ ℜ y_i \in \mathcal Y \subseteq \real yi∈Y⊆ℜ, 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=1∑JcjI(x∈Rj)
其中,参数 Θ = { ( 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)=fm−1(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=1∑MT(x;Θm)
在前向分步算法的第 m m m步,给定当前模型 f m − 1 ( x ) f_{m-1}(x) fm−1(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=1∑NL(yi,fm−1(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))=(y−f(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,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]2
这里, r = y − f m − 1 ( x ) r = y-f_{m-1}(x) r=y−fm−1(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 xi∈X⊆ℜn,yi∈Y⊆ℜ
提升树 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=yi−fm−1(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)=fm−1(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=1∑MT(x;Θm)
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失时,每一步优化是简单的。但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,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)=fm−1(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,fm−1(x)+hm(x;Θm))=L(y,fm−1(x))+∂fm−1(x)∂L(y,fm−1(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,fm−1(x)=∂fm−1(x)∂L(y,fm−1(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)=−∂fm−1(x)∂L(y,fm−1(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 xi∈X⊆ℜn,yi∈Y⊆ℜ;损失函数 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=1∑NL(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)=fm−1(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=argcminxi∈Rmj∑L(yi,fm−1(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)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
(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=1∑Mj=1∑JcmjI(x∈Rmj)
算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树。第2(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值、第2(b)步估计回归树叶结点区域,以拟合残差的近似值。第2©步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2(d)步得到输出的最终模型 f ^ ( x ) \hat f(x) f^(x)。
梯度提升树用于分类模型时,是梯度提升决策树GBDT;用于回归问题时,是梯度提升回归树GBRT。