决策树是基于树结构进行决策的,其机制就是通过判定每个属性分类的纯度来进行自上而下决策分类
决策树包含 根结点 ,内部结点, 叶结点; 根结点和内部结点对应与分类的属性(也就是分类的基准),叶结点对应决策结果(也就是纯度很高且不需要继续分裂的类别);从根结点到某一个叶结点的路径便是当前叶结点对应类的整个决策过程,下面来看决策树的算法流程:
可以看到决策树决策的过程是一个递归的过程:
如何选择最优的划分属性是决策树的关键,随着划分的进行我们希望样本划分的结果纯度越来越高;下面介绍两种划分标准
2.1.1 算法介绍
ID3算法是决策树生成的经典算法,每次分裂时候就是计算***信息增益***,然后选择***信息增益***最大的作为标准进行结点分裂
"信息熵"是度量样本集合纯度的一个指标,首先定义全局变量:
则信息熵定义:
E n t ( D ) = − ∑ k = 1 K p k l o g 2 p k Ent(D) = - \sum_{k=1}^K p_k log_2p_k Ent(D)=−k=1∑Kpklog2pk
那么接着计算信息增益,样本根据属性集 a ( a 1 , a 2 … a V ) a (a^1,a^2…a^V) a(a1,a2…aV)进行分裂输出每个属性下的样本子集 D v D^v Dv,然后根据样本子集 D v D^v Dv中的类别进行单子集的信息熵计算:
E n t ( D v ) = − ∑ k = 1 K p k l o g 2 p k Ent(D^v) = - \sum_{k=1}^K p_k log_2p_k Ent(Dv)=−k=1∑Kpklog2pk
然后对于样本子集中根据分支结点样本数与所有样本数的比率( ∣ D v ∣ / ∣ D ∣ |D^v|/|D| ∣Dv∣/∣D∣)进行权重赋值,未分裂之前的信息熵减去按照当前属性分裂之后结果所机算的信息熵只差就是信息增益:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V D v D E n t ( D v ) Gain(D,a) = Ent(D) - \sum_{v=1}^V \frac{D^v}{D}Ent(D^v) Gain(D,a)=Ent(D)−v=1∑VDDvEnt(Dv)
换言之就是求 a v = a r g m a x G a i n ( D , a ) a^v = argmax Gain(D,a) av=argmaxGain(D,a)的极大似然过程
2.1.2 范例演示
公式总是不直观的,这里我们使用周志华老师—<机器学习>一书中的例子进行上述的论证:
首先计算根结点的信息熵:
E n t ( D ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 8 17 l o g 2 8 17 + 9 17 l o g 2 9 17 ) = 0.998 Ent(D) = - \sum_{k=1}^2p_k\;log_2p_k = -(\frac{8}{17}log_2\frac{8}{17} + \frac{9}{17}log_2\frac{9}{17}) = 0.998 Ent(D)=−k=1∑2pklog2pk=−(178log2178+179log2179)=0.998
然后计算上述数据表中所有属性{色泽,根蒂,敲声,纹理,脐部,触感}的信息增益:
以色泽为例: D 1 ( 色 泽 = 青 绿 ) D 2 ( 色 泽 = 乌 黑 ) D 3 ( 色 泽 = 浅 白 ) D^1(色泽=青绿) \;\; D^2(色泽=乌黑) \;\; D^3(色泽=浅白) D1(色泽=青绿)D2(色泽=乌黑)D3(色泽=浅白)
所以这三个支点的信息熵(只输出结果):
E n t ( D 1 ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 3 6 l o g 2 3 6 + 3 6 l o g 2 3 6 ) = 1.000 Ent(D^1) = - \sum_{k=1}^2p_klog_2p_k = -(\frac{3}{6}log_2\frac{3}{6} + \frac{3}{6}log_2\frac{3}{6}) = 1.000 Ent(D1)=−k=1∑2pklog2pk=−(63log263+63log263)=1.000
E n t ( D 2 ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 4 6 l o g 2 4 6 + 2 6 l o g 2 2 6 ) = 0.918 Ent(D^2) = - \sum_{k=1}^2p_klog_2p_k = -(\frac{4}{6}log_2\frac{4}{6} + \frac{2}{6}log_2\frac{2}{6}) = 0.918 Ent(D2)=−k=1∑2pklog2pk=−(64log264+62log262)=0.918
E n t ( D 3 ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 1 5 l o g 2 8 17 + 4 5 l o g 2 4 5 ) = 0.722 Ent(D^3) = - \sum_{k=1}^2p_klog_2p_k = -(\frac{1}{5}log_2\frac{8}{17} + \frac{4}{5}log_2\frac{4}{5}) = 0.722 Ent(D3)=−k=1∑2pklog2pk=−(51log2178+54log254)=0.722
则:
G a i n ( D , 色 泽 ) = 0.998 − ( 6 17 ∗ 1.000 + 6 17 ∗ 0.918 + 5 17 ∗ 0.722 ) = 0.109 Gain(D,色泽) = 0.998 - (\frac{6}{17}*1.000 + \frac{6}{17}*0.918 + \frac{5}{17}*0.722) = 0.109 Gain(D,色泽)=0.998−(176∗1.000+176∗0.918+175∗0.722)=0.109
同理可以计算其他属性的信息增益:
G a i n ( D , 根 蒂 ) = 0.143 ; G a i n ( D , 敲 声 ) = 0.141 ; G a i n ( D 纹 理 ) = 0.381 Gain(D,根蒂) = 0.143; \;\;Gain(D,敲声) = 0.141; \;\; Gain(D纹理) = 0.381 Gain(D,根蒂)=0.143;Gain(D,敲声)=0.141;Gain(D纹理)=0.381
G a i n ( D , 脐 部 ) = 0.289 ; G a i n ( D , 触 感 ) = 0.006 ; Gain(D,脐部) = 0.289; \;\;Gain(D,触感) = 0.006; Gain(D,脐部)=0.289;Gain(D,触感)=0.006;
之后基于 D 1 D^1 D1分裂,递归上述过程
继续来看上一个决策树(好瓜-坏瓜):
我们来计算下,如果将编号也做为属性来看,那么编号 1~17,每个编号可取值所对应的子样本的类别只能是好瓜或者坏瓜,所以编码作为决策属性,子样本的 E n t ( D , 编 号 ) = 0 Ent(D,编号) = 0 Ent(D,编号)=0,所以此时的信息熵增益是不合理的,此时的决策树泛化能力很差,无法对新样本本进行预测
为了平衡这一个问题,我们使用 增益率 来选择最优划分属性,下面是增益率的公式:
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∣
数据集的纯度不仅可以用信息熵来判定,还可以使用基尼值来进行决策,下面先来看基尼值的公式:
G i n i ( D ) = ∑ k = 1 K ∑ k + ≠ k − p k + p k − = 1 − ∑ k = 1 K p k 2 Gini(D) = \sum_{k=1}^K \sum_{k^+ \neq k^-}p_k^+p_k^- = 1- \sum_{k=1}^Kp_k^2 Gini(D)=k=1∑Kk+=k−∑pk+pk−=1−k=1∑Kpk2
所以属性a的基尼指数:
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a) = \sum_{v=1}^V \frac{|D^v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
于是用基尼指数进行结点分裂其实就是计算 a v = a r g m i n G i n i _ i n d e x ( D , a ) a_v = argmin Gini\_index(D,a) av=argminGini_index(D,a)的过程
具体怎么计算仿造信息增益即可,替换公式而已
首先我们将表4.1分成训练数据和验证数据;训练数据用来计算信息增益来选择决策属性,验证数据用来验证是否进行结点的分裂
剪枝是决策树为了防止"过拟合"的处理方式,随着决策树的深度增加,有时候不可避免决策树会把训练数据的一些特征用来表征所有的数据,这就造成了过拟合,因此需要通过剪枝来规避过拟合
剪枝有两种策略:
我们根据上面的图来模拟预剪枝的过程:
可以看到 预训练 确实有效地规避了过拟合,但是由于预剪枝使得部分结点不再展开,所以在一定程度上增加欠拟合的风险
大致过程类似于预剪枝,但是后剪枝是自下而上(决策树建立之后进行剪枝),而预剪枝是自上而下;
我们接下来抽样来看两个结点,以此来理解后剪枝:
对比两种剪枝,后剪枝是在决策树生成之后进行的剪枝,所以保留了更多分支,可以有效的规避"欠拟合";但是自上而下,进行后剪枝,需要一个一个遍历树节点,所以时间和资源开销会大很多