决策树

本文主要讲述决策树的原理,优缺点,以及使用方法。部分内容参考统计学习方法

1.什么是决策树

决策树是一种基本的分类和回归方法,其模型呈树形结构,可以认为是if-then的规则集合。其优点是具有很好的可读性,训练和预测的速度快。训练时,利用训练数据,根据损失函数最小化的原则建立决策树模型,预测时,直接利用模型进行分类或回归。决策树训练通常包括3个步骤:特征选择、决策树生成以及修剪。后边的章节会对其进行详细讨论。决策树的其中一个缺点是容易过拟合,因此在生成决策树之后需要对其进行修剪处理。决策树_第1张图片
决策树的结构如上图。树中一共有两种节点,内部节点(圆形)代表一个属性的分类,叶节点(方形)代表一个类。从根节点开始,对输入例子的某一特征进行测试,根据测试结果将其归到某一个子树中,递归进行直到抵达树的叶节点为止,其叶节点的类别即为输入例子的类别。

1.1 决策树与条件概率分布

决策树本质上是对于给定特征空间上的一个划分,树上的每一条从根节点到叶节点的路径将特征空间划分成互不相交的一个区域。每个区域的类别分布构成了条件概率分布,假设X为表示特征的随机变量,Y为表示类的随机变量,则这个条件概率分布可以表示为P(X|Y),各个叶节点上的条件概率往往偏向与某一个类,也就是属于某一个类的概率比较高。决策树在分类时则将落到改叶节点的事例划分为概率最高的类别。

2.决策树训练过程

2.1 训练策略

决策树的学习本质是从训练数据中归纳出一组与其吻合的规则,或者说是通过对特征空间的划分使每个子空间的分类与训练数据吻合,同时能够有较好的泛化能力。这种划分一般来说有无穷多个,因此需要一个策略来进行决策树的生成。

决策树用损失函数来实现这一个目标,通过建立一个正则化后的损失函数,采取最小化损失函数的策略来建立决策树。

即使确立了最小化损失函数的目标,在无穷多个决策树中选取最优的一个仍然是一个非常困难的问题。

为了解决这一问题,采取贪心算法构建决策树,可以获得近似最优解。在构建决策树时,不断递归地选取能够时损失函数最小化的特征来对样本进行划分并构建子树根节点,直到某一个节点上所有的样本都位于同一类,或者满足于其他条件时,停止划分该子树。按照这样方法,总决策树下边的每一个子树都是在当前条件下面的一个最好的分类。

以上的方法可以构建一个对训练样本表现很完美的决策树,但是对未知的数据确未必。当树的深度过大时,或者子树上的样本过少时,再对其进行划分可能会造成过拟合。因此在生成决策树之后,需要对其剪枝,删除过于细分的叶节点,使其退回到父节点。

2.2 特征选择

在构建决策树的时候,最重要的一步是要决定需要选取的特征。通常来说,选取的特征要与最终的分类结果有一定的相关性,如果选取该特征后与随机分类的结果没有太大分布,这样的特征是无效的。
下边用书中的例子对选取过程作一个介绍决策树_第2张图片
表中是一个由15个训练样本组成的申请贷款数据,每个样本有4个特征。第一个特征是年龄,分为青年、中年、老年3类,第二个特征是是否工作,有是和否两类,第三个特征是是否有房子,有是和否两类,第四是信贷情况,有一般、好、非常好3类。训练类别有两类,分别是是和否。

在构建决策树时,我们首先想从4个特征中选取一个,比如是否工作一项,将训练数据分成两类。或者选取年龄特征,将数据分成3类。这样就构建出不同的决策树。如下图
决策树_第3张图片
这样的决策树可以有多种,但是哪一种是最好的呢? 直观上说,如果按照特征分类结束后,叶节点中的样本类别是更加偏向某一类的,那么按照这个特征分类就比较好了。在数学上可以通过信息增益来描述这一情况。

2.3 信息增益

一个好的决策树,分类完成后在叶节点中的样本的类别相比全部训练样本应该更加纯。比如在上边例子中,所有样本中类别为是和否的分布占比为60%和40%,如果我们用是否有工作来进行分类,那分类完成后,有工作的样本类别是和否分布占比为100%,0%,没工作的样本类别是和否分布占比为40%,60%。可以看出,用工作来进行样本的分类比原样本是有提升的。

数学上用熵来表示随机变量的混乱度,设有一个随机变量X,其概率分布为
P ( X = x i ) = p i P(X=x_i) = p_i P(X=xi)=pi
则其熵可以定义为
H ( p ) = − Σ i = 1 n p i l o g p i H(p) = -\Sigma_{i=1}^{n}p_ilogp_i H(p)=Σi=1npilogpi
熵越大时,则表明随机变量的混乱度越高,下边举例说明。
假设随机变量只有两个取值 X 1 , X 2 X_1,X_2 X1,X2,则其概率分布的取值为p和1-p,此时的熵为 H ( p ) = − p l o g p − ( 1 − p ) l o g ( 1 − p ) H(p)=-plogp-(1-p)log(1-p) H(p)=plogp(1p)log(1p)
当p=0或p=1,也就是随机变量中只有1个值的时候,此时的熵为0(定义0log0=0)。当p不为0或1时,熵都会大于0,下图是熵 H ( p ) H(p) H(p)随p变化的图像,可以看到当p=0.5时,也就是随机变量完全均匀时,熵取最大值。

决策树_第4张图片

在计算经过决策树分类后的样本的熵时,需要用到条件熵,定义如下:
设有随机变量(X,Y),其联合概率分布为 P ( X = x i , Y = y j ) = p i j P(X=x_i,Y=y_j) = p_{ij} P(X=xi,Y=yj)=pij
则条件熵定义为 H ( Y ∣ X ) = Σ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X) = \Sigma_{i=1}^{n}p_iH(Y|X=x_i) H(YX)=Σi=1npiH(YX=xi)
意为在随机变量X的条件下Y的条件熵。则样本的熵和条件熵的差g(D,A)即为信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A) = H(D)-H(D|A) g(D,A)=H(D)H(DA)
下边依然用上方例子来说明如何计算信息增益
首先计算样本的熵
H ( D ) = − 9 15 l o g 9 15 − 6 15 l o g 6 15 = 0.971 H(D) = -\frac{9}{15}log\frac{9}{15}-\frac{6}{15}log\frac{6}{15}=0.971 H(D)=159log159156log156=0.971

样本分别有4个特征,分别是年龄,有无工作,有无房子,信贷情况,用 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1,A2,A3,A4表示这4个特征并分别计算条件熵,首先是年龄,青中老年各占 1 3 \frac{1}{3} 31

g ( D , A 1 ) = H ( D ) − [ 1 3 H ( D 1 ) + 1 3 H ( D 2 ) + 1 3 H ( D 3 ) ] = 0.971 − [ 1 3 ( − 3 5 l o g 3 5 − 2 5 l o g 2 5 ) + 1 3 ( − 3 5 l o g 3 5 − 2 5 l o g 2 5 ] ) + 1 3 ( − 1 5 l o g 1 5 − 4 5 l o g 4 5 ) ] = 0.971 − 0.888 = 0.083 \begin{aligned} g(D,A_1) &= H(D) - [\frac{1}{3}H(D_1)+\frac{1}{3}H(D_2)+\frac{1}{3}H(D_3)]\\ &=0.971-[\frac{1}{3}(-\frac{3}{5}log\frac{3}{5}-\frac{2}{5}log\frac{2}{5})\\ &+\frac{1}{3}(-\frac{3}{5}log\frac{3}{5}-\frac{2}{5}log\frac{2}{5}])+\frac{1}{3}(-\frac{1}{5}log\frac{1}{5}-\frac{4}{5}log\frac{4}{5})]\\ &=0.971-0.888=0.083 \end{aligned} g(D,A1)=H(D)[31H(D1)+31H(D2)+31H(D3)]=0.971[31(53log5352log52)+31(53log5352log52])+31(51log5154log54)]=0.9710.888=0.083

其中 D 1 , D 2 , D 3 D_1,D_2,D_3 D1,D2,D3分别取值为青年,中年,老年。
接下来计算有无工作这个特征的信息增益:
g ( D , A 1 ) = H ( D ) − [ 10 15 H ( D 1 ) + 5 15 H ( D 2 ) ] = 0.971 − [ 10 15 ( − 6 10 l o g 6 10 − 4 10 l o g 4 10 ) + 5 15 ( − 1 l o g 1 − 0 l o g 0 ) ] = 0.3324 \begin{aligned} g(D,A_1) &= H(D) - [\frac{10}{15}H(D_1)+\frac{5}{15}H(D_2)]\\ &=0.971-[\frac{10}{15}(-\frac{6}{10}log\frac{6}{10}-\frac{4}{10}log\frac{4}{10})\\ &+\frac{5}{15}(-1log1-0log0)]\\ &=0.3324 \end{aligned} g(D,A1)=H(D)[1510H(D1)+155H(D2)]=0.971[1510(106log106104log104)+155(1log10log0)]=0.3324
其中 D 1 , D 2 D_1,D_2 D1,D2分别取值无工作和有工作,有无房子和信贷情况的计算方法类似,这里就不赘述,两者的信息增益分别是0.42和0.363。比较发现用有无房子这个特征的信息增益最大,因此选择这个特征对数据划分是最好的。

以信息增益作为数据划分依据的话有个缺点就是会倾向于选择取值较多的
特征,比如信贷情况有3种情况,而有无工作只有2种情况,计算信息增益时信贷情况这个特征的增益会偏大。利用信息增益比可以改善这个情况。信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据中特征A的熵之比
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 ) = − ( 3 × 1 3 l o g 1 3 ) = 1.09 H_A(D)=-(3\times\frac{1}{3}log\frac{1}{3})=1.09 HA(D)=(3×31log31)=1.09

2.4 决策树的生成

ID3算法的核心是在决策树的各个节点上利用信息增益来选取特征,递归构建决策树。具体方法为:从根节点开始,对其包含的所有样本的所有特征计算信息增益,选取增益最大的特征作为节点特征,建立子节点,再对子节点递归进行以上操作,直到没有再能够分类的特征,或分类后信息增益小于某个阈值,停止构建树。

继续利用以上例子说明,上节计算说明,有无房子这个特征的信息增益是最大的,因此首先利用这个特征来构建树的根节点,将样本分为两个子集 D 1 , D 2 D_1,D_2 D1,D2,其中 D 1 D_1 D1为有房子, D 2 D_2 D2为没有房子,其中 D 1 D_1 D1中所有样本类别均为是,因此不必再对 D 1 D_1 D1继续分类。
下边针对 D 2 D_2 D2样本分别对年龄( A 1 A_1 A1),有无工作( A 2 A_2 A2),信贷情况( A 3 A_3 A3)进行信息增益的计算,发现有无工作的信息增益是最大的,因此将其作为节点特征,对样本进行分类。分类完成后,有工作的样本类别都标记为"是",没工作的样本类别都标记为"否"。样本不必再分类了。因此生成了一个如下图的决策树

决策树_第5张图片

2.5 决策树的剪枝

以上方法在生成决策树时往往能够对训练数据表现很好,但是对未知的数据确不一定,这是由于在训练过程中树的深度过大,产生了过拟合。为了避免这种情况发生,在树生成之后,要对其进行剪枝处理,对于删除分类过细的叶节点,使其退化回其父节点,有望可以改善其过拟合的程度。下边介绍一种正则化剪枝方式。

剪枝通常是通过最小化损失函数来进行的,设树T的叶节点个数为|T|,t是树的叶节点,每个叶节点有 N t N_t Nt个样本,其中属于类k的样本有 N t k N_{tk} Ntk个, H t ( T ) H_t(T) Ht(T)为叶节点t上的熵, α ≥ 0 \alpha\geq0 α0 是待定参数,则决策树的损失函数可以定义为
C α ( T ) = Σ t = 1 T N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\Sigma_{t=1}^{T}N_tH_t(T)+\alpha|T| Cα(T)=Σt=1TNtHt(T)+αT

对于上式第一项,当某个叶节点t中的各类样本分布越均匀,证明该节点的分类效果越差,得到的熵也就越大,因此该项可以表示决策树的分类误差。式中第二项是描述决策树的复杂度的,当决策树越复杂,叶节点也就越多,该项也就越大,参数 α \alpha α 是自定义参数,用于决定此项在损失函数的占的比例,当此项为0时,损失函数不考虑决策树的复杂度。

定义好决策树的损失函数后,对其剪枝就十分简单了,对于一棵生成好的树,计算每个叶节点的熵,再递归计算删除该节点后父节点的熵,然后得出损失函数,如果删除节点后损失函数变小,则该节点予以删除,否则保留,直至所有叶节点计算完毕。

3. CART算法

CART算法由Breiman等人在1984年提出,是一种构建决策树的方法,其构建、剪枝过程与上述提到的类似,其方法能够用于分类也能够用于回归。
与上述方法有点不同的是,CART算法所生成的决策树都是二叉树。其算法主要分为生成树和剪枝两个过程,生成的时候树要尽量大而深,然后再通过剪枝在大树上生成一棵表现最好的子树。

3.1 回归树生成

给定数据训练集D
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) . . . . ( x n , y n ) } D=\{(x_1,y_1),(x_2,y_2),(x_3,y_3)....(x_n,y_n)\} D={(x1,y1),(x2,y2),(x3,y3)....(xn,yn)}
其中 x i x_i xi是输入事例的特征值, y i y_i yi是事例的输出值。现在假定某一颗决策树将特征空间分为M个单元 R 1 , R 2 . . . R M R_1,R_2...R_M R1,R2...RM,也就是树中有M个叶节点。每个单元都有一个固定的输出值 c m c_m cm。现在假定对于训练集中的某个事例 x i x_i xi,其模型输出值是 f ( x i ) f(x_i) f(xi),则可以用平方误差 Σ ( y i − f ( x i ) 2 \Sigma(y_i-f(x_i)^2 Σ(yif(xi)2来定义回归树的预测误差。最小化平方误差可以得到树中每个单元的输出值 c m c_m cm的最优值。
容易得知,某个单元 c m c_m cm的最优值即为其单元内所有样本输出值的均值, c m = y ‾ m ( x m ∈ R m ) ( 1 ) c_m=\overline y_m(x_m\in R_m)\qquad(1) cm=ym(xmRm)(1)

接下来的问题是如何对输入特征进行划分才能使平方误差最小。假设选取了某个样本的某个特征值 x j x_j xj,以及其值s来进行划分,那么样本空间就可以划分为两部分
R 1 ( j , s ) = { x ∣ x ≤ s } R 2 ( j , s ) = { x ∣ x > s } R_1(j,s)=\{x|x\leq s\} \qquad R_2(j,s)=\{x|x>s\} R1(j,s)={xxs}R2(j,s)={xx>s}
然后可以根据方程1求得损失函数关于 c 1 , c 2 c_1,c_2 c1,c2的最小值
m i n c 1 Σ x i ∈ R 1 ( y i − c 1 ) 2 + m i n c 2 Σ x i ∈ R 2 ( y i − c 2 ) 2 \mathop{min}\limits_{c1} \mathop\Sigma \limits_{x_i\in R_1}(y_i-c_1)^2 +\mathop{min}\limits_{c2} \mathop\Sigma \limits_{x_i\in R_2}(y_i-c_2)^2 c1minxiR1Σ(yic1)2+c2minxiR2Σ(yic2)2

之后再通过遍历所有样本的所有特征值j、s,用上式计算损失函数计算其关于 c 1 c_1 c1, c 2 c_2 c2的最小值,得到其关于j、s的最小值即为临界点,可将其划分为两个区域。
m i n j , s [ m i n c 1 Σ x i ∈ R 1 ( y i − c 1 ) 2 + m i n c 2 Σ x i ∈ R 2 ( y i − c 2 ) 2 ] \mathop{min}\limits_{j,s}[\mathop{min}\limits_{c1} \mathop\Sigma \limits_{x_i\in R_1}(y_i-c_1)^2 +\mathop{min}\limits_{c2} \mathop\Sigma \limits_{x_i\in R_2}(y_i-c_2)^2] j,smin[c1minxiR1Σ(yic1)2+c2minxiR2Σ(yic2)2]

对于划分后的节点,递归用上法对节点中的数据继续划分,直至满足停止条件为止。

3.2 分类树的生成

对于分类树的生成,其基本方法与第二节时用到的基本一致。不同之处有几点,在CART中,衡量样本的均匀度用的不是熵,而是基尼系数,假设样本中有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) = \Sigma^K_{k=1}p_k(1-p_k)=1-\Sigma^K_{k=1}p_k^2 Gini(p)=Σk=1Kpk(1pk)=1Σk=1Kpk2
对于给定样本集合D,其基尼系数定义如下:
G i n i ( D ) = 1 − Σ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\Sigma^K_{k=1}(\frac{|C_k|}{|D|})^2 Gini(D)=1Σk=1K(DCk)2
其中 ∣ C k ∣ |C_k| Ck代表类k的样本个数

如果样本集合D根据特征A是否取值为a分为 D 1 D_1 D1 D 2 D_2 D2两部分,则在特征A下样本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)
决策树_第6张图片
由上图可以看到,分类误差率、基尼系数、熵三者关于p的分布趋势是一致的,都是在p=0.5时取得极大值。下边讲述利用CART构建分类树的步骤。

对于节点下所有训练数据,对于其每一个特征A的所有可能值a,根据样本对是否A=a进行划分生成两个子集,并计算其基尼系数。

计算完毕后选取基尼系数最小的特征A和其值a作为划分依据,生成两个子节点,将数据划分到两个子节点中去。

之后递归进行,直到满足停止条件。停止条件一般有:样本的基尼系数小于阈值,样本个数小于阈值,已经没有特征。

3.3 CART剪枝

通过从一棵生长好的决策树剪去一些节点,可以令模型变得简单,从而使决策树对未知数据的预测变得更准确。下边讲述一下简化后的剪枝过程。

自下而上分别对树的每一个节点进行剪枝,使节点下的子树退化为叶节点,用多数表决法决定退化后节点中中的类别。直到树只剩根节点,得到一系列剪枝后的树 T 1 , T 2 , T 3 . . . . T n T_1,T_2,T_3....T_n T1,T2,T3....Tn。利用交叉验证法在子树序列中获取最优的子树 T α T_\alpha Tα作为最终的决策树输出。

4. 提升方法

提升方法在统计学习中十分常用,在同一批训练数据中,通过不断改变训练数据的权重,学习多个分类器,从而提升最终的决策性能。本节首先讲述Adaboost算法,然后讲述boosting tree算法。

4.1 Adaboost概述

在分类问题中,只用一个分类器往往会使结果有所偏差,而如果能够生成多个不同的分类器,将其预测结果组合在一起,就有望能够使预测结果更加准确,提升其预测性能。Adaboost通过不断改变训练数据中每一个样本的权重,使被错误分类的样本权重更高,训练出多个弱分类器,再将这些弱分类器的预测结果加权组成一个强分类器,实现预测性能的提升。

4.2 Adaboost 算法概述

假设现在有一个二分类的训练数据集
T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) . . . ( x N , y N ) } T=\{(x_1,y_2),(x_2,y_2)...(x_N,y_N)\} T={(x1,y2),(x2,y2)...(xN,yN)}
其中 x i x_i xi是特征向量, y i y_i yi是数据标记,取1或-1,假设需要生成M个弱分类器,则通过以下算法可以将M个弱分类器组合一个强分类器。

  • 初始化训练样本的权值分布 D 1 = { w 11 , w 12 . . . w 1 N } w 1 i = 1 N D_1=\{w_{11},w_{12}...w_{1N}\} \qquad w_{1i} = \frac{1}{N} D1={w11,w12...w1N}w1i=N1
  • 对于m=1,2…M
  • 使用带权重的训练样本学习一个在当前权重下误差率最低的弱分类器 f m ( x ) f_m(x) fm(x),其中 f ( x i ) ∈ { − 1 , 1 } , i = 1 , 2... N f(x_i)\in \{-1,1\},i=1,2...N f(xi){1,1},i=1,2...N
  • 计算分类器在当前带权重的样本下的误差率, e m = Σ i = 1 N w i e_m=\Sigma_{i=1}^Nw_i em=Σi=1Nwi 只对 f ( x i ) ̸ = y i f(x_i)\not=y_i f(xi)̸=yi
  • 计算当前分类器 f m ( x ) f_m(x) fm(x) 的系数 α m = 1 2 l o g 1 − e m e m \alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} αm=21logem1em
  • 更新训练集的权重值分布:
    D m + 1 = ( { w m + 1 , 1 , w m + 1 , 2 . . . w m + 1 , N } ) D_{m+1} = (\{w_{m+1,1},w_{m+1,2}...w_{m+1,N}\}) Dm+1=({wm+1,1,wm+1,2...wm+1,N})
    w m + 1 , i = w m i Z m e − α m y i f m ( x i ) w_{m+1,i}=\frac{w_{mi}}{Z_m}e^{-\alpha_my_if_m(x_i)} wm+1,i=Zmwmieαmyifm(xi)
    Z m = Σ i = 1 N w m i e − α m y i f m ( x i ) Z_m = \Sigma_{i=1}^Nw_{mi}e^{-\alpha_my_if_m(x_i)} Zm=Σi=1Nwmieαmyifm(xi)
    上式虽然看起来很复杂,但是都只是简单计算。之后再利用更新权重后的数据新生成一个分类器,一共生成M个。
  • 构建基本分类器的线性组合 f ( x ) = Σ m = 1 M α m f m ( x ) f(x)=\Sigma_{m=1}^M\alpha_mf_m(x) f(x)=Σm=1Mαmfm(x)
  • 最终分类器为 G ( x ) = s i g n ( f ( x ) ) G(x)=sign(f(x)) G(x)=sign(f(x))

对于此算法,有几点需要说明。
系数 α m \alpha_m αm是与误差率 e m e_m em相关的,误差率越高,系数越小。当误差率大于0.5时,系数为负数,误差率小于0.5时,系数为正数。
误差率计算是与权重相关的,在上一个分类器中被误分类的样本会在本次生成中增加权重,如果再次误判,则会增加误差率的值。
α \alpha α是最终分类器线性组合时的系数。系数越高,表明此分类器性能越好。最终 f ( x ) f(x) f(x)的符号代表实例预测的分类, f ( x ) f(x) f(x)的值代表此分类的确信度。

4.3 Adaboost 算法实例

在这里插入图片描述
给定如图所示的训练数据,假设弱分类器由xv产生,其中阈值v使分类器在样本上的误差率最低,现在用Adaboost算法构建一个强分类器。

训练数据一共有10个样本,初始化样本权重为 D 1 = ( w 11 , w 12 , w 13 . . . w 1 n ) w 1 i = 0.1 i = 1 , 2... n D_1=(w_{11},w_{12},w_{13}...w_{1n})\\ w_{1i}=0.1 \qquad i=1,2...n D1=(w11,w12,w13...w1n)w1i=0.1i=1,2...n
在此样本上,当v=2.5时,分类器的错误率最低,因此第一个分类器 G 1 ( x ) G_1(x) G1(x)
G ( x ) = { 1 ( x < 2.5 ) − 1 ( x > 2.5 ) G(x)=\left\{ \begin{aligned} &1 \qquad &(x<2.5) \\ &-1 \qquad &(x>2.5) \end{aligned} \right. G(x)={11(x<2.5)(x>2.5)

计算 f ( x ) f(x) f(x)在此样本上的误差率 e 1 = 0.3 e_1=0.3 e1=0.3
计算 f ( x ) f(x) f(x)的系数, α 1 = 1 2 l o g 1 − e 1 e 1 = 0.4236 \alpha_1=\frac{1}{2}log\frac{1-e_1}{e_1}=0.4236 α1=21loge11e1=0.4236
更新样本权重
D 2 = ( w 21 , w 22 , w 23 . . . w 2 n ) w 2 i = w 1 i Z 1 e x p ( − α 1 y i f 1 ( x i ) ) D 2 = ( 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.1667 , 0.1667 , 0.1667 , 0.07143 ) f 1 ( x ) = 0.4326 G 1 ( x ) D_2=(w_{21},w_{22},w_{23}...w_{2n})\\ w_{2i}=\frac{w_{1i}}{Z_1}exp(-\alpha_1y_if_1(x_i))\\ D_2=(0.07143,0.07143,0.07143,0.07143,\\0.07143,0.07143,0.1667,0.1667,0.1667,0.07143)\\ f_1(x)=0.4326G_1(x) D2=(w21,w22,w23...w2n)w2i=Z1w1iexp(α1yif1(xi))D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.1667,0.1667,0.1667,0.07143)f1(x)=0.4326G1(x)

依次类推继续计算,当得到第三个分类器 G 3 G_3 G3时,总分类器 f 3 f_3 f3能够将样本完美分类,此时可以获取最终分类器
G ( x ) = s i g n [ f 3 ( x ) ] = s i g n [ 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x ) ] G(x)=sign[f_3(x)]=sign[0.4236G_1(x)+0.6496G_2(x)+0.7514G_3(x)]\\ G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]
其中 G 1 ( x ) G_1(x) G1(x)阈值取2.5, G 2 ( x ) G_2(x) G2(x)阈值取8.5, G 3 ( x ) G_3(x) G3(x)阈值取5.5

4.4 提升树

在Adaboost中,最终输出的强分类器是若干弱分类器的线性组合。如果弱分类器由决策树组成,则强分类器就称为提升决策树(boosting tree)。

利用提升决策树算法主要解决分类问题和回归问题。对于分类问题,其步骤比较简单,与上节中的例子类似,递归在多维的数据找到某个特征及阈值,使数据分成两类后,误差率最低。并根据误差更新权重。对于回归问题,可以用以下方法构建回归树:

  • 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) \qquad m=1,2...M fm(x)=fm1(x)+T(x;Θm)m=1,2...M 其中M为树的个数
  • 到达第m步要求解 T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)时,认为 f m − 1 ( x ) f_{m-1}(x) fm1(x)已知,需要求解树的参数 Θ m \Theta_m Θm
    Θ m = a r g m i n Θ m Σ i = 1 N L ( y i , f m − 1 ( x i ) + T ( x i ; Θ m ) ) \Theta_m=\mathop{argmin}\limits_{\Theta_m}\Sigma_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m)) Θm=ΘmargminΣi=1NL(yi,fm1(xi)+T(xi;Θm))
    求参数 Θ m \Theta_m Θm使得样本的损失函数取最小值即可。

在回归问题中,当损失函数为平方误差损失函数时
L ( y , f ( x ) ) = ( y − f ( x ) ) 2 = ( y − f m − 1 ( x ) − T ( x ; Θ m ) ) 2 \begin{aligned} L(y,f(x))&=(y-f(x))^2\\ &=(y-f_{m-1}(x)-T(x;\Theta_m))^2 \end{aligned} L(y,f(x))=(yf(x))2=(yfm1(x)T(x;Θm))2

T ( x ; Θ m ) = y − f m − 1 ( x ) T(x;\Theta_m)=y-f_{m-1}(x) T(x;Θm)=yfm1(x)时,损失函数取的最小值,因此在每一次的生成中,只要拟合每个样本预测值和标记值之差即可,这个值称为残差。

4.5 提升树应用例子

决策树_第7张图片
根据以上数据,拟合一个提升树的步骤如下。
首先需要求解以下问题
m i n s [ m i n c 1 Σ x i ∈ R 1 ( y i − c 1 ) 2 + m i n c 2 Σ x i ∈ R 2 ( y i − c 2 ) 2 ] \mathop{min}\limits_{s}[\mathop{min}\limits_{c1} \mathop\Sigma \limits_{x_i\in R_1}(y_i-c_1)^2 +\mathop{min}\limits_{c2} \mathop\Sigma \limits_{x_i\in R_2}(y_i-c_2)^2] smin[c1minxiR1Σ(yic1)2+c2minxiR2Σ(yic2)2]
其中s为数据切分点
R 1 = { x ∣ x ≤ s } R 2 = { x ∣ x > s } R_1=\{x|x\le s\}\qquad R_2=\{x|x>s\} R1={xxs}R2={xx>s}
容易得出c1,c2为R1,R2集合中标签值的均值
c 1 = Σ i ∈ R 1 y i N 1 c 1 = Σ i ∈ R 2 y i N 2 c_1=\frac{\mathop{\Sigma}\limits_{i\in R_1}y_i}{N_1}\qquad c_1=\frac{\mathop{\Sigma}\limits_{i\in R_2}y_i}{N_2} c1=N1iR1Σyic1=N2iR2Σyi
其中 N 1 , N 2 N_1,N_2 N1,N2 R 1 , R 2 R_1,R_2 R1,R2中的样本个数。
根据所给样本,可以考虑以下数个切分点:
1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5 , 9.5 1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5 1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
对每个切分点,分别求
Σ x i ∈ R 1 ( y i − c 1 ) 2 + Σ x i ∈ R 2 ( y i − c 2 ) 2 \mathop\Sigma \limits_{x_i\in R_1}(y_i-c_1)^2 + \mathop\Sigma \limits_{x_i\in R_2}(y_i-c_2)^2 xiR1Σ(yic1)2+xiR2Σ(yic2)2
其中的最小值作为此树的切分点。计算的结果如下
在这里插入图片描述
当s=6.5时,得到的损失误差最小,因此取此值作为第一棵树的切分点。对于此值,求得 c 1 = 6.24 , c 2 = 8.91 c_1=6.24,c_2=8.91 c1=6.24,c2=8.91,所以回归树 T 1 ( x ) T_1(x) T1(x)

T 1 ( x ) = { 6.24 x < 6.5 8.91 x ≥ 6.5 f 1 ( x ) = T 1 ( x ) T_1(x)=\left\{ \begin{aligned} 6.24\qquad x<6.5\\ 8.91\qquad x\ge 6.5\\ \end{aligned} \right.\\ f_1(x)=T_1(x) T1(x)={6.24x<6.58.91x6.5f1(x)=T1(x)

T 1 ( x ) T_1(x) T1(x)拟合上表数据得到的残差如下图在这里插入图片描述

f 1 ( x ) f_1(x) f1(x)拟合训练数据的平方训练误差为
L ( y , f 1 ( x ) ) = Σ i = 1 10 ( y i − f 1 ( x ) ) 2 = 1.93 L(y,f_1(x))=\Sigma_{i=1}^{10}(y_i-f_1(x))^2=1.93 L(y,f1(x))=Σi=110(yif1(x))2=1.93

第二步求 T 2 ( x ) T_2(x) T2(x),方法与求 T 1 ( x ) T_1(x) T1(x)差不多,只是现在拟合的是残差,也就是上表中的数据,得到的 T 2 ( x ) T_2(x) T2(x)

T 2 ( x ) = { − 0.52 x < 3.5 0.22 x ≥ 3.5 T_2(x)=\left\{ \begin{aligned} -0.52\qquad x<3.5\\ 0.22\qquad x\ge 3.5\\ \end{aligned} \right.\\ T2(x)={0.52x<3.50.22x3.5

f 2 ( x ) = T 1 ( x ) + T 2 ( x ) = { 5.72 x < 3.5 6.46 3.5 ≤ x < 6.5 9.13 x ≥ 6.5 f_2(x)=T_1(x)+T_2(x)=\left\{ \begin{aligned} &5.72\qquad x<3.5\\ &6.46\qquad 3.5\le x<6.5\\ &9.13\qquad x\ge6.5 \end{aligned} \right.\\ f2(x)=T1(x)+T2(x)=5.72x<3.56.463.5x<6.59.13x6.5
f 2 ( x ) f_2(x) f2(x)拟合训练数据的平方误差为0.79,如果此误差满足要求,则可以停止训练,否则可以继续拟合残差得到 f 3 ( x ) , f 4 ( x ) f_3(x),f_4(x) f3(x),f4(x)等等。

4.6 梯度提升决策树

提升树利用加法模型和前向分步算法实现,对于损失函数是平方损失函数(回归问题)或者是指数损失函数(分类问题)时,都是很好做的。但是如果是一般的损失函数,比如说平方损失或者指数损失函数带一个正则项的,就不能简单通过拟合残差或者改变训练数据权重来拟合了。针对这个问题,Freidman提出了梯度提升算法,通过拟合损失函数对当前模型的负梯度的值来作为残差近似值。
− [ ∂ L ( y , f ( x ) ) ∂ ( f ( x ) ) ] -[\frac{\partial L(y,f(x))}{\partial(f(x))}] [(f(x))L(y,f(x))]
梯度提升决策树有许多优点,如泛化能力强等,其实现也与上节一样,从拟合残差改为拟合损失函数对模型的负梯度值即可,不在这里继续讲述。

5. 随机森林

文章的最后部分讲一下随机森林。随机森林与上章所说的增强方法类似,都是集成学习,通过学习多个弱分类器,组合成一个能力强的分类器。上章说说的boosting方法,是通过按顺序一个个生成分类器,下一个的分类器生成与前面所有分类器的分类结果相关。
随机森林则是通过在训练样本中随机选取一部分来训练一个分类器。通过多次随机选取,能够并行生成任意多个彼此没有相关性的分类器。并通过每个分类器在总的训练集或者验证集上的表现来决定其权重。其训练方法也可以有多种,能够用决策树、Logistic Regression、SVM等等。

在抽取样本的时候,也有多种方法。比如说在训练样本N中有放回地均匀取n个样本,有放回的意思是抽出来的n个样本是可以有重复的。

除了可以随机抽取样本,样本的特征也可以随机抽取,在用决策树生成分类器时,当选取分裂节点的特征时,可以只对样本中的某些特征进行选取。比如样本有20个特征,可以每次生成子树时,在其中抽取10个来作为候选特征。训练集中有些特征和样本的标记可能相关性非常强,用这种方法生成的分类器可以有效减少高关联特征和样本标记的依赖,减少过拟合的程度。

随机森林能够并行生成大量独立准确率高的分类器,不容易过拟合,并且能够处理多个变量,是一种优秀的分类方法。

6.总结

本文主要参考李航老师的《统计学习方法》,讲述了决策树的分类原理以及决策树的生成算法。除了基本的决策树,还讲述了通过集成学习,如何将多个弱分类器合成一个强分类器。实际使用中决策树、GBDT、随机森林都是常有且有效的算法,希望以后能够有机会在实际项目中实践。

你可能感兴趣的:(机器(深度)学习)