决策树系列(一)——基础知识回顾与总结
决策树系列(一)——基础知识回顾与总结
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,小学},将信息输入上述决策树,可以得到下列的分析步骤和结论。
第一步:根据该客户的职业进行判断,选择“工人”分支;
第二步:根据客户的年龄进行选择,选择年龄”<=40”这一分支;
第三步:根据客户的学历进行选择,选择”小学”这一分支,得出该客户无贷款意向的结论。
3. 决策树的构建
那么问题就来了,如何构建如图2.1所示一棵决策树呢?决策树的构建是数据逐步分裂的过程,构建的步骤如下:
步骤1:将所有的数据看成是一个节点,进入步骤2;
步骤2:从所有的数据特征中挑选一个数据特征对节点进行分割,进入步骤3;
步骤3:生成若干孩子节点,对每一个孩子节点进行判断,如果满足停止分裂的条件,进入步骤4;否则,进入步骤2;
步骤4:设置该节点是子节点,其输出的结果为该节点数量占比最大的类别。
从上述步骤可以看出,决策生成过程中有两个重要的问题:
(1)数据如何分割
(2)如何选择分裂的属性
(3)什么时候停止分裂
3.1 数据分割
假如我们已经选择了一个分裂的属性,那怎样对数据进行分裂呢?
分裂属性的数据类型分为离散型和连续性两种情况,对于离散型的数据,按照属性值进行分裂,每个属性值对应一个分裂节点;对于连续性属性,一般性的做法是对数据按照该属性进行排序,再将数据分成若干区间,如[0,10]、[10,20]、[20,30]…,一个区间对应一个节点,若数据的属性值落入某一区间则该数据就属于其对应的节点。
例:
表3.1 分类信息表
职业 |
年龄 |
是否贷款 |
白领 |
30 |
否 |
工人 |
40 |
否 |
工人 |
20 |
否 |
学生 |
15 |
否 |
学生 |
18 |
是 |
白领 |
42 |
是 |
(1)属性1“职业”是离散型变量,有三个取值,分别为白领、工人和学生,根据三个取值对原始的数据进行分割,如下表所示:
表3.2 属性1数据分割表
取值 |
贷款 |
不贷款 |
白领 |
1 |
1 |
工人 |
0 |
2 |
学生 |
1 |
1 |
表3.2可以表示成如下的决策树结构:
(2)属性2是连续性变量,这里将数据分成三个区间,分别是[10,20]、[20,30]、[30,40],则每一个区间的分裂结果如下:
表3.3 属性2数据分割表
区间 |
贷款 |
不贷款 |
[0,20] |
1 |
2 |
(20,40] |
0 |
2 |
(40,—] |
1 |
0 |
表3.3可以表示成如下的决策树结构:
3.2 分裂属性的选择
我们知道了分裂属性是如何对数据进行分割的,那么我们怎样选择分裂的属性呢?
决策树采用贪婪思想进行分裂,即选择可以得到最优分裂结果的属性进行分裂。那么怎样才算是最优的分裂结果?最理想的情况当然是能找到一个属性刚好能够将不同类别分开,但是大多数情况下分裂很难一步到位,我们希望每一次分裂之后孩子节点的数据尽量”纯”,以下图为例:
从图3.1和图3.2可以明显看出,属性2分裂后的孩子节点比属性1分裂后的孩子节点更纯:属性1分裂后每个节点的两类的数量还是相同,跟根节点的分类结果相比完全没有提高;按照属性2分裂后每个节点各类的数量相差比较大,可以很大概率认为第一个孩子节点的输出结果为类1,第2个孩子节点的输出结果为2。
选择分裂属性是要找出能够使所有孩子节点数据最纯的属性,决策树使用信息增益或者信息增益率作为选择属性的依据。
(1)信息增益
用信息增益表示分裂前后跟的数据复杂度和分裂节点数据复杂度的变化值,计算公式表示为:
其中Gain表示节点的复杂度,Gain越高,说明复杂度越高。信息增益说白了就是分裂前的数据复杂度减去孩子节点的数据复杂度的和,信息增益越大,分裂后的复杂度减小得越多,分类的效果越明显。
节点的复杂度可以用以下两种不同的计算方式:
a)熵
熵描述了数据的混乱程度,熵越大,混乱程度越高,也就是纯度越低;反之,熵越小,混乱程度越低,纯度越高。 熵的计算公式如下所示:
其中Pi表示类i的数量占比。以二分类问题为例,如果两类的数量相同,此时分类节点的纯度最低,熵等于1;如果节点的数据属于同一类时,此时节点的纯度最高,熵 等于0。
b)基尼值
基尼值计算公式如下:
其中Pi表示类i的数量占比。其同样以上述熵的二分类例子为例,当两类数量相等时,基尼值等于0.5 ;当节点数据属于同一类时,基尼值等于0 。基尼值越大,数据越不纯。
例:
以熵作为节点复杂度的统计量,分别求出下面例子的信息增益,图3.1表示节点选择属性1进行分裂的结果,图3.2表示节点选择属性2进行分裂的结果,通过计算两个属性分裂后的信息增益,选择最优的分裂属性。
属性1:
属性2:
由于 ,所以属性1与属性2相比是更优的分裂属性,故选择属性1作为分裂的属性。
(2)信息增益率
使用信息增益作为选择分裂的条件有一个不可避免的缺点:倾向选择分支比较多的属性进行分裂。为了解决这个问题,引入了信息增益率这个概念。信息增益率是在信息增益的基础上除以分裂节点数据量的信息增益(听起来很拗口),其计算公式如下:
其中 表示信息增益,
表示分裂子节点数据量的信息增益,其计算公式为:
其中m表示子节点的数量,表示第i个子节点的数据量,N表示父节点数据量,说白了, 其实
是分裂节点的熵,如果节点的数据链越接近,
越大,如果子节点越大,
越大,而
就会越小,能够降低节点分裂时选择子节点多的分裂属性的倾向性。信息增益率越高,说明分裂的效果越好。
还是信息增益中提及的例子为例:
属性1的信息增益率:
属性2的信息增益率:
由于 ,故选择属性2作为分裂的属性。
3.3 停止分裂的条件
决策树不可能不限制地生长,总有停止分裂的时候,最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂,但这种情况下树过于复杂,而且预测的经度不高。一般情况下为了降低决策树复杂度和提高预测的经度,会适当提前终止节点的分裂。
以下是决策树节点停止分裂的一般性条件:
(1)最小节点数
当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。
(2)熵或者基尼值小于阀值。
由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。
(3)决策树的深度达到指定的条件
节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。
(4)所有特征已经使用完毕,不能继续进行分裂。
被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。
3.4 决策树的构建方法
根据决策树的输出结果,决策树可以分为分类树和回归树,分类树输出的结果为具体的类别,而回归树输出的结果为一个确定的数值。
决策树的构建算法主要有ID3、C4.5、CART三种,其中ID3和C4.5是分类树,CART是分类回归树,将在本系列的ID3、C4.5和CART中分别讲述。
其中ID3是决策树最基本的构建算法,而C4.5和CART是在ID3的基础上进行优化的算法。
4. 决策树的优化
一棵过于复杂的决策树很可能出现过拟合的情况,如果完全按照3中生成一个完整的决策树可能会出现预测不准确的情况,因此需要对决策树进行优化,优化的方法主要有两种,一是剪枝,二是组合树,将在本系列的剪枝和组合树中分别讲述。
转自:https://www.cnblogs.com/yonghao/p/5061873.html
决策树系列(一)——基础知识回顾与总结相关推荐
- 经典考题回顾系列——证券市场基础知识180题
经典考题回顾系列--证券市场基础知识180题 [中华证券学习网]http://www.1000zq.com/Detail.aspx?id=180022 内容介绍>> 证券从业资格考试经典考 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- php基础知识总结大全,php基础知识回顾 —— 常量
您现在的位置是:网站首页>>PHP>>php php基础知识回顾 -- 常量 发布时间:2019-01-23 17:23:08作者:wangjian浏览量:489点赞量:0 在 ...
- java知识点博客园_JAVA基础知识回顾
JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...
- C语言基础知识回顾 2-三种基本机构
C语言基础知识回顾 %超适用于计算机二级% 第二章 三种基本结构 本章回顾最基本的顺序.条件.循环语句的语法结构,对于非初学者来说,这一部分内容想必早就信手拈来. 因此,回顾的侧重点都是一些需要注意的 ...
- 【Java基础知识回顾篇】之打怪升级Day001
Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...
- 硬件安全系列 逻辑电路基础知识介绍(一)
前言 我带着新的系列又来了,之前的自动化代码审计工具还会在之后分享实际编写的过程思路以及代码. 新的系列是硬件安全,非常庞大的知识体系,我只是分享部分我所学习到的.会包括VLSI Testing ,H ...
- UICC 之 USIM 详解全系列——UICC基础知识介绍
本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. UICC 之 USIM 详解全系列--UICC(TS102 ...
- 【硬件设备】CPU系列之基础知识
目录 概述 指令集 一.复杂指令集(CISC) 二.精简指令集(RISC) 三.复杂指令集与精简指令集区别 CPU的架构 一.X86 CPU架构 二.ARM CPU架构 三.MIPS CPU架构 四 ...
- 大数据系列sql基础知识(史上最全,收藏起来)
大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...
最新文章
- c/s开发基础自学纪录为主
- 一、 函数调用栈,执行上下文及变量对象
- 科技管理的第一个作业
- 语音怎么进入滤波器matlab,基于Matlab的语音信号滤波器的设计与实现
- 056、macvlan网络结构分析(2019-03-25 周一)
- python center函数对齐方式_Python如何对齐字符串
- docker 启动tomcat_docker安装tomcat
- 2021中国大学生程序设计竞赛部分题解(CCPC)- 网络选拔赛(重赛)
- perl发送天气预报
- tp3.2 访问地址url大小写及控制器多个单词组成时url
- 微信小程序富文本去除首行缩进样式_小程序富文本处理wxParse
- jquery 移动端 ui 组件库 移动端前端UI库—Frozen UI、SUI Mobile、light7、WeUI、jqweui
- html自由变换图形,ps自由变换的快捷键是什么?
- 出没干日月鸿蒙之内翻译,李白《大鹏遇希有鸟赋》原文及翻译赏析
- Optimization Week 5: Duality example
- 引用第三方SDK产生依赖冲突
- 浏览器调取摄像头人脸抓拍实现
- CSDN如何更快速地涨粉
- matlab中buttord用法_matlab butter函数
- 百度和必应牵手成功?结局真是太让人气愤了
热门文章
- mysql实现不重复插入数据
- img 居中_如何解决img标签下面的小空隙(详细教程)
- java 生成条形码_Springboot生成二维码,怎么搞?
- 计算机及相关设备制造业2020,在现实生活中,接近完全垄断市场类型的行业包括()。A.计算机及相关设备制造业B.稀有金属...
- 事务对性能影响_mysql之事务
- delphi acropdf打印多个pdf_将多个PDF文件整合成一个文件
- Mybatis 数据库Mysql时间范围内数据查询非常慢的解决办法
- 论文笔记_S2D.40_2017_CVPR_半监督深度学习的单目深度图预测
- 求贤令|诚邀3D视觉领域技术大咖加入工坊!
- Deep manta算法解析