什么是决策树?
决策树,首先从字面意思理解,它应该是一种树形结构的模型,结点类型包括内部结点和叶结点两种,内部节点表示某一个特征,也表示了一次做决策的过程,叶结点表示一个类,决策的最终结果保存到叶结点当中。每一次做决策都可以看作是if-then结构,整个决策树就是if-then的集合,所以单纯从理解它的思想角度来说可能要比线性模型更容易理解。
决策树的学习过程
- 特征选择:特征选择指的是从训练集的众多特征中选择一个特征作为当前层做决策的标准,特征选择的方法以及评估标准的不同会导致最终的决策树不同,从而做决策的效率必然也不相同。
- 决策树生成:决策树的生成是一个递归的过程,根据选择的特征自上而下递归的生成子结点,直到数据集不可再分为止。特征选择根据不同的算法有不同的标准,ID3算法以信息增益为依据,而C4.5算法则以信息增益比为依据。
- 剪枝:决策树算法对于训练集来说是完全拟合的,但如果训练集当中有噪声数据,就有可能造成过拟合,模型对于我们的训练集学习的过于出色,反而对于测试集过于死板,导致最终的模型并不理想。因此,在不影响模型精度的情况下,决策树越简洁越好,剪枝就是为了这一目的而存在的。
信息论相关知识
信息熵
熵本来是一个热力学的概念,用来衡量微观粒子的混乱程度,这个概念也被类比到了信息论当中。信息本来是抽象概念,本身是一件无法度量的事,后来,香农提出了信息熵的概念,衡量事件的不确定性,解决了对信息的度量化问题,所以也称信息熵为香农熵。
事件携带信息量的大小与事件发生的概率有关。比如我告诉大家“明天太阳从东方升起”,这是个必然事件,其中所携带的信息量为0。所以如果有一个函数f§来衡量信息量与事件概率之间的关系,那么f应该是一个减函数,又因为两个事件所携带的信息量是可以叠加的,函数应该满足
f
(
p
1
,
p
2
)
=
f
(
p
1
)
+
f
(
p
2
)
f(p_1,p_2) = f(p_1)+ f(p_2)
f(p1,p2)=f(p1)+f(p2),满足这种形式的为log函数,所以
f
(
P
)
=
−
l
o
g
P
f(P) = -logP
f(P)=−logP。
信息熵可以看做是信息量的期望,在给定数据集的情况下我们也称之为经验熵。公式如下:
条件熵
在已知某个随机变量X的范围内计算另一个随机变量Y的不确定性,计算方法与计算信息熵相同,不同的就是样本的范围从整个训练集变为了依据随机变量X进行计算。文字很生硬,这几个信息论相关的概念都会在下面ID3算法的介绍当中提供例子进行计算。
信息增益
信息熵与赋予权重之后的条件熵之差,公式如下:
信息增益比
某个特征的信息增益与训练集的经验熵之比。
决策树的生成
ID3算法
输入 :训练数据集D、特征集A
输出:决策树T
(1)若D中所有的样本属于同一类Ck,则T为单节点树,返回T;
(2)若A=∅,则T为单节点树,选择D中样本数最多的类别作为类标记,返回T;
(3)否则,计算A中各特征对D的信息增益,选择信息增益最大的特征Ag;
(4)对Ag的每一可能值ai,依据Ag=ai将D划分为若干非空子集;
(5)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归调用(1)-(4),返回Ti。
下面将以西瓜书中的例子来介绍计算过程。
以色泽为例,色泽的属性包含“青绿”、“乌黑”和“浅白”三种,分别记为
A
1
A
2
A
3
A_1 A_2 A_3
A1A2A3,按照信息熵、条件熵以及信息增益的顺序进行计算,过程如下
同理,还应该计算其他属性的信息增益,要选择信息增益最大的作为第一个分裂节点。
根据计算结果可以得到,纹理属性的信息增益最大,因此选择纹理作为第一个分类点,其实也就是根节点。
决策树的生成是一个递归的过程,所以接下来就再根据纹理的三条分支继续递归,知道所有的属性全部用完为止,最终的决策树如下图:
C4.5算法
输入 :训练数据集D、特征集A
输出:决策树T
(1)若D中所有的样本属于同一类Ck,则T为单节点树,返回T;
(2)若A=∅,则T为单节点树,选择D中样本数最多的类别作为类标记,返回T;
(3)否则,计算A中各特征对D的信息增益比,选择信息增益比最大的特征Ag;
(4)对Ag的每一可能值ai,依据Ag=ai将D划分为若干非空子集;
(5)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归调用(1)-(4),返回Ti。
C4.5算法与ID3算法的流程大致一致,只是在分类节点的选择准则上,C4.5使用了信息增益比。
两类算法的对比
- ID3算法的分类准则为信息增益,信息增益在计算时更加偏向于样本数量较多的属性,而信息增益比弥补了这一缺点,相当于在分母上对于样本数量多的属性添加了罚分,所以C4.5算法的分类准则采用了信息增益比。
- ID3算法不能处理连续值,C4.5算法可以处理连续值。
剪枝处理
上面介绍的两种算法都是对训练集递归生成决策树,对于训练集来说是完全拟合的,它并不排斥噪声数据,因此在生成的过程中很有可能造成过拟合,所以需要在不影响其精度的情况下进行剪枝处理以提高模型的泛化性能。
预剪枝
预剪枝就是对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。要进行剪枝处理就需要将数据集划分为训练集以及测试集,划分如下(上下部分分别为训练集与测试集):
首先对训练集计算信息增益找到划分属性,在计算后得知,脐部的信息增益值最大,应该选择脐部作为划分属性,但是应不应该做划分呢?这是预剪枝要处理的问题,所以就要对比划分前后的测试集的精度。
如果不对脐部做划分,那么根据ID3算法的流程,应该选择属性值最多的一类作为该节点的属性,看训练集中好瓜与坏瓜的数量一致,假设选择好瓜为该节点的属性,那输入测试集到脐部这个节点时,所有的节点将被划分为好瓜,测试集当中{4,5,8}将被分类正确,分类精度为
3
7
\frac{3}{7}
73。
如果对脐部做划分,还是按照之前的原则,凹陷和稍凹两类将被划分为好瓜,而平坦将被划分为坏瓜,所以测试集当中的{4,5,8,11,12}将被分类正确,分类精度为
5
7
\frac{5}{7}
75。
可以看出划分后的精度是要高于划分前的,所以应该对脐部属性做划分。
后剪枝
先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
以下面图中的决策树为例,自下而上的对每一个分类节点进行考察,发现“2色泽”和“6纹理”这两个分类节点划分后的精度是下降的,因此这两个节点可以剪掉。
两类剪枝算法对比
(1)时间开销
预剪枝:训练时间开销降低,测试时间开销降低。
后剪枝:训练时间开销增加,测试时间开销降低。
(2)过/欠拟合风险
预剪枝:过拟合风险降低,欠拟合风险增加。
后剪枝:过拟合风险降低,欠拟合风险基本不变。
(3)泛化性能
后剪枝通常优于预剪枝。
通常使用决策树算法处理的并不是大量数据,因此为了提高模型的泛化性能,我们花在后剪枝上的时间开销是可以接受的,所以在实际应用当中更多的选择后剪枝。
写在最后:
本文参考了李航《统计学习方法》、周志华《机器学习》