机器学习——决策树(ID3)算法
1、决策树(ID3)算法
1.1 算法引入
我们首先以一个分类问题开始,假设我们有这样一份样本数据:
我们的目标是想通过色泽、根蒂、敲声、纹理、脐部、触感来判断这是不是一个好瓜。
根据上面的样本集合,我们可以得到,每一个西瓜所具有的属性集合包括:{色泽、根蒂、敲声、纹理、脐部、触感},对于每一个属性,其可以有若干个取值。以色泽为例,其取值包括青绿、乌黑、浅白三种。
1.2 决策树模型概述
针对上面的例子,我们构造出一棵树来进行决策:
上面的图片就是一个决策树的雏形,由此可见,决策树模型是基于“树”的结构进行决策,其决策的步骤包括:
- 每一个“内部节点”对应于某个属性上的“测试”。
- 每一个分支对应于该测试的一种可能结果。(即该属性的某一个取值)
- 每个“叶节点”对应于一个“预测结果”。
1.3 利用决策树解决问题的基本流程
总体流程:“分而治之“
- 从根节点到叶子节点的递归过程。(涉及的问题:何时停止)
- 在每一个中间节点寻找一个“划分”属性。(涉及的问题:如何选择最优属性)
学习过程:通过对训练样本的分析来确定“划分属性”。(即内部节点所对应的属性)
预测过程:将测试实例从根节点开始,沿着划分属性所构成的“判定测试序列”下行,直到叶子节点。
1.4 递归构建的停止条件(核心)
- 当前结点所包含的的样本全部属于一个类别,则无需再次进行划分。
- 当前的属性集为空,或者所有的样本在所有的属性上取值相同,无法划分。
- 当前结点包含的样本集合为空,不能划分。
1.5 如何选择最优“划分”(核心)
信息熵:
用来衡量样本集合“纯度”的一种常用的指标,假定当前样本集合D中第K类样本所占比例为
p
k
p_k
pk,则D的信息熵为:
这里面所谓的纯度,指的就是整个集合D中包含的不同类别样本的情况,包含不同类样本数量越多,那么纯度越低,信息熵Ent(D)的值越大,Ent(D)的值越小,则D的纯度越高。
通过上述的公式可以发现,当不同类别的样本数量相同的时候,那么也就是说纯度最低。当D中的样本全部属于一个类别,其他类别的数量均为0时候,纯度最高。
我们构建决策树的目标在于,不同不断的递归生成新的子节点,最终使得每一个叶子节点中所包含的样本同时属于一个类别。此时不难发现,该节点的信息熵是最小的。那么也就是说,我们的目标是使得节点的信息熵越小越好。
信息增益:
根据上面的信息熵的概念,我们下一步就应该是确定一种属性筛选方案,通过这种方案,我们选择出一个最优的划分属性,使得所生成的子节点的信息熵尽可能的小。那么这种筛选方案,我们称之为“信息增益”。
假设属性a的取值为{
a
1
,
a
2
,
.
.
.
a
v
a^1,a^2,...a^v
a1,a2,...av};
D
v
D^v
Dv:表示样本在属性a上的取值的样本集合。以属性
a
u
a^u
au对于样本集合D进行划分所获得的信息增益的公式为:
其中Ent(D)表示划分前的信息熵,后面的∑表示划分之后的信息熵,其中k表示表示属性将集合D划分为K个子集和。
根据上面的公式,我们不难确定的时候,通过“原始的信息熵”-“划分后每一个集合的信息熵的按照比例的和”。我们的计算的目的是每划分一次,就能确定这种划分所带来的不确定性减少的情况。我们选择能够使不确定性减少最多的划分,这样就能够使得最新生成的所有的子集和的信息熵的和是最小的。满足了我们上面的要求。
下面我们举一个具体的例子来计算一下:
计算过程如下:
首先、我们可以确定当前数据集的信息熵为:
我们,首先采用色泽来计算信息增益:
根据色泽的取值,可以将数据集划分成三个, D 1 D_1 D1为色泽取值为青绿, D 2 D_2 D2为色泽取值为乌黑, D 3 D_3 D3为色泽取值为浅白。分别计算 D 1 , D 2 , D 3 D_1,D_2,D_3 D1,D2,D3的信息熵为:
则,最终根据色泽计算出来的信息增益为:
同理可以计算出,根据其他属性的信息增益的值。分别为:
根据计算出来的结果,可以发现,属性“纹理”的信息增益最大,所以它被选择为划分属性。则构建出来如下图所示:
经过不断的属性选择,递归构建之后,形成如下的决策树结构:
信息增益率:(在C4.5算法中使用)
信息增益的问题:对于可取值数目较多的属性有所偏好,在决策树中的表现就是会偏向于使得树的分支越多越好。
信息增益率 :
属性a的可能取值数目越多(也就是属性a所对应的分支越多),则IV(a)的值通常也就越大。
信息增益+信息增益率的启发式:先从候选属性中找出信息增益高于平均水平的,在从中选取增益率最高的属性。
基尼指数:(CART:二叉树结构)中进行使用
其核心公式如下:
其中
p
k
和
p
k
′
p_k和p_k^{'}
pk和pk′分别表示不同的类别。直观理解,也就是首先对一个类别k的概率
p
k
p_k
pk和其他不属于类别k的分类的乘积的求和,在将所有类别的计算出来的求和结果,再次求和。反应的是在D中随机抽取两个例子,分别属于不同类别的概率。对于某一个属性a而言,其基尼指数可以表示为:
在候选属性集合中,寻找使得划分后基尼指数最小的属性。
1.6 算法描述
1.5 决策树剪枝
剪枝是在决策树中防止过拟合的一种重要的手段,在决策树中,由于分支可能过多,可能会造成过拟合的情况。决策树的剪枝策略主要包括“预剪枝”和“后剪枝”,预剪枝是指在决策树生成的过程总,对于每一个节点在划分前后进行估计,如果当前节点的划分不能带来决策树泛华性能的提升,则停止划分,并且将当前节点标记成叶节点。后剪枝则是从训练集中生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,如果该节点对应的子树替换成叶子节点能带来决策树泛化性能的提升,则将该子树替换成叶子节点。
预剪枝
对于上面西瓜的例子,我们根据信息增益首先选择脐部作为划分属性,生成三个分支,再利用信息增益为不同的分支选择划分属性,根据预剪枝的策略,我们在生成子节点的时候需要对泛化能力进行判断,判断的过程如下图所示:
在这里,我们选择{1,2,3,6,7,10,14,15,16,17}作为训练集,选择{4,5,8,9,11,12,13}作为验证集。通过验证集来判断决策树的泛化能力。
后剪枝
后剪枝的首先构建出来一棵完整的决策树,如下图所示:
根据上面构造的决策树,我们能够确定分类的精度为42.9%。下面进行后剪枝。后剪枝是一个自底向上的过程,在这个过程中,经历如下的步骤:
- 首先考察节点6,将其子树替换成一个叶子节点,包含的样本包括{7,15},将6号节点换成叶子节点,类别标记为“好瓜”,此时验证集的精度为52.9%,则进行后剪枝。
- 然后考察节点5,若将其替换成叶子节点,类别为“好瓜”,此时验证集的分类精度为57.1%,没有提升,可以不进行剪枝处理。
- 考察节点2,如将其替换成叶子节点,包含的样本包括{1,2,3,14}的训练样例,叶子节点标记为“好瓜”,此时,验证集的精度为71.4%,则进行剪枝处理。
- 考察节点3,如果将其替换成叶子节点,则验证集的精度为71.4%,则不进行剪枝。
- 考察节点1,如果将其替换成叶子节点,验证集的精度为42.9%,则不进行剪枝处理。
具体图示如下:
1.5决策树中的连续属性值和缺失属性值
1.5.1 连续属性
相比于离散属性,连续属性的取值数量不再固定,所以,不能够直接根据连续属性的可能取值进行划分。
二分法
给定样本集合D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从大到小进行排序,记为{
a
1
,
a
2
,
.
.
.
.
a
n
a_1,a_2,....a_n
a1,a2,....an}。基于划分点t可以将D分为子集
D
t
−
D_t^-
Dt−和
D
t
+
D_t^+
Dt+,其中第一个子集包含的是在属性a上取值不大于t的样本,第二子集包含的是在属性a上取值大于t的样本。不难看出,在相邻属性[
a
i
a_i
ai,
a
i
+
1
a_{i+1}
ai+1)上的任意一个点取值,分成的两个集合都是相同的。在包含n个a属性取值的集合上,我们确定n-1个划分点,构成一个集合为
根据我在划分机制,我们可以在属性a上选择最优的划分点,以信息增益Gain为为例:
下面,我们举一个具体的例子进行说明,我们对之前的西瓜数据集增加一个密度属性,该属性为连续属性,如下图所示:
对于密度属性,我们需要确定在训练样本中所有的取值集合,在根据上面改进后的公式来选择信息增益最大的“切分点”。
注意:连续属性在划分完成之后,还可以在子节点中继续使用,作为划分标准。
1.5.2 缺失值处理
所谓的缺失值,指的就是样本在某一个属性上的属性值缺失,以下图为例。
上面的样本集合中,样本1在属性色泽上的属性值缺失,样本2在触感上的属性值缺失等等。
对于缺失值处理的最简单的方案是,根据所谓没有缺失属性值的样本,找到取值最多的属性值作为当前样本的属性值。对于连续属性,可以取其他没有缺失该属性的样本的对应的属性值的平均值。
下面,我们介绍按照比例的取值方案:
对于训练样本集合D,其中没有缺失属性的样本组成对应的集合为
D
−
D^-
D−,
D
−
D^-
D−中包含的k个类别。我们给定每一个样本x一个权重值为
w
x
w_x
wx,分别计算如下:
根据上面的公式和数据集,我们来计算一个信息增益。
1.6 多变量决策树(扩展)
根据之前的介绍,我们每次在选择属性的时候,选择的都是一个属性最为划分标准。那么,我们是否可以选择多个属性的组合进行划分呢?答案是可以的。
所谓的多变量决策树,指的就是我们在进行构建决策树的时候,每次选择的都是一个属性集合作为划分标准,在这种决策树中,非叶子节点不在是针对于某一个属性,而是对属性的组合进行测试。至于多个属性的组合方式,我们可以采用权重的方式构建线性模型。也就是说,每一个非叶子节点是一个类似于
∑
i
=
1
k
w
i
a
i
=
t
∑_{i=1}^kw_ia_i=t
∑i=1kwiai=t的分类器,其中
a
i
a_i
ai表示属性i,
w
i
w_i
wi表示属性i的权重、例如如下的例子:
2 参考文献
周志华. 《机器学习》