决策树(decision tree)是机器学习中最常见的方法之一,本文主要对决策树的定义,生成与修剪以及经典的决策树生成算法进行简要介绍。目录如下
一、什么是决策树
二、决策树的生成
三、决策树的修剪
四、一些经典的决策树生成算法
一、什么是决策树
顾名思义,决策树是基于树结构来进行决策的。它每次从训练样本的若干属性中选择一项出来进行判定,并根据样本在该属性上的取值将样本划入不同的集合,之后进行下一轮决策,直到同一集合中的样本都属于相同类别为止。为便于理解,我们可以想象生活中的如下场景:一家企业准备招聘一名软件工程师,但是却收到了100份简历,那么如何从这100份简历中筛选出进入面试的人选呢?这家公司的HR想出了一种方法:
第一轮筛选
首先看应聘者的学历,本科以上直接通过,本科以下直接拒绝,剩下的本科学历的应聘者待定进入第二轮筛选。
第二轮筛选
应聘者的本科院校是否为985/211重点高校?是的话则pass,不是的话再进入第三轮筛选。
第三轮筛选
应聘者项目经验是否丰富?是的话pass,不是的话淘汰。
就这样,通过三轮筛选HR成功地从100位应聘者中筛选出了进入面试的人选。这个过程中HR用到的方法就是决策树,我们可以将这种方法表示成下面的图片以更直观地了解。
二、决策树的生成
在上一节的定义中我们可以发现决策树主要由“用来判别的特征(属性)”和“不同的分类集合”构成。因此决策树的构成通常是一个递归地选择特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。由于不同的特征对训练数据的划分能力不同,有时将划分能力强的特征先应用可以大大缩减决策树的高度与计算复杂度,比如在上面的例子中如果HR将毕业院校作为第一轮筛选的特征,那么后面的筛选也许就不需要“学历”这一特征了(考虑到绝大多数本科以上学历的应聘者都毕业于985/211高校),这样原本三轮的筛选,只需要两轮就能完成,因此我们构造决策树进行特征选址时应该选择最优的特征。
更具体地我们可以把决策树的生成过程概括为以下四个步骤:
1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。
4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
从上面的过程中不难看出,在决策树的生成中最核心的是选择最优特征,那么怎样的特征才算是最优特征呢?一般而言,我们希望经过每一次划分后,决策树的分支节点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。所以最优特征是使划分后的结点纯度最高的特征。那么如何衡量“纯度”?这里便涉及到了“信息熵”的相关理论与知识。
“信息熵”是度量样本集合纯度最常用的一种指标。假设当前样本集合D中第k类样本所占比例为pk(i=1,2,…,|y|),则D的信息熵定义为
H(X)的值越小,则X的纯度越高。
知道了信息熵的概念后,我们解决了衡量集合“纯度”的问题,但是一个特征往往会划分出好几个集合,如果这些集合的“纯度”各不相同,我们又该如何判断这个特征是最优还是其他特征是最优呢?对于这个问题我们很容易想到的办法就是,对不同集合的纯度进行加权平均,样本多的集合权重大,样本少的集合权重小。没错!这种思想正是决策树中“信息增益”的源头。
假定离散属性a有V个可能的取值{a1,a2,…,av},若使用a来对样本集合D进行划分,则会产生V个分支节点,其中第v个分支点包含了D中所有在属性a上取值为av的样本,记为D(v)。我们可根据上面计算信息熵的式子计算出各个结点的信息熵,然后按照不同分支结点所包含的样本数,给结点赋予权重|D(v)|/|D|,即样本数越多的分支结点的影响越大,于是可以计算出用属性a对样本集D进行划分所获得的“信息增益”(information gain)。
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。因此,我们可用信息增益来进行决策树的划分属性选择。
三、决策树的修剪
剪枝(pruning)是决策树学习算法对付”过拟合“的主要手段。在决策树学习中,为了尽可能正确分类训练样本,有时会产生特征选择太多、决策树分支过多的情况,这不仅降低了决策树的效率,还存在过拟合的风险,使得训练出的模型泛化性能不高。为了解决这个问题,我们可以主动去掉决策树的一些分支来降低过拟合的风险。
决策树剪枝的基本策略有”预剪枝“(prepruning)和”后剪枝“(post-pruning)。
预剪枝是指在决策树生成过程中,对每个节点在划分前进行估计,若当前的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点;
后剪枝是先从训练集生成一颗完整的决策树,然后自底向上的对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点。
剪枝处理降低了”过拟合“风险,但也带来了”欠拟合“的风险。
一般情形下,后剪枝决策树欠拟合风险较小,泛化性能往往优于预剪枝决策树。但后剪枝训练开销比未剪枝决策树和预剪枝决策树都要大很多。
四、一些经典的决策树生成算法
1、ID3
ID3算法的核心是在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树。
具体方法是:
1)从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征。
2)由该特征的不同取值建立子节点,再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止;
3)最后得到一个决策树。
ID3相当于用极大似然法进行概率模型的选择
2、C4.5
4.5是对ID3算法的一个改进,主要改进点就是解决了ID3的几个缺点。首先C4.5算法用的是信息增益率来代替ID3中的信息增益。这么做其实就是弱化那些偏向,让选择最优特征时更加公平。另外C4.5的改进就是可以处理连续值(这个方法其实和上面我提到的连续值离散化很类似,可以理解为单点逐一离散化),具体步骤如下:
1)首先对于连续值属性的值进行排序(A1,A2......An);
2)我们可以在每两个值之间取一个点,用这个点就可以把该组连续值分为两部分,比如我们去一个点a1($A1<a1<A2$),则小于a1的部分(A1)大于a1的部分(A2......An)。但是这个a1好吗?不知道呀!那我们loop一下所有这样的a(共有n-1个),每一个ai我们可以算出分裂前后的信息增益率,然后我们求一个max即可。很简单吧!思路很好,但是呀很显然有个问题,时间开销有点大。
3)缺失值的处理,ID3不能直接处理(需要我们人工处理,比如单独赋值或赋一个平均值),C4.5给出了一个很优雅的方式,为什么说优雅,这样讲吧!我们每一个特征的取值都有若干个,根据训练集每个可能的取值都有一个概率,我们用这个概率来表示这个确实值得可能取值。这样就显得很合理了。
C4.5各方面完胜ID3,所以C4.5一出现就被广泛应用,后面为了解决这个算法的时间开销问题,推出了这个算法的改进版C5.0,大体上C5.0的速度是C4.5的10倍以上。
参考文献
- 周志华《机器学习》
- OverFitting,https://www.cnblogs.com/wenyi1992/p/7685131.html