1. 引言
在现实生活中,我们会遇到各种选择,不论是相亲,还是挑选水果,都是基于以往的经验来做判断。如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是我们今天要讲的决策树。
2. 决策树
决策树是一种通过对历史数据进行测算实现对新数据进行分类和预测的算法。简单来说决策树算法就是通过对已有明确结果的历史数据进行分析,寻找数据中的特征。并以此为依据对新产生的数据结果进行预测。
决策树由3个主要部分组成,分别为决策节点,分支,和叶子节点。其中决策树最顶部的决策节点是根决策节点。每一个分支都有一个新的决策节点。决策节点下面是叶子节点。每个决策节点表示一个待分类的数据类别或属性,每个叶子节点表示一种结果。
2.1 决策树特征
- 决策树是一种非参数监督学习方法,用于分类与回归。
- 目标是创建一个模型,从数据特征中进行学习,进而推断出的简单决策规则,用来预测目标变量的值。
- 决策树是一种树形结构,通过做出一系列决策(选择)来对数据进行划分,这类似于针对一系列问题进行选择。
- 决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。
3. 决策树的工作原理
决策树基本上就是把我们以前的经验总结出来。如果我们要出门打篮球,一般会根据“天气”、“温度”、“湿度”、“刮风”这几个条件来判断,最后得到结果:去打篮球?还是不去?
上面这个图就是一棵典型的决策树。我们在做决策树的时候,会经历两个阶段:构造和剪枝。
3.1 构造
构造就是生成一棵完整的决策树。简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点:
- 根节点:就是树的最顶端,最开始的那个节点。在上图中,“天气”就是一个根节点;
- 内部节点:就是树中间的那些节点,比如说“温度”、“湿度”、“刮风”;
- 叶节点:就是树最底部的节点,也就是决策结果
节点之间存在父子关系。比如根节点会有子节点,子节点会有子子节点,但是到了叶节点就停止了,叶节点不存在子节点。那么在构造过程中,我们要解决三个的问题:
- 选择哪个属性作为根节点;
- 选择哪些属性作为子节点;
- 什么时候停止并得到目标状态,即叶节点。
3.2 剪枝
剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。之所以这么做,是为了防止“过拟合”(Overfitting)现象的发生。
- 过拟合:指的是模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。
- 欠拟合:指的是模型的训练结果不理想。
造成过拟合的原因:
一是因为训练集中样本量较小。如果决策树选择的属性过多,构造出来的决策树一定能够“完美”地把训练集中的样本分类,但是这样就会把训练集中一些数据的特点当成所有数据的特点,但这个特点不一定是全部数据的特点,这就使得这个决策树在真实的数据分类中出现错误,也就是模型的“泛化能力”差。
剪枝的方法:
- 预剪枝:在决策树构造时就进行剪枝。方法是,在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。
- 后剪枝:在生成决策树之后再进行剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。方法是:用这个节点子树的叶子节点来替代该节点。
4. 常用算法
我们该如何构造一个判断是否去打篮球的决策树呢?再回顾一下决策树的构造原理,在决策过程中有三个重要的问题:将哪个属性作为根节点?选择哪些属性作为后继节点?什么时候停止并得到目标值?
显然将哪个属性(天气、温度、湿度、刮风)作为根节点是个关键问题,在这里我们先介绍两个指标:纯度和信息熵。
纯度:
我们可以把决策树的构造过程理解成为寻找纯净划分的过程。数学上,我们可以用纯度来表示,纯度换一种方式来解释就是让目标变量的分歧最小。
举个例子,假设有 3 个集合:
- 集合 1:6 次都去打篮球;
- 集合 2:4 次去打篮球,2 次不去打篮球;
- 集合 3:3 次去打篮球,3 次不去打篮球。
按照纯度指标来说,集合 1> 集合 2> 集合 3。因为集合1 的分歧最小,集合 3 的分歧最大。
信息熵:表示信息的不确定度
在信息论中,随机离散事件出现的概率存在着不确定性。为了衡量这种信息的不确定性,信息学之父香农引入了信息熵的概念,并给出了计算信息熵的数学公式:
p(i|t) 代表了节点 t 为分类 i 的概率,其中 log2 为取以 2 为底的对数。它能帮我们反映出来这个信息的不确定度。当不确定性越大时,它所包含的信息量也就越大,信息熵也就越高。
信息量
信息量是对信息的度量,就跟时间的度量是秒一样,当我们考虑一个离散的随机变量x的时候,当我们观察到的这个变量的一个具体值的时候,我们接收到了多少信息呢?
信息量有两个重要的特点:
(1)一个事件的信息量与这个事件发生的概率是呈负相关的
变量的不确定性越大,把它搞清楚所需要的信息量也就越大,这很容易理解
(2)如果两个事件X、Y的发生没有相互影响的关系(两事件不相关),则信息量满足可加性:h(X,Y) = h(X)+ h(Y)。
我们知道两个不相关事件X、Y发生的概率满足公式:P(X,Y)= P(X)* P(Y)。
根据上面推导,我们很容易看出h(x)一定与p(x)的对数有关(因为对数形式的真数相乘之后,能够对应对数的相加形式)。因此我们有信息量公式如下:
下面解决俩个疑问?
(1)为什么有一个负号
其中,负号是为了确保信息一定是正数或者是0
(2)为什么底数为2
这是因为,我们只需要信息量满足低概率事件x对应于高的信息量。那么对数的选择是任意的。我们只是遵循信息论的普遍传统,使用2作为对数的底信息熵
下面我们正式引出信息熵。
信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。即
转换一下为:
举个例子,假设有 2 个集合:
- 集合 1:5 次去打篮球,1 次不去打篮球;
- 集合 2:3 次去打篮球,3 次不去打篮球。
在集合 1 中,有 6 次决策,其中打篮球是 5 次,不打篮球是 1 次。那么假设:类别 1 为“打篮球”,即次数为 5;类别 2 为“不打篮球”,即次数为 1。那么节点划分为类别1的概率是 5/6,为类别2的概率是1/6,带入上述信息熵公式可以计算得出:
同样,集合 2 中,也是一共 6 次决策,其中类别 1 中“打篮球”的次数是 3,类别 2“不打篮球”的次数也是 3,那么信息熵为多少呢?我们可以计算得出:
从上面的计算结果中可以看出,信息熵越大,纯度越低。当集合中的所有样本均匀混合时,信息熵最大,纯度最低。
我们在构造决策树的时候,会基于纯度来构建。而经典的 “不纯度”的指标有三种,分别是信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)。
4.1 信息增益(ID3 算法)
信息增益指的就是划分可以带来纯度的提高,信息熵的下降。它的计算公式,是父亲节点的信息熵减去所有子节点的信息熵。在计算的过程中,我们会计算每个子节点的归一化信息熵,即按照每个子节点在父节点中出现的概率,来计算这些子节点的信息熵。所以信息增益的公式可以表示为:
公式中 D 是父亲节点,Di 是子节点,Gain(D,a)中的 a 作为 D 节点的属性选择。
假设D 天气 = 晴的时候,会有 5 次去打篮球,5 次不打篮球。其中 D1 刮风 = 是,有 2 次打篮球,1 次不打篮球。D2 刮风 = 否,有 3 次打篮球,4 次不打篮球。那么a 代表节点的属性,即天气 = 晴。
针对图上这个例子,D 作为节点的信息增益为:
也就是 D 节点的信息熵 -2 个子节点的归一化信息熵。2个子节点归一化信息熵 =3/10 的 D1 信息熵 +7/10 的 D2 信息熵。
我们基于 ID3 的算法规则,完整地计算下我们的训练集,训练集中一共有 7 条数据,3 个打篮球,4 个不打篮球,所以根节点的信息熵是:
如果你将天气作为属性的划分,会有三个叶子节点 D1、D2 和D3,分别对应的是晴天、阴天和小雨。我们用 + 代表去打篮球,- 代表不去打篮球。那么第一条记录,晴天不去打篮球,可以记为 1-,于是我们可以用下面的方式来记录 D1,D2,D3:
D1(天气 = 晴天)={1-,2-,6+}
D2(天气 = 阴天)={3+,7-}
D3(天气 = 小雨)={4+,5-}
我们先分别计算三个叶子节点的信息熵:
因为 D1 有 3 个记录,D2 有 2 个记录,D3 有2 个记录,所以 D 中的记录一共是 3+2+2=7,即总数为 7。所以 D1 在 D(父节点)中的概率是 3/7,D2在父节点的概率是 2/7,D3 在父节点的概率是 2/7。那么作为子节点的归一化信息熵 = 3/7*0.918+2/7*1.0+2/7*1.0=0.965。
因为我们用 ID3 中的信息增益来构造决策树,所以要计算每个节点的信息增益。
天气作为属性节点的信息增益为,Gain(D , 天气)=0.985-0.965=0.020。
同理我们可以计算出其他属性作为根节点的信息增益,它们分别为:
Gain(D , 温度)=0.128
Gain(D , 湿度)=0.020
Gain(D , 刮风)=0.020
我们能看出来温度作为属性的信息增益最大。因为 ID3 就是要将信息增益最大的节点作为父节点,这样可以得到纯度高的决策树,所以我们将温度作为根节点。其决策树状图分裂为下图所示:
然后我们要将上图中第一个叶节点,也就是 D1={1-,2-,3+,4+}进一步进行分裂,往下划分,计算其不同属性(天气、湿度、刮风)作为节点的信息增益,可以得到:
Gain(D , 天气)=0
Gain(D , 湿度)=0
Gain(D , 刮风)=0.0615
我们能看到刮风为 D1 的节点都可以得到最大的信息增益,这里我们选取刮风作为节点。同理,我们可以按照上面的计算步骤得到完整的决策树,结果如下:
4.2 信息增益率(C4.5 算法)
1. 采用信息增益率
因为 ID3 在计算的时候,倾向于选择取值多的属性。为了避免这个问题,C4.5 采用信息增益率的方式来选择属性。
信息增益率 = 信息增益 / 属性熵
当属性有很多值的时候,相当于被划分成了许多份,虽然信息增益变大了,但是对于 C4.5 来说,属性熵也会变大,所以整体的信息增益率并不大。
2. 采用悲观剪枝
ID3 构造决策树的时候,容易产生过拟合的情况。在 C4.5中,会在决策树构造之后采用悲观剪枝(PEP),这样可以提升决策树的泛化能力。
悲观剪枝是后剪枝技术中的一种,通过递归估算每个内部节点的分类错误率,比较剪枝前后这个节点的分类错误率来决定是否对其进行剪枝。
3. 离散化处理连续属性
C4.5 可以处理连续属性的情况,对连续的属性进行离散化的处理。比如打篮球存在的“湿度”属性,不按照“高、中”划分,而是按照湿度值进行计算,那么湿度取什么值都有可能。该怎么选择这个阈值呢,C4.5 选择具有最高信息增益的划分所对应的阈值。
4. 处理缺失值
针对数据集不完整的情况,C4.5 也可以进行处理。
假如我们得到的是如下的数据,你会发现这个数据中存在两点问题。第一个问题是,数据集中存在数值缺失的情况,如何进行属性选择?第二个问题是,假设已经做了属性划分,但是样本在这个属性上有缺失值,该如何对样本进行划分?
我们不考虑缺失的数值,可以得到
温度 D={2-,3+,4+,5-,6+,7-}
温度 = 高:D1={2-,3+,4+};
温度 = 中:D2={6+,7-};
温度 = 低:D3={5-} 。这里 + 号代表打篮球,- 号代表不打篮球。比如ID=2 时,决策是不打篮球,我们可以记录为 2-。
所以三个叶节点的信息熵可以结算为:
这三个节点的归一化信息熵为 3/6*0.918+2/6*1.0+1/6*0=0.792。
针对将属性选择为温度的信息增益为:
Gain(D′, 温度)=Ent(D′)-0.792=1.0-0.792=0.208
D′的样本个数为 6,而 D 的样本个数为 7,所以所占权重比例为 6/7,所以 Gain(D′,温度) 所占权重比例为6/7,所以:
Gain(D, 温度)=6/7*0.208=0.178
这样即使在温度属性的数值有缺失的情况下,我们依然可以计算信息增益,并对属性进行选择。
小结:
首先 ID3 算法的优点是方法简单,缺点是对噪声敏感。训练数据如果有少量错误,可能会产生决策树分类错误。C4.5 在 IID3 的基础上,用信息增益率代替了信息增益,解决了噪声敏感的问题,并且可以对构造树进行剪枝、处理连续数值以及数值缺失等情况,但是由于 C4.5 需要对数据集进行多次扫描,算法效率相对较低。
5. 总结
优点
- 决策树易于理解和实现. 人们在通过解释后都有能力去理解决策树所表达的意义。
- 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
- 对缺失值不敏感
- 可以处理不相关特征数据
- 效率高,每一次预测的最大计算次数不超过决策树的深度。
缺点
- 对连续性的字段比较难预测。对有时间顺序的数据,需要很多预处理的工作。
- 当类别太多时,错误可能就会增加的比较快。
- 对于新增的样本,需要重新调整树结构
- 在处理特征关联性比较强的数据时表现得不是太好,会忽略属性之间的相关性
适用范围
- 具有决策者期望达到的明确目标
- 存在决策者可以选择的两个以上的可行的备选方案
- 存在决策者无法控制的两个以上不确定因素
- 不同方案在不同因素下的收益或损失可以计算出来
- 决策者可以估计不确定因素发生的概率
刚开始学习决策树分类的时候看了很多文章,每个人的切入角度不同,整体来看,学习决策树算法要先了解决策树相关的一些概念,像“信息熵”、“纯度”这些,之前在博客园上看到一篇文章很不错,整体通过一个打篮球的例子来代入及介绍,让人更容易理解,本文参考该例子,并加入了一些更为基础的概念及介绍,对于初步了解决策树很有帮助。基尼指数(Cart 算法)也是一种比较常用的决策树分类算法,研究后下次记录。
参考资料:https://www.cnblogs.com/molieren/articles/10664954.htm