Skip to content

决策树算法简介

决策树思想的来源非常朴素,程序设计中的条件分支结构就是 if-else 结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

**决策树:是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树 **。

想象一下一个女孩的妈妈给她介绍男朋友的场景:

想一想这个女生为什么把年龄放在最上面判断!!!!!!!!!

上面案例是女生通过定性的主观意识,把年龄放到最上面,那么如果需要对这一过程进行量化,该如何处理呢?

在现实生活中,我们会遇到各种选择,不论是选择男女朋友,还是挑选水果,都是基于以往的经验来做判断。如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是所谓的 决策树

此时需要用到信息论中的知识:信息熵,信息增益

决策树分类原理

物理学上,熵 Entropy 是“混乱”程度的量度。

系统越有序,熵值越低;系统越混乱或者分散,熵值越高

1948 年香农提出了信息熵(Entropy)的概念。

信息理论

1、从信息的完整性上进行的描述:

系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。

2、从信息的有序性上进行的描述:

数据量一致时系统越有序,熵值越低;系统越混乱或者分散,熵值越高

"信息熵" (information entropy) 是度量样本集合纯度最常用的一种指标。

假定当前样本集合 D 中第 k 类样本所占的比例为 pk(k=1,2,...,|y|)

pk=CkD, D 为样本的所有数量,Ck 为第 k 类样本的数量。

则 D 的信息熵定义为 ((log 是以 2 为底,lg 是以 10 为底):

image-20190701180157939

其中:Ent(D) 的值越小,则 D 的纯度越高。

课堂案例:

假设我们没有看世界杯的比赛,但是想知道哪支球队会是冠军,

我们只能猜测某支球队是或不是冠军,然后观众用对或不对来回答,

我们想要猜测次数尽可能少,你会用什么方法?

答案:

二分法:

假如有 16 支球队,分别编号,先问是否在 1-8 之间,如果是就继续问是否在 1-4 之间,

以此类推,直到最后判断出冠军球队是哪支。

如果球队数量是 16,我们需要问 4 次来得到最后的答案。那么世界冠军这条消息的信息熵就是 4。

那么信息熵等于 4,是如何进行计算的呢?

Ent(D)=(p1log2p1+p2log2p2+...+p16log2p16)

其中 p1, ..., p16 分别是这 16 支球队夺冠的概率。 当每支球队夺冠概率相等都是 1/16 的时:$$Ent(D) = -(16 * 1/16 * log_21/16) = 4$$ 每个事件概率相同时,熵最大,这件事越不确定。

随堂练习:

篮球比赛里,有 4 个球队 {A,B,C,D} ,获胜概率分别为{1/2, 1/4, 1/8, 1/8}

求 Ent(D)

答案:

信息增益 (ID3)

信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以 使用划分前后集合熵的差值来衡量使用当前特征对于样本集合 D 划分效果的好坏

信息增益 = entroy(前) - entroy(后)

注:信息增益表示得知特征 X 的信息而使得类 Y 的信息熵减少的程度

定义与公式

假定离散属性 a 有 V 个可能的取值:

image-20190712164631503

假设离散属性性别有 2(男,女)个可能的取值

若使用 a 来对样本集 D 进行划分,则会产生 V 个分支结点,

其中第 v 个分支结点包含了 D 中所有在属性 a 上取值为 av 的样本,记为 Dv . 我们可根据前面给出的信息熵公式计算出 Dv 的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重 |Dv||D|

即样本数越多的分支结点的影响越大,于是可计算出用属性 a 对样本集 D 进行划分所获得的"信息增益" (information gain)

其中:

特征 a 对训练数据集 D 的信息增益 Gain(D,a) ,定义为 集合 D 的信息熵 Ent(D) 与 给定特征 a 条件下 D 的信息条件熵 Ent(D|a) 之差, 即公式为:

image-20190701180230634

公式的详细解释:

信息熵的计算:

image-20190701180248293

条件熵的计算:

image-20190701180307869

其中:

Dv 表示 a 属性 中第 v 个分支节点包含的样本数

Ckv 表示 a 属性 中第 v 个分支节点包含的样本数中,第 k 个类别下包含的样本数

一般而言,信息增益越大,则意味着 使用属性 a 来进行划分所获得的"纯度提升"越大。因此,我们可用信息增益来进行决策树的划分属性选择,著名的 ID3 决策树学习算法 [Quinlan, 1986] 就是以信息增益为准则来选择划分属性。

其中,ID3 名字中的 ID 是 Iterative Dichotomiser (迭代二分器) 的简称

案例

如下图,第一列为论坛号码,第二列为性别,第三列为活跃度,最后一列用户是否流失。

我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大

image-20190214123146695

通过计算信息增益可以解决这个问题,统计上右表信息

其中 Positive 为正样本(已流失),Negative 为负样本(未流失),下面的数值为不同划分下对应的人数。

可得到三个熵:

a.计算类别信息熵

整体熵:

image-20190701180330245

b.计算性别属性的信息熵 (a="性别")

image-20190701175350303

c.计算性别的信息增益 (a="性别")

image-20190701173018397

b.计算活跃度属性的信息熵 (a="活跃度")

image-20190701175748466

c.计算活跃度的信息增益 (a="活跃度")

image-20190701173116116

**活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。**在做特征选择或者数据分析的时候,我们应该重点考察活跃度这个指标。

信息增益率 (C4.5)

在上面的介绍中,我们有意忽略了"编号"这一列。若把"编号"也作为一个候选划分属性,则根据信息增益公式可计算出它的信息增益为 0.9182,远大于其他候选划分属性。

计算每个属性的信息熵过程中,我们发现,该属性的值为 0, 也就是其信息增益为 0.9182. 但是很明显这么分类,最后出现的结果不具有泛化效果。无法对新样本进行有效预测。

实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的 C4.5 决策树算法 [Quinlan,1993J 不直接使用信息增益,而是使用"增益率" (gain ratio) 来选择最优划分属性.

**增益率:**增益率是用前面的信息增益 Gain(D, a) 和属性 a 对应的"固有值"(intrinsic value) [Quinlan , 1993J 的比值来共同定义的。

image-20190701180359267

属性 a 的可能取值数目越多 (即 V 越大),则 IV(a) 的值通常会越大。

案例一

a.计算类别信息熵

b.计算性别属性的信息熵 (性别、活跃度)

c.计算活跃度的信息增益 (性别、活跃度)

d.计算属性分裂信息度量

用分裂信息度量来考虑某种属性进行分裂时分支的数量信息和尺寸信息,我们把这些信息称为属性的内在信息(instrisic information)。信息增益率用信息增益/内在信息,会导致属性的重要性随着内在信息的增大而减小** (也就是说,如果这个属性本身不确定性就很大,那我就越不倾向于选取它)**,这样算是对单纯用信息增益有所补偿。

image-20190701173713129

e.计算信息增益率

image-20190701173741987

活跃度的信息增益率更高一些,所以在构建决策树的时候,优先选择

通过这种方式,在选取节点的过程中,我们可以降低取值较多的属性的选取偏好。

案例二

如下图,第一列为天气,第二列为温度,第三列为湿度,第四列为风速,最后一列该活动是否进行。

我们要解决:根据下面表格数据,判断在对应天气下,活动是否会进行

image-20190520110721291

image-20190522125059373

该数据集有四个属性,属性集合 A={ 天气,温度,湿度,风速},类别标签有两个,类别集合 L={进行,取消}

a.计算类别信息熵

类别信息熵表示的是所有样本中各种类别出现的不确定性之和。根据熵的概念,熵越大,不确定性就越大,把事情搞清楚所需要的信息量就越多。

Ent(D)=914log2914514log2514=0.940

b.计算每个属性的信息熵

每个属性的信息熵相当于一种条件熵。他表示的是在某种属性的条件下,各种类别出现的不确定性之和。属性的信息熵越大,表示这个属性中拥有的样本类别越不“纯”。

image-20190701180511460

c.计算信息增益

信息增益的 = 熵 - 条件熵,在这里就是 类别信息熵 - 属性信息熵,它表示的是信息不确定性减少的程度。如果一个属性的信息增益越大,就表示用这个属性进行样本划分可以更好的减少划分后样本的不确定性,当然,选择该属性就可以更快更好地完成我们的分类目标。

信息增益就是 ID3 算法的特征选择指标。

image-20190701175852913

假设我们把上面表格 1 的数据前面添加一列为"编号",取值 (1--14). 若把"编号"也作为一个候选划分属性,则根据前面步骤:计算每个属性的信息熵过程中,我们发现,该属性的值为 0, 也就是其信息增益为 0.940. 但是很明显这么分类,最后出现的结果不具有泛化效果。此时根据信息增益就无法选择出有效分类特征。所以,C4.5 选择使用信息增益率对 ID3 进行改进。

d.计算属性分裂信息度量

用分裂信息度量来考虑某种属性进行分裂时分支的数量信息和尺寸信息,我们把这些信息称为属性的内在信息(instrisic information)。信息增益率用信息增益/内在信息,会导致属性的重要性随着内在信息的增大而减小** (也就是说,如果这个属性本身不确定性就很大,那我就越不倾向于选取它)**,这样算是对单纯用信息增益有所补偿。

image-20190701173339182

e.计算信息增益率

image-20190701173403157

天气的信息增益率最高,选择天气为分裂属性。发现分裂了之后,天气是“阴”的条件下,类别是”纯“的,所以把它定义为叶子节点,选择不“纯”的结点继续分裂。

image-20190520121422401

在子结点当中重复过程 1~5,直到所有的叶子结点足够"纯"。

现在我们来总结一下 C4.5 的算法流程

while(当前节点"不纯"):
    1.计算当前节点的类别熵(以类别取值计算)
    2.计算当前阶段的属性熵(按照属性取值吓得类别取值计算)
    3.计算信息增益
    4.计算各个属性的分裂信息度量
    5.计算各个属性的信息增益率
end while
当前阶段设置为叶子节点

为什么使用 C4.5 要好

  1. 用信息增益率来选择属性

    克服了用信息增益来选择属性时偏向选择值多的属性的不足。

  2. 采用了一种后剪枝方法

    避免树的高度无节制的增长,避免过度拟合数据

  3. 对于缺失值的处理

在某些情况下,可供使用的数据可能缺少某些属性的值。假如〈x,c(x)〉是样本集 S 中的一个训练实例,但是其属性 A 的值 A(x) 未知。

处理缺少属性值的一种策略是赋给它结点 n 所对应的训练实例中该属性的最常见值;

另外一种更复杂的策略是为 A 的每个可能值赋予一个概率。

例如,给定一个布尔属性 A,如果结点 n 包含 6 个已知 A=1 和 4 个 A=0 的实例,那么 A(x)=1 的概率是 0.6,而 A(x)=0 的概率是 0.4。于是,实例 x 的 60% 被分配到 A=1 的分支,40% 被分配到另一个分支。

C4.5 就是使用这种方法处理缺少的属性值。

基尼值和基尼指数 (CART)

CART 决策树 [Breiman et al., 1984] 使用"基尼指数" (Gini index) 来选择划分属性。

CART 是 Classification and Regression Tree 的简称,这是一种著名的决策树学习算法,分类和回归任务都可用

基尼值 Gini(D): 从数据集 D 中随机抽取两个样本,其类别标记不一致的概率。故,Gini(D)值越小,数据集 D 的纯度越高。

数据集 D 的纯度可用基尼值来度量:

image-20190701180551894

pk=CkD , D 为样本的所有数量,Ck 为第 k 类样本的数量。

基尼指数 Gini_index(D): 一般,选择使划分后基尼系数最小的属性作为最优化分属性。

image-20190701180610582

案例

请根据下图列表,按照基尼指数的划分依据,做出决策树。

序 号是否有房婚姻状况年收入是否拖欠贷款
1yessingle125kno
2nomarried100kno
3nosingle70kno
4yesmarried120kno
5nodivorced95kyes
6nomarried60kno
7yesdivorced220kno
8nosingle85kyes
9nomarried75kno
10NoSingle90kYes

1,对数据集非序列标号属性{是否有房,婚姻状况,年收入}分别计算它们的 Gini 指数,**取 Gini 指数最小的属性作为决策树的根节点属性。 **

第一次大循环

2,根节点的 Gini 值为:

image-20190701180659409

3,当根据是否有房来进行划分时,Gini 指数计算过程为:

image-20190701173439230

image-20190214131000602

4,若按婚姻状况属性来划分,属性婚姻状况有三个可能的取值{married,single,divorced},分别计算划分后的 Gini 系数增益。

{married} | {single,divorced}

{single} | {married,divorced}

{divorced} | {single,married}

image-20190701180730086

对比计算结果,根据婚姻状况属性来划分根节点时取 Gini 指数最小的分组作为划分结果,即:

{married} | {single,divorced}

5,同理可得年收入 Gini:

对于年收入属性为数值型属性,首先需要对数据按升序排序,然后从小到大依次用相邻值的中间值作为分隔将样本划分为两组。例如当面对年收入为 60 和 70 这两个值时,我们算得其中间值为 65。以中间值 65 作为分割点求出 Gini 指数。

image-20190521160430905

image-20190701180802159

根据计算知道,三个属性划分根节点的指数最小的有两个:年收入属性和婚姻状况,他们的指数都为 0.3。此时,选取首先出现的属性【married】作为第一次划分。

第二次大循环,算出是否有房对拖欠贷款的基尼影响值

6,接下来,采用同样的方法,分别计算剩下属性,其中根节点的 Gini 系数为(此时是否拖欠贷款的各有 3 个 records)

image-20190701180829379

7,对于是否有房属性,可得:

image-20190701180847171

8,对于年收入属性则有:

image-20190521171602023

经过如上流程,构建的决策树,如下图:

image-20190214132127391

现在我们来总结一下 CART 的算法流程

while(当前节点"不纯"):
    1.遍历每个变量的每一种分割方式,找到最好的分割点
    2.分割成两个节点N1和N2
end while
每个节点足够“纯”为止

小结

常见决策树的启发函数比较

image-20190701180919817

名称提出时间分支方式备注
ID31975信息增益ID3 只能对离散属性的数据集构成决策树
C4.51993信息增益率优化后解决了 ID3 分支过程中总喜欢偏向选择值较多的 属性
CART1984Gini 系数可以进行分类和回归,可以处理离散属性,也可以处理连续属性

ID3 算法

存在的缺点

(1) ID3 算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准 。信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息。

(2) ID3 算法只能对描述属性为离散型属性的数据集构造决策树

C4.5 算法

做出的改进 (为什么使用 C4.5 要好)

(1) 用信息增益率来选择属性

(2) 可以处理连续数值型属性

(3) 采用了一种后剪枝方法

(4) 对于缺失值的处理

C4.5 算法的优缺点

优点:

产生的分类规则易于理解,准确率较高。

缺点:

在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

此外,C4.5 只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

CART 算法

CART 算法相比 C4.5 算法的分类方法,采用了简化的二叉树模型,同时特征选择采用了近似的基尼系数来简化计算。

C4.5 不一定是二叉树,但 CART 一定是二叉树。

多变量决策树 (multi-variate decision tree)

同时,无论是 ID3, C4.5 还是 CART,在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数, 分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。 这样决策得到的决策树更加准确。 这个决策树叫做多变量决策树 (multi-variate decision tree)。 在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策。 这个算法的代表是 OC1,这里不多介绍。

如果样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习里面的随机森林之类的方法解决。

决策树变量的两种类型:

  1. 数字型(Numeric):变量类型是整数或浮点数,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=” 作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。
  2. 名称型(Nominal):类似编程语言中的枚举类型,变量只能从有限的选项中选取,比如前面例子中的“婚姻情况”,只能是“单身”,“已婚”或“离婚”,使用“=”来分割。

如何评估分割点的好坏?

如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。

比如上面的例子,“拥有房产”,可以将记录分成了两类,“是”的节点全部都可以偿还债务,非常“纯”;“否”的节点,可以偿还贷款和无法偿还贷款的人都有,不是很“纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。

构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。