决策树(Decision Tree)算法探析


总览


决策树是一种很常用也是很有效的分类和回归方法,因为在构建树的过程中需要使用数据的类标签,所以是一种有监督的学习,常见的是二叉树的结构,也有非二叉树的结构。其中每个内部节点表示在一个属性上的测试,每个分支代表一个测试输出,每个叶节点存放一个类标号。

它采用的是自顶向下的递归方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点的实例都属于同一类,通常可以概括为以下三个过程

  • 特征的选择
  • 决策树的生成(考虑局部最优)
  • 决策树的修剪(考虑全局最优)

决策树的本质是从训练数据集中归纳出一组分类规则,选择一个与训练数据集矛盾最小的树,不仅对于训练数据有很好的拟合,而且对于未来的数据也有很好的预测作用。所以决策树采用损失函数表示这一目标,策略就是以损失函数为目标的最小化。实际中从所有可能的决策树中选取最优的是NP完全问题,所以多种决策树使用的都是贪心的方法,这样实际上得到的是一个次最优的树。

此外通过训练数据生成的决策树可能对于训练数据集有很好的拟合作用,但可能会产生过拟合现象,所以我们需要对已生成的树进行自下而上的剪枝,使其具有很好的泛化能力,通常有预剪枝后剪枝

优点

  • 可读性好、分类速度快,生成的决策树和人类的思考过程相近,所以可解释性强
  • 可以自学习,不需要任何的领域知识,也不需要人工设置参数

主要的决策树算法有C4.5ID3CART算法。


基础知识


决策树算法的基本过程

  1. 构建根节点,将所有训练数据都放在根节点,然后选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。

  2. 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去

  3. 如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止

  4. 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树

下面通过一个例子先直观的看一下决策树,假设我们需要根据不同的天气情况来决定是否出去打网球,天气如何?气温如何?湿度怎么样?有没有风?具体的数据如下:

Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No

然后通过某种决策树算法,我们可以得到如下的一颗决策树(后面会讲使用不同的决策树算法如何生成一颗决策树):

决策树(Decision Tree)算法探析_第1张图片

从图中的树我们可以看出,利用了三个特征进行分类,首先看天气怎么样,如果是Sunny再看湿度如何;如果是Rain再看风大不大。至于为什么从根节点先选择Outlook这个属性进行划分,就涉及到决策树中很重要的一个问题,那就是特征的选择。通常特征选择的准则有信息增益、信息增益比和基尼系数


特征的选择的划分标准


下面来看决策树中的第一个问题:特征选择,它在决策树的构建中起到很重要的作用,我们需要选择具有良好分类能力的特征,从而有效的提高决策树的学习效率,通常的选择是信息增益、信息增益比、基尼系数和分类误差率。为了学习这些划分标准,首先来看一下有关的问题

熵(Entropy)

熵是信息论中的一个很重要的概念,表示了随机变量的混乱程度,是一种对于不确定性的度量。假设数据集D中数据x满足概率分布 P ( X = x i ) = p i , i = 1 , 2 , . . . n P(X = x_{i}) = p_{i},i=1,2,...n P(X=xi)=pii=12...n,在信息论中我们定义 X X X的信息熵就是: E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D)=-\sum_{k=1}^{|y|}p_{k}log_{2}p_{k} Ent(D)=k=1ypklog2pk

其中规定若 p i = 0 pi = 0 pi=0,则 0 l o g 0 = 0 0log0 = 0 0log0=0 l o g log log函数分别以2和e为底时,单位是比特和纳特。熵只依赖于 X X X的分布,与 X X X的取值无关,熵越大,随机变量的不确定性就越大,也就是纯度越低,熵的取值范围是 0 ≤ E n t ( D ) ≤ l o g n 0 \leq Ent(D) \leq logn 0Ent(D)logn

比如:当 X X X是满足0-1伯努利分布时,即满足如下分布: p ( X = 1 ) = p , P ( X = 0 ) = 1 − p , 0 ≤ p ≤ 1 p(X=1)=p,P(X=0)=1-p,0\leq p\leq 1 p(X=1)=p,P(X=0)=1p,0p1

我们定义的熵为: H ( P ) = − p l o g 2 p − ( 1 − p ) l o g 2 ( 1 − p ) H(P)=-plog_{2}p-(1-p)log_{2}(1-p) H(P)=plog2p(1p)log2(1p)

而在二维分布中,我们得到的时关于 X 、 Y X、Y XY的联合分布
P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , … , n ; j = 1 , 2 , … , m P(X=x_{i},Y=y_{i})=p_{ij},i=1,2,…,n; j=1,2,…,m P(X=xi,Y=yi)=pij,i=1,2,,n;j=1,2,,m

这时条件熵就定义为在 X X X给定时 Y Y Y的条件概率分布的熵对 X X X的数学期望 H ( Y ∣ X ) = ∑ i = 1 m p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^m p_{i}H(Y|X=x_{i}) H(YX)=i=1mpiH(YX=xi)


决策树(Decision Tree)算法探析_第2张图片

当划分后的数据是纯的,则熵为零,因为概率 p = 1 p=1 p=1使得 l o g ( 1 ) = 0 log(1)= 0 log(1)=0。通常当表中所有类的概率相等时,熵达到最大值。从上图我们可以看出,类别数不同时最大熵值的情况,假设每个类出现的概率 p = 1 n p=\frac{1}{n} p=n1。在这种情况下,最大熵等于 − n ∗ p ∗ l o g p -n\ast p\ast logp nplogp ,注意如果类的数目大于2,熵值大于1。

信息增益(Information Gain)

决策树的生成就是使得数据集的熵下降的过程,那么选择可以使熵下降的速度最快的属性。

在信息增益前我们需要知道经验熵和经验条件熵,当概率是由数据估计(极大似然估计)得到时,所对应的熵和条件熵分别成为经验熵和经验条件熵。

经验熵: H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K \frac{|C_{k}|}{|D|}log \frac{|C_{k}|}{|D|} H(D)=k=1KDCklogDCk

条件经验熵: H ( D ∣ A ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ l o g ∣ D i k ∣ ∣ D i ∣ H(D|A)=-\sum_{i=1}^n\frac{|D_{i}|}{|D|} \sum_{k=1}^K \frac{|D_{ik}|}{|D_{i}|}log\frac{|D_{ik|}}{|D_{i}|} H(DA)=i=1nDDik=1KDiDiklogDiDik

信息增益是表示得知特征 X X X的信息使得类 Y Y Y的信息的不确定性减少的程度。那么信息增益的定义为:特征 A A A对训练数据集 D D D信息增益 g ( D , A ) g(D,A) g(D,A)定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征 A A A给定条件下D的经验条件熵 H ( D ∣ A ) H(D|A) H(DA)之差,即: G a i n ( D , A ) = H ( D ) − H ( D ∣ A ) Gain(D,A)=H(D)-H(D|A) Gain(D,A)=H(D)H(DA)

根据上面的叙述,信息增益越大,分类能力越强。具体的信息增益的过程如下:

  • 根据给定的数据集和选择的特征,先计算数据集的D的经验熵 H ( D ) H(D) H(D)
  • 计算特征A对数据集D的条件经验熵 H ( D ∣ A ) H(D|A) H(DA)
  • 计算信息增益 G a i n ( D , A ) Gain(D,A) Gain(D,A)

信息增益率(Information Gain ratio)

使用信息增益会对取值数目较多的特征有所偏好,为了减少这种偏好带来的影响,我们可以使用信息增益率来选择特征,它主要用在C4.5中。

信息增益率定义如下 G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain{\_ ratio}(D,a)=\frac{Gain(D,a)}{IV(a)} Gain_ratio(D,a)=IV(a)Gain(D,a)其中 I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a)=-\sum_{v=1}^V \frac{|D^v|}{|D|} log_{2}\frac{|D^v|}{|D|} IV(a)=v=1VDDvlog2DDv

属性 a a a的可能取值越多,则 I v ( a ) Iv(a) Iv(a)的值通常越大。信息增益率是一种启发式的方法,它先从候选划分属性中找出信息增益高于平均水平的,再从中选取增益率最高的属性。

基尼系数(Gini index)

CART算法使用基尼系数来选择最优特征。Gini系数的定义如下: G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 = 1 − ∑ k = 10 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(p)=\sum_{k=1}^Kp_{k}(1-p_{k})=1- \sum_{k=1}^Kp^2_{k}=1-\sum_{k=10}^K(\frac{|C_{k}|}{|D|})^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2=1k=10K(DCk)2


决策树(Decision Tree)算法探析_第3张图片

和熵类似,当数据是纯的时候(即由单个类组成)基尼系数为零。当数据中所有类的概率 p p p相等时,基尼系数也达到最大值。如上图所示,表示了不同个数的类的基尼系数的最大值的情况,假设每个类出现的概率 p = 1 n p=\frac{1}{n} p=n1。基尼系数的值总是在0到1之间,而与类的数量无关。

基尼系数直观上反映了数据集中随机抽取的两个样本,其类别标记不同的概率,于是在使用中选择那个使得划分后基尼系数最小的属性做为最有划分属性。

根据上面的分析我们可以看出熵和基尼系数有一定的相似处,这两个都可以表示数据的不纯度。那么这两个有什么区别?

  • Gini 指数的计算不需要对数运算,更加高效;
  • Gini 指数更偏向于连续属性,熵更偏向于离散属性。

分类误差率(Classification error)

也可以使用分类误差率来进行纯度的判别,用来划分属性,它的定义如下: C l a s s i f i c a t i o n E r r o r = 1 − m a x { p j } Classification Error=1- max\{p_{j}\} ClassificationError=1max{pj}

分类误差率的取值在 ( 0 , 1 ) (0,1) 01,事实上对于给定类别的数据的基尼系数的最大值通常和分类误差率的最大值相等。因为对于不同的类,我们假设它们出现的概率 p = 1 n p=\frac {1}{n} p=n1,则基尼系数的最大值出现在 1 − n ( 1 n ) 2 = 1 − 1 n 1-n(\frac{1}{n})^2=1-\frac {1}{n} 1n(n1)2=1n1处,而最大的分类误差率也出现在 1 − m a x { 1 n } = 1 − 1 n 1-max\{ \frac{1}{n}\}=1- \frac{1}{n} 1max{n1}=1n1处。


决策树算法


ID3算法

ID3算法是由Ross Quinlan提出的决策树的一种算法实现,以信息论为基础,以熵和信息增益为衡量标准,从而实现对数据的归纳分类。ID3算法可以参考这里:ID3_algorithm

那么如何使用ID3算法来生成一棵决策树呢?我们以上面的根据天气情况决定是否打网球为例说明。为了方便查看数据,这里重新给出相关的数据如下:

Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No

将上面的数据集记为D,其中只包含两个类 C 1 C_{1} C1为Yes和 C 2 C_{2} C2为No,类Yes有9个分组,No有5个分组,因此D的经验熵为 H ( D ) = − 9 14 l o g 2 9 14 − 5 14 l o g 2 5 14 = 0.940 H(D)=-\frac{9}{14}log_{2} \frac{9}{14}-\frac{5}{14}log_{2} \frac{5}{14}=0.940 H(D)=149log2149145log2145=0.940

然后分别计算不同属性的条件经验熵,首先来看Outlook这个属性,我们对Outlook的不同类考察Yes和No的分组情况:

  • Sunny:Yes有2个元祖,No有3个元组
  • Overcast:Yes有4个元祖,No有0个元组
  • Rain:Yes有3个元祖,No有2个元组

因此Outlook的条件经验熵为: H ( D ∣ O u t l o o k ) = 5 14 × ( − 2 5 l o g 2 2 5 − 3 5 l o g 2 3 5 ) + 4 14 × ( − 4 4 l o g 2 4 4 − 0 4 l o g 2 0 4 ) + 5 15 × ( − 3 5 l o g 2 3 5 − 2 5 l o g 2 2 5 ) = 0.694 H(D|Outlook)=\frac {5}{14}\times(-\frac{2}{5}log_{2} \frac{2}{5} -\frac{3}{5}log_{2}\frac{3}{5})+\frac{4}{14} \times (-\frac{4}{4}log_{2} \frac{4}{4} -\frac{0}{4}log_{2}\frac{0}{4})\\ +\frac{5}{15} \times (-\frac{3}{5}log_{2} \frac{3}{5} -\frac{2}{5}log_{2}\frac{2}{5})=0.694 H(DOutlook)=145×(52log25253log253)+144×(44log24440log240)+155×(53log25352log252)=0.694
所以Outlook的信息增益 G a i n ( D , O u t l o o k ) = H ( D ∣ O u t l o o k ) − H ( D ) = 0.940 − 0.694 = 0.246 Gain(D,Outlook)=H(D|Outlook)-H(D)=0.940-0.694=0.246 Gain(D,Outlook)=H(DOutlook)H(D)=0.9400.694=0.246

同样的我们可以计算得到 G a i n ( G , T e m p e r t u r e ) = 0.029 Gain(G,Temperture)=0.029 Gain(G,Temperture)=0.029 G a i n ( D , H u m i d i t y ) = 0.151 Gain(D,Humidity)=0.151 Gain(D,Humidity)=0.151 G a i n ( D , W i n d ) = 0.048 Gain(D,Wind)=0.048 Gain(D,Wind)=0.048,因为 G a i n ( D , O u t l o o k ) Gain(D,Outlook) Gain(D,Outlook)最大,所以选择它作为分裂的属性,这样从根节点就可以有三个分支。然后对于不同分支的子树继续按照这样的方法就行分裂,直到算法终止,我们就可以得到这样一棵决策树。


决策树(Decision Tree)算法探析_第4张图片

但是ID3算法有如下的缺点:

  • 不能处理连续特征
  • 容易偏向取值多的特征
  • 不易于处理缺失值
  • 过拟合问题

C4.5

C4.5是ID3的改进版,它相对ID3改进的地方是:

  • 将连续特征离散化
  • 使用信息增益率作为新的判断标准
  • 引入正则化系数

那么如何计算的呢?如上表所示,Temperature将数据划分成3个分区,即Hot、Mild、Cool,分别有4、6、4个元组,首先计算得到 I V ( T e m p e r a t u r e ) = 1 4 14 × l o g 2 4 14 − 6 14 × l o g 2 6 14 − 4 14 × l o g 2 4 14 = 1.557 IV(Temperature)=1\frac{4}{14}\times log_{2}\frac{4}{14}-\frac{6}{14}\times log_{2}\frac{6}{14}-\frac{4}{14}\times log_{2}\frac{4}{14}=1.557 IV(Temperature)=1144×log2144146×log2146144×log2144=1.557 G a i n ( G , T e m p e r t u r e ) = 0.029 Gain(G,Temperture)=0.029 Gain(G,Temperture)=0.029,所以 G a i n _ r a t i o ( D , T e m p e r a t u r ) = 0.029 1.557 = 0.019 Gain{\_ ratio}(D,Temperatur)=\frac{0.029}{1.557}=0.019 Gain_ratio(D,Temperatur)=1.5570.029=0.019

但C4.5同样存在它的不足之处:

  • 非常容易过拟合,所以需要剪枝
  • 使用多叉树,效率低
  • 只能用于分类
  • 计算量大

停止分裂的条件


决策树不可能不限制地生长,总有停止分裂的时候,最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂,但这种情况下树过于复杂,而且预测的精度不高。一般情况下为了降低决策树复杂度和提高预测的精度,会适当提前终止节点的分裂。

以下是决策树节点停止分裂的一般性条件:

  • 最小节点数
    当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。

  • 熵或者基尼值小于阀值
    由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。

  • 决策树的深度达到指定的条件
    节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。

  • 所有特征已经使用完毕,不能继续进行分裂
    被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点

剪枝

在线性回归中,有时模型在训练阶段由于学习的太过于精细,导致出现过拟合,泛化能力下降。为了避免这种现象的出现,我们可以使用正则化等技术。

而在决策树中同样可能出现过拟合现象,由于在决策树的学习阶段,为了尽可能提高分类的准确率,会导致分支过多,以至于将训练集的某些特点当作所有数据的特点进行了学习,从而使得泛化能力大大下降。为了解决这个问题,我们需要使用剪枝处理,剪枝基本策略有两种:

  • 预剪枝:它在决策树生成过程中,对每个节点在划分前就进行估计,如果当前结点的划分不能提升泛化能力,就停止划分将其做为叶节点
  • 后剪枝:它是当从训练集生成一棵完整的决策树之后,自底向上的对非叶节点进行考察,如果将其替换为叶节点可以提升泛化能力,就将其做为叶节点。

一般后剪枝的决策树泛化性能要优于预剪枝的决策树,但是由于需要对非叶节点逐一考察,训练时间要比未剪枝决策树和预剪枝决策树大得多。


决策树中数值问题的处理


连续值的处理

如果是连续属性,我们需要使用离散化技术将其变成离散化的值,然后进行处理。最简单的策略是二分法,也是C4.5中使用的方法。

假设A是连续值,首先将A的值递增排序,将每对相邻值的中点看作是可能的分裂点。这样给定A的v个值就需要计算v-1个可能的划分。例如A的值 a i a_{i} ai a i + 1 a_{i+1} ai+1之间的中点是: a i + a i + 1 2 \frac {a_{i}+a_{i+1}}{2} 2ai+ai+1如果A是有序的,则确定A的最佳划分只需要扫描一遍这些值。

对于A的每个可能分裂点,计算 G a i n _ r a t i o ( D , A ) Gain{\_ ratio}(D,A) Gain_ratio(D,A),其中 v = 2 v=2 v=2,A具有最小期望信息增益率的点做A的分裂点。

缺点是这样做破坏了下连续性变量内在的性质。

缺失值的处理

当样本有缺失值时,我们需要解决以下两个问题:
(1)如何在样本某些特征缺失的情况下选择划分的属性

对于某一有确实特征值的特征A,将数据分为两个部分D1(有特征值A)和D2(没有特征值A),然后对于没有缺失特征A的数据集D1来和对应的A的各个特征值一起计算加权后的信息增益率,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例

(2)在选定划分属性后,对在该属性上缺失特征的样本如何处理?

将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9


参考


周志华《机器学习》

李航《统计学习方法》

https://blog.csdn.net/luanpeng825485697/article/details/78795504

http://hunch.net/~coms-4771/quinlan.pdf

http://www.cs.iit.edu/~iraicu/teaching/CS595-F10/DM-DecisionTree.pdf

https://web.cs.hacettepe.edu.tr/~ilyas/Courses/BIL712/lec02-DecisionTree.pdf

https://tanthiamhuat.files.wordpress.com/2015/10/decision-tree-tutorial-by-kardi-teknomo.pdf

http://www.cs.umd.edu/class/spring2017/cmsc422/slides0101/lecture02.pdf

http://www.cs.princeton.edu/courses/archive/spr07/cos424/papers/mitchell-dectrees.pdf

https://ai.vub.ac.be/sites/default/files/Decision_tree.pdf

https://hackernoon.com/what-is-a-decision-tree-in-machine-learning-15ce51dc445d

https://towardsdatascience.com/decision-trees-in-machine-learning-641b9c4e8052

https://www.geeksforgeeks.org/decision-tree/

https://www.cnblogs.com/yonghao/p/5061873.html

https://www.cnblogs.com/coder2012/p/4508602.html

https://www.cnblogs.com/fionacai/p/5894142.htm

l

你可能感兴趣的:(Machine,Learning)