决策树是一种很常用也是很有效的分类和回归方法,因为在构建树的过程中需要使用数据的类标签,所以是一种有监督的学习,常见的是二叉树的结构,也有非二叉树的结构。其中每个内部节点表示在一个属性上的测试,每个分支代表一个测试输出,每个叶节点存放一个类标号。
它采用的是自顶向下的递归方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点的实例都属于同一类,通常可以概括为以下三个过程
决策树的本质是从训练数据集中归纳出一组分类规则,选择一个与训练数据集矛盾最小的树,不仅对于训练数据有很好的拟合,而且对于未来的数据也有很好的预测作用。所以决策树采用损失函数表示这一目标,策略就是以损失函数为目标的最小化。实际中从所有可能的决策树中选取最优的是NP完全问题,所以多种决策树使用的都是贪心的方法,这样实际上得到的是一个次最优的树。
此外通过训练数据生成的决策树可能对于训练数据集有很好的拟合作用,但可能会产生过拟合现象,所以我们需要对已生成的树进行自下而上的剪枝,使其具有很好的泛化能力,通常有预剪枝和后剪枝。
优点是
主要的决策树算法有C4.5、ID3和CART算法。
决策树算法的基本过程:
构建根节点,将所有训练数据都放在根节点,然后选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去
如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止
每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树
下面通过一个例子先直观的看一下决策树,假设我们需要根据不同的天气情况来决定是否出去打网球,天气如何?气温如何?湿度怎么样?有没有风?具体的数据如下:
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 |
然后通过某种决策树算法,我们可以得到如下的一颗决策树(后面会讲使用不同的决策树算法如何生成一颗决策树):
从图中的树我们可以看出,利用了三个特征进行分类,首先看天气怎么样,如果是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)=pi,i=1,2,...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=1∑∣y∣pklog2pk
其中规定若 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 0≤Ent(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)=1−p,0≤p≤1
我们定义的熵为: 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−(1−p)log2(1−p)
而在二维分布中,我们得到的时关于 X 、 Y X、Y X、Y的联合分布
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(Y∣X)=i=1∑mpiH(Y∣X=xi)
当划分后的数据是纯的,则熵为零,因为概率 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 −n∗p∗logp ,注意如果类的数目大于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=1∑K∣D∣∣Ck∣log∣D∣∣Ck∣
条件经验熵: 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(D∣A)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log∣Di∣∣Dik∣
信息增益是表示得知特征 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(D∣A)之差,即: 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(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=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
属性 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=1∑Kpk(1−pk)=1−k=1∑Kpk2=1−k=10∑K(∣D∣∣Ck∣)2
和熵类似,当数据是纯的时候(即由单个类组成)基尼系数为零。当数据中所有类的概率 p p p相等时,基尼系数也达到最大值。如上图所示,表示了不同个数的类的基尼系数的最大值的情况,假设每个类出现的概率 p = 1 n p=\frac{1}{n} p=n1。基尼系数的值总是在0到1之间,而与类的数量无关。
基尼系数直观上反映了数据集中随机抽取的两个样本,其类别标记不同的概率,于是在使用中选择那个使得划分后基尼系数最小的属性做为最有划分属性。
根据上面的分析我们可以看出熵和基尼系数有一定的相似处,这两个都可以表示数据的不纯度。那么这两个有什么区别?
分类误差率(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=1−max{pj}
分类误差率的取值在 ( 0 , 1 ) (0,1) (0,1),事实上对于给定类别的数据的基尼系数的最大值通常和分类误差率的最大值相等。因为对于不同的类,我们假设它们出现的概率 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} 1−n(n1)2=1−n1处,而最大的分类误差率也出现在 1 − m a x { 1 n } = 1 − 1 n 1-max\{ \frac{1}{n}\}=1- \frac{1}{n} 1−max{n1}=1−n1处。
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)=−149log2149−145log2145=0.940
然后分别计算不同属性的条件经验熵,首先来看Outlook这个属性,我们对Outlook的不同类考察Yes和No的分组情况:
因此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(D∣Outlook)=145×(−52log252−53log253)+144×(−44log244−40log240)+155×(−53log253−52log252)=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(D∣Outlook)−H(D)=0.940−0.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)最大,所以选择它作为分裂的属性,这样从根节点就可以有三个分支。然后对于不同分支的子树继续按照这样的方法就行分裂,直到算法终止,我们就可以得到这样一棵决策树。
但是ID3算法有如下的缺点:
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×log2144−146×log2146−144×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