分类算法——决策树

一、摘要

      在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类贝叶斯网络两种分类算法。这两种算法都以贝叶斯定理为基础,能够对分类及决策问题进行几率推断。在这一篇文章中,将讨论另外一种被普遍使用的分类算法——决策树(decision tree)。相比贝叶斯算法,决策树的优点在于构造过程不须要任何领域知识或参数设置,所以在实际应用中,对于探测式的知识发现,决策树更加适用。html

二、决策树引导

      通俗来讲,决策树分类的思想相似于找对象。现想象一个女孩的母亲要给这个女孩介绍男友,因而有了下面的对话:算法

      女儿:多大年纪了?网络

      母亲:26。测试

      女儿:长的帅不帅?spa

      母亲:挺帅的。3d

      女儿:收入高不?日志

      母亲:不算很高,中等状况。orm

      女儿:是公务员不?htm

      母亲:是,在税务局上班呢。对象

      女儿:那好,我去见见。

      这个女孩的决策过程就是典型的分类树决策。至关于经过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁如下、长相中等以上而且是高收入者或中等以上收入的公务员,那么这个能够用下图表示女孩的决策逻辑(声明:此决策树纯属为了写文章而YY的产物,没有任何根据,也不表明任何女孩的择偶倾向,请各位女同胞莫质问我^_^):

      上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不一样状况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。

      这幅图基本能够算是一颗决策树,说它“基本能够算”是由于图中的断定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,若是将全部条件量化,则就变成真正的决策树了。

      有了上面直观的认识,咱们能够正式定义决策树了:

      决策树(decision tree)是一个树结构(能够是二叉树或非二叉树)。其每一个非叶节点表示一个特征属性上的测试,每一个分支表明这个特征属性在某个值域上的输出,而每一个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别做为决策结果。

      能够看到,决策树的决策过程很是直观,容易被人理解。目前决策树已经成功运用于医学、制造产业、天文学、分支生物学以及商业等诸多领域。知道了决策树的定义以及其应用方法,下面介绍决策树的构造算法。

三、决策树的构造

      不一样于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分红不一样的类的属性。所谓决策树的构造就是进行属性选择度量肯定各个特征属性之间的拓扑结构。

      构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不一样划分构造不一样的分支,其目标是让各个分裂子集尽量地“纯”。尽量“纯”就是尽可能让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不一样的状况:

      一、属性是离散值且不要求生成二叉决策树。此时用属性的每个划分做为一个分支。

      二、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分红两个分支。

      三、属性是连续值。此时肯定一个值做为分裂点split_point,按照>split_point和<=split_point生成两个分支。

      构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分D“最好”地分红个体类的启发式方法,它决定了拓扑结构及分裂点split_point的选择。

      属性选择度量算法有不少,通常使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍ID3C4.5两种经常使用算法。

3.一、ID3算法

      从信息论知识中咱们直到,指望信息越小,信息增益越大,从而纯度越高。因此ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。下面先定义几个要用到的概念。

      设D为用类别对训练元组进行的划分,则D的(entropy)表示为:

     

      其中pi表示第i个类别在整个训练元组中出现的几率,能够用属于此类别元素的数量除以训练元组元素总数量做为估计。熵的实际意义表示是D中元组的类标号所须要的平均信息量。

      如今咱们假设将训练元组D按属性A进行划分,则A对D划分的指望信息为:

     

      而信息增益即为二者的差值:

     

      ID3算法就是在每次须要分裂时,计算每一个属性的增益率,而后选择增益率最大的属性进行分裂。下面咱们继续用SNS社区中不真实帐号检测的例子说明如何使用ID3算法构造决策树。为了简单起见,咱们假设训练集合包含10个元素:

      其中s、m和l分别表示小、中和大。

      设L、F、H和R表示日志密度、好友密度、是否使用真实头像和帐号是否真实,下面计算各属性的信息增益。

     

     

     

      所以日志密度的信息增益是0.276。

      用一样方法获得H和F的信息增益分别为0.033和0.553。

      由于F具备最大的信息增益,因此第一次分裂选择F为分裂属性,分裂后的结果以下图表示:

      在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就能够获得整个决策树。

      上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。对于特征属性为连续值,能够如此使用ID3算法:

      先将D中元素按照特征属性排序,则每两个相邻元素的中间点能够看作潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的指望信息,具备最小指望信息的点称为这个属性的最佳分裂点,其信息指望做为此属性的信息指望。

3.二、C4.5算法

      ID3算法存在一个问题,就是偏向于多值属性,例如,若是存在惟一标识属性ID,则ID3会选择它做为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。

      C4.5算法首先定义了“分裂信息”,其定义能够表示成:

     

      其中各符号意义与ID3算法相同,而后,增益率被定义为:

     

      C4.5选择具备最大增益率的属性做为分裂属性,其具体应用与ID3相似,再也不赘述。

四、关于决策树的几点补充说明

4.一、若是属性用完了怎么办

      在决策树构造过程当中可能会出现这种状况:全部属性都做为分裂属性用光了,但有的子集还不是纯净集,即集合内的元素不属于同一类别。在这种状况下,因为没有更多信息可使用了,通常对这些子集进行“多数表决”,即便用此子集中出现次数最多的类别做为此节点类别,而后将此节点做为叶子节点。

4.二、关于剪枝

      在实际构造决策树时,一般要进行剪枝,这时为了处理因为数据中的噪声和离群点致使的过度拟合问题。剪枝有两种:

      先剪枝——在构造过程当中,当某个节点知足剪枝条件,则直接中止此分支的构造。

      后剪枝——先构造完成完整的决策树,再经过某些条件遍历树进行剪枝。

      关于剪枝的具体算法这里再也不详述,有兴趣的能够参考相关文献。


 文章参考:算法杂货铺——分类算法之决策树