热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

决策树系列(一)——基础知识回顾与总结

决策树系列(一)——基础知识回顾与总结1.决策树的定义树想必大家都会比较熟悉,是由节点和边两种元素组成的结构。理解树,就需

决策树系列(一)——基础知识回顾与总结

1.决策树的定义

      树想必大家都会比较熟悉,是由节点和边两种元素组成的结构。理解树,就需要理解几个关键词:根节点、父节点、子节点和叶子节点。

      父节点和子节点是相对的,说白了子节点由父节点根据某一规则分裂而来,然后子节点作为新的父亲节点继续分裂,直至不能分裂为止。而根节点是没有父节点的节点,即初始分裂节点,叶子节点是没有子节点的节点,如下图所示:

图1.1 树的结构示意图

     决策树利用如上图所示的树结构进行决策,每一个非叶子节点是一个判断条件,每一个叶子节点是结论。从跟节点开始,经过多次判断得出结论。

2. 决策树如何做决策

从一个分类例子说起:

      银行希望能够通过一个人的信息(包括职业、年龄、收入、学历)去判断他是否有贷款的意向,从而更有针对性地完成工作。下表是银行现在能够掌握的信息,我们的目标是通过对下面的数据进行分析建立一个预测用户贷款一下的模型。

                                   表2.1 银行用户信息表


职业

年龄

收入

学历

是否贷款

自由职业

28

5000

高中

工人

36

5500

高中

工人

42

2800

初中

白领

45

3300

小学

白领

25

10000

本科

白领

32

8000

硕士

白领

28

13000

博士

自由职业

21

4000

本科

自由职业

22

3200

小学

工人

33

3000

高中

工人

48

4200

小学

(注:上表中的数据都由本人捏造,不具有任何实际的意义)

      上边中有4个客户的属性,如何综合利用这些属性去判断用户的贷款意向?决策树的做法是每次选择一个属性进行判断,如果不能得出结论,继续选择其他属性进行判断,直到能够“肯定地”判断出用户的类型或者是上述属性都已经使用完毕。比如说我们要判断一个客户的贷款意向,我们可以先根据客户的职业进行判断,如果不能得出结论,再根据年龄作判断,这样以此类推,直到可以得出结论为止。

  决策树用树结构实现上述的判断流程,如图2.1所示:

                                  图2.1 银行贷款意向分析决策树示意图

     通过图2.1的训练数据,我们可以建议图2.1所示的决策树,其输入是用户的信息,输出是用户的贷款意向。如果要判断某一客户是否有贷款的意向,直接根据用户的职业、收入、年龄以及学历就可以分析得出用户的类型。如某客户的信息为:{职业、年龄,收入,学历}={工人、39, 1800,小学},将信息输入上述决策树,可以得到下列的分析步骤和结论。

第一步:根据该客户的职业进行判断,选择“工人”分支;

 

第二步&#xff1a;根据客户的年龄进行选择&#xff0c;选择年龄”<&#61;40”这一分支&#xff1b;

 

第三步&#xff1a;根据客户的学历进行选择&#xff0c;选择”小学”这一分支&#xff0c;得出该客户无贷款意向的结论。

 

 

3. 决策树的构建

     那么问题就来了&#xff0c;如何构建如图2.1所示一棵决策树呢&#xff1f;决策树的构建是数据逐步分裂的过程&#xff0c;构建的步骤如下:

步骤1&#xff1a;将所有的数据看成是一个节点&#xff0c;进入步骤2&#xff1b;

步骤2&#xff1a;从所有的数据特征中挑选一个数据特征对节点进行分割&#xff0c;进入步骤3&#xff1b;

步骤3&#xff1a;生成若干孩子节点&#xff0c;对每一个孩子节点进行判断&#xff0c;如果满足停止分裂的条件&#xff0c;进入步骤4&#xff1b;否则&#xff0c;进入步骤2&#xff1b;

步骤4&#xff1a;设置该节点是子节点&#xff0c;其输出的结果为该节点数量占比最大的类别。

 

      从上述步骤可以看出&#xff0c;决策生成过程中有两个重要的问题&#xff1a;

&#xff08;1&#xff09;数据如何分割

&#xff08;2&#xff09;如何选择分裂的属性

&#xff08;3&#xff09;什么时候停止分裂

3.1 数据分割

      假如我们已经选择了一个分裂的属性&#xff0c;那怎样对数据进行分裂呢&#xff1f;

  分裂属性的数据类型分为离散型和连续性两种情况&#xff0c;对于离散型的数据&#xff0c;按照属性值进行分裂&#xff0c;每个属性值对应一个分裂节点&#xff1b;对于连续性属性&#xff0c;一般性的做法是对数据按照该属性进行排序&#xff0c;再将数据分成若干区间&#xff0c;如[0,10]、[10,20]、[20,30]…&#xff0c;一个区间对应一个节点&#xff0c;若数据的属性值落入某一区间则该数据就属于其对应的节点。

例&#xff1a;

                                                                                             3.1  分类信息表


职业

年龄

是否贷款

白领

30

工人

40

工人

20

学生

15

学生

18

白领

42

&#xff08;1&#xff09;属性1“职业”是离散型变量&#xff0c;有三个取值&#xff0c;分别为白领、工人和学生&#xff0c;根据三个取值对原始的数据进行分割&#xff0c;如下表所示:

                                                                                           表3.2  属性1数据分割表


取值

贷款

不贷款

白领

1

1

工人

0

2

学生

1

1

表3.2可以表示成如下的决策树结构&#xff1a;

&#xff08;2&#xff09;属性2是连续性变量&#xff0c;这里将数据分成三个区间&#xff0c;分别是[10&#xff0c;20]、[20,30]、[30,40]&#xff0c;则每一个区间的分裂结果如下&#xff1a;

                                表3.3 属性2数据分割表


区间

贷款

不贷款

[0,20]

1

2

(20,40]

0

2

(40,—]

1

0

表3.3可以表示成如下的决策树结构&#xff1a;

3.2 分裂属性的选择

      我们知道了分裂属性是如何对数据进行分割的&#xff0c;那么我们怎样选择分裂的属性呢&#xff1f;

  决策树采用贪婪思想进行分裂&#xff0c;即选择可以得到最优分裂结果的属性进行分裂。那么怎样才算是最优的分裂结果&#xff1f;最理想的情况当然是能找到一个属性刚好能够将不同类别分开&#xff0c;但是大多数情况下分裂很难一步到位&#xff0c;我们希望每一次分裂之后孩子节点的数据尽量”纯”&#xff0c;以下图为例&#xff1a;

     从图3.1和图3.2可以明显看出&#xff0c;属性2分裂后的孩子节点比属性1分裂后的孩子节点更纯&#xff1a;属性1分裂后每个节点的两类的数量还是相同&#xff0c;跟根节点的分类结果相比完全没有提高&#xff1b;按照属性2分裂后每个节点各类的数量相差比较大&#xff0c;可以很大概率认为第一个孩子节点的输出结果为类1&#xff0c;第2个孩子节点的输出结果为2。

      选择分裂属性是要找出能够使所有孩子节点数据最纯的属性&#xff0c;决策树使用信息增益或者信息增益率作为选择属性的依据。

&#xff08;1&#xff09;信息增益

      用信息增益表示分裂前后跟的数据复杂度和分裂节点数据复杂度的变化值&#xff0c;计算公式表示为&#xff1a;

                                             

      其中Gain表示节点的复杂度&#xff0c;Gain越高&#xff0c;说明复杂度越高。信息增益说白了就是分裂前的数据复杂度减去孩子节点的数据复杂度的和&#xff0c;信息增益越大&#xff0c;分裂后的复杂度减小得越多&#xff0c;分类的效果越明显。

节点的复杂度可以用以下两种不同的计算方式&#xff1a;

  a&#xff09;熵

  熵描述了数据的混乱程度&#xff0c;熵越大&#xff0c;混乱程度越高&#xff0c;也就是纯度越低&#xff1b;反之&#xff0c;熵越小&#xff0c;混乱程度越低&#xff0c;纯度越高。 熵的计算公式如下所示&#xff1a;

                                                                                                              

  其中Pi表示类i的数量占比。以二分类问题为例&#xff0c;如果两类的数量相同&#xff0c;此时分类节点的纯度最低&#xff0c;熵等于1&#xff1b;如果节点的数据属于同一类时&#xff0c;此时节点的纯度最高&#xff0c;熵 等于0。

  b&#xff09;基尼值

  基尼值计算公式如下&#xff1a;

                                                                

  其中Pi表示类i的数量占比。其同样以上述熵的二分类例子为例&#xff0c;当两类数量相等时&#xff0c;基尼值等于0.5 &#xff1b;当节点数据属于同一类时&#xff0c;基尼值等于0 。基尼值越大&#xff0c;数据越不纯。

 

  例&#xff1a;

  以熵作为节点复杂度的统计量&#xff0c;分别求出下面例子的信息增益&#xff0c;图3.1表示节点选择属性1进行分裂的结果&#xff0c;图3.2表示节点选择属性2进行分裂的结果&#xff0c;通过计算两个属性分裂后的信息增益&#xff0c;选择最优的分裂属性。

        

属性1&#xff1a;

 

属性2&#xff1a;

 

由于  &#xff0c;所以属性1与属性2相比是更优的分裂属性&#xff0c;故选择属性1作为分裂的属性。

&#xff08;2&#xff09;信息增益率

      使用信息增益作为选择分裂的条件有一个不可避免的缺点&#xff1a;倾向选择分支比较多的属性进行分裂。为了解决这个问题&#xff0c;引入了信息增益率这个概念。信息增益率是在信息增益的基础上除以分裂节点数据量的信息增益&#xff08;听起来很拗口&#xff09;&#xff0c;其计算公式如下&#xff1a;

                                                                                     

      其中 表示信息增益&#xff0c; 表示分裂子节点数据量的信息增益&#xff0c;其计算公式为&#xff1a;

                                                                                       

      其中m表示子节点的数量&#xff0c;表示第i个子节点的数据量&#xff0c;N表示父节点数据量&#xff0c;说白了&#xff0c; 其实是分裂节点的熵&#xff0c;如果节点的数据链越接近&#xff0c;越大&#xff0c;如果子节点越大&#xff0c;越大&#xff0c;而就会越小&#xff0c;能够降低节点分裂时选择子节点多的分裂属性的倾向性。信息增益率越高&#xff0c;说明分裂的效果越好。

       还是信息增益中提及的例子为例&#xff1a;

        

属性1的信息增益率&#xff1a;

 

属性2的信息增益率&#xff1a;

 

         由于 &#xff0c;故选择属性2作为分裂的属性。

3.3 停止分裂的条件

  决策树不可能不限制地生长&#xff0c;总有停止分裂的时候&#xff0c;最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂&#xff0c;但这种情况下树过于复杂&#xff0c;而且预测的经度不高。一般情况下为了降低决策树复杂度和提高预测的经度&#xff0c;会适当提前终止节点的分裂。

  以下是决策树节点停止分裂的一般性条件&#xff1a;

  &#xff08;1&#xff09;最小节点数

  当节点的数据量小于一个指定的数量时&#xff0c;不继续分裂。两个原因&#xff1a;一是数据量较少时&#xff0c;再做分裂容易强化噪声数据的作用&#xff1b;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。

  &#xff08;2&#xff09;熵或者基尼值小于阀值。

     由上述可知&#xff0c;熵和基尼值的大小表示数据的复杂程度&#xff0c;当熵或者基尼值过小时&#xff0c;表示数据的纯度比较大&#xff0c;如果熵或者基尼值小于一定程度数&#xff0c;节点停止分裂。

  &#xff08;3&#xff09;决策树的深度达到指定的条件

   节点的深度可以理解为节点与决策树跟节点的距离&#xff0c;如根节点的子节点的深度为1&#xff0c;因为这些节点与跟节点的距离为1&#xff0c;子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度&#xff0c;当深度到达指定的上限大小时&#xff0c;停止分裂。

  &#xff08;4&#xff09;所有特征已经使用完毕&#xff0c;不能继续进行分裂。

     被动式停止分裂的条件&#xff0c;当已经没有可分的属性时&#xff0c;直接将当前节点设置为叶子节点。

3.4 决策树的构建方法

      根据决策树的输出结果&#xff0c;决策树可以分为分类树和回归树&#xff0c;分类树输出的结果为具体的类别&#xff0c;而回归树输出的结果为一个确定的数值。

  决策树的构建算法主要有ID3、C4.5、CART三种&#xff0c;其中ID3和C4.5是分类树&#xff0c;CART是分类回归树&#xff0c;将在本系列的ID3C4.5CART中分别讲述。

  其中ID3是决策树最基本的构建算法&#xff0c;而C4.5和CART是在ID3的基础上进行优化的算法。

4. 决策树的优化

     一棵过于复杂的决策树很可能出现过拟合的情况&#xff0c;如果完全按照3中生成一个完整的决策树可能会出现预测不准确的情况&#xff0c;因此需要对决策树进行优化&#xff0c;优化的方法主要有两种&#xff0c;一是剪枝&#xff0c;二是组合树&#xff0c;将在本系列的剪枝组合树中分别讲述。

转自&#xff1a;https://www.cnblogs.com/yonghao/p/5061873.html


推荐阅读
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 在尝试更新Microsoft Edge浏览器时遇到“检查更新时出错:无法连接到Internet”的问题。本文将详细介绍可能的原因及解决方案,包括防火墙设置和证书缺失的处理方法。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 智能车间调度研究进展
    本文综述了基于强化学习的智能车间调度策略,探讨了车间调度问题在资源有限条件下的优化方法。通过数学规划、智能算法和强化学习等手段,解决了作业车间、流水车间和加工车间中的静态与动态调度挑战。重点讨论了不同场景下的求解方法及其应用前景。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
author-avatar
jzhs5340636
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有