决策树

决策树是附加概率结果的一个树状的决策图,是直观的运用统计概率分析的图法。机器学习中决策树是一个预测模型,它表示对象属性和对象值之间的一种映射,树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象。树的叶子节点表示对象所属的预测结果。
决策树算法是一种基本的分类与回归算法,其实就是if-then的集合。
  主要包括三个部分:
  (1) 特征选择 (即从众多特征中选择出一个作为当前节点的分类标准)
  (2) 决策树的生成 (从上到下构建节点)
  (3) 决策树的剪枝 (为了预防和消除过拟合,需要对决策树剪枝)
  决策树由结点和有向边组成。结点有两种类型:内部结点和叶子结点。内部结点表示一个特征或者属性。叶子结点表示一个类。决策树学习的损失函数通常是正则化的极大似然函数。
下图就是一个简单的决策树:

关于以上决策树的分析:贷款用户主要具备三个属性:是否拥有房产,是否结婚,平均月收入。每一个内部节点都表示一个属性条件判断,叶子节点表示贷款用户是否具有偿还能力。例如:用户甲没有房产,没有结婚,月收入 5K。通过决策树的根节点判断,用户甲符合右边分支 (拥有房产为“否”);再判断是否结婚,用户甲符合左边分支 (是否结婚为否);然后判断月收入是否大于 4k,用户甲符合左边分支 (月收入大于 4K),该用户落在“可以偿还”的叶子节点上。所以预测用户甲具备偿还贷款能力。

决策树学习的关键是如何选择最优划分属性。
划分属性时,我们希望决策树的分支结点所包含的样本尽可能的属于同一类别,即结点的“纯度”越来越高。
1948年,香农提出了 “信息熵(entropy)”的概念一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少,变量的不确定性越大,熵也就越大。信息熵是度量样本集合纯度最常用的一种指标。信息熵越小,样本集合纯度越高。
(1)信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。ID3决策树算法以信息增益为准则来选择划分属性。
(2)信息增益准则对可取值数目较多的属性(比如编号,数目最多,每个编号仅对应一个样本)有所偏好,为减少这种偏好带来的不利影响,C4.5算法使用“增益率”来选择最优划分属性,但需要注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
(3)CART决策树使用“基尼系数”来选择属性数据集D的纯度可用基尼值Gini(D)来度量。Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,Gini(D)越小,数据集D的纯度越高。
树剪枝叶(避免overfitting)
剪枝是决策树学习算法对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确的分类训练样本,节点划分过程将不断重复,有时会造成决策树分支太多,这时就有可能训练样本学的“太好”了,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,可通过主动去掉一些分支来降低过拟合的风险。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个节点在划分前后进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶节点;后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能的优化,则将该子树替换为叶结点。

算法原理

主要的决策树算法包括ID3、C4.5和CART。
ID3把信息增益作为选择特征的标准。由于取值较多的特征(如学号)的信息增益比较大,这种算法会偏向于取值较多的特征。而且该算法只能用于离散型的数据,优点是不需要剪枝。C4.5和ID3比较类似,区别在于使用信息增益比替代信息增益作为选择特征的标准,因此比ID3更加科学,并且可以用于连续型的数据,但是需要剪枝。
CART(Classification And Regression Tree)采用的是Gini作为选择的标准。Gini越大,说明不纯度越大,这个特征就越不好。

ID3

ID3算法只能适应于离散属性,不能用于连续属性。
  特征选择的方式是信息增益。 不确定性减少的程度
  信息增益=经验熵-经验条件熵。
  即g(D/A)=H(D)-H(D/A)
  迭代终止条件:
  (1) 所有的特征都用了,没有特征可以继续来进行特征选择
  (2) 当前特征集中的最大的信息增益小于我们设定的阈值。
  ID3算法使用了信息增益。信息增益的缺点是:对取值数目比较多的属性有偏好。一个特征的信息增益越大,表明属性对样本熵减少的能力越强,不确定性变成确定性的能力越强。用信息增益训练出来的决策树深度很浅的树。

C4.5

与ID3不同之处就是:特征选择使用的是信息增益比,同时可以对连续属性进行处理。
  1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
  2) 在树构造过程中进行剪枝;
  3) 能够完成对连续属性的离散化处理;
  4) 能够对不完整数据进行处理。
  连续属性的一般处理方式:
  将连续属性的属性值进行排序,如[x1,x2,x3…xn],将连续属性离散化,最简单的方式就是取相邻两个值的终点作为属性划分点,即[(x1+x2)/2, (x2+x3)/2…]。每次划分的时候对划分点进行遍历,选取最佳的划分点。

CART

回归树:损失函数:最小均方误差。
  回归树基本流程:
  (1) 选择最优变量与最优切分点。使得均方误差最小
  (2) 确定每个区域的输出值
  (3) 继续对划分的两个子区域调用(1)(2),直到满足停止条件。
  (4) 将输入空间划分成M个区域,生成决策树。
  分类树:分类树使用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
  CART算法分类流程:
  输入:训练数据集,停止计算的条件
 (1) 计算现有特征对该数据集的基尼指数。
 (2) 选择基尼指数最下的特征及其对应的最好的切分点。
 (3) 递归调用(1)(2),直到满足停止条件
 (4) 生成CART决策树。
  算法停止计算的条件是:结点中样本个数小于预定阈值,或者样本集的基尼指数小于预定阈值,或者没有更多的特征。 如果此时该叶子结点的纯度还不是很高,只能使用多数表决法。
  CART剪枝算法基于代价复杂度思想:就是不断剪枝,构造出不同的子树序列,对不同的子树序列交叉验证,判断出好的子树序列。
决策树算法流程:
树以代表训练样本的单个结点开始(步骤1)。
如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤2 和3)。
否则,算法使用称为信息增益的基于熵的度量作为启发信息,选择能够最好地将样本分类的属性(步骤6)。该属性成为该 结点的“测试”或“判定”属性(步骤7)。在算法的该版本中,
所有的属性都是分类的,即离散值。连续属性必须离散化(根据阈值)。
对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤8-10)。
算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属性出现在一个结点上,就不必该结点的任何后代 上考虑它(步骤13)。
递归划分步骤仅当下列条件之一成立停止:
(a) 给定结点的所有样本属于同一类(步骤2 和3)。
(b) 没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,使用多数表决(步骤5)。这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。替换地,可以存放结点样本的类分布。
© 分枝
test_attribute = a i 没有样本(步骤11)。在这种情况下,以 samples 中的多数类创建一个树叶(步骤12)
总结:
决策树停止条件:
  (1)特征集合都用完了。
  (2)当前集合最大信息增益/信息增益比/基尼指数小于阈值。
  (3)当前节点中的样本数目已经小于限定的最小值。
决策树的优缺点:
相对于其他数据挖掘算法,决策树在以下几个方面拥有优势: 
  • 决策树易于理解和实现. 人们在通过解释后都有能力去理解决策树所表达的意义。
  • 对于决策树,数据的准备往往是简单或者是不必要的 . 其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。
  • 能够同时处理数据型和常规型属性。其他的技术往往要求数据属性的单一。
  • 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
  • 对缺失值不敏感
  • 可以处理不相关特征数据
  • 效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。
决策树的缺点
1)对连续性的字段比较难预测。
2)对有时间顺序的数据,需要很多预处理的工作。
3)当类别太多时,错误可能就会增加的比较快。
4)一般的算法分类的时候,只是根据一个字段来分类。
5)在处理特征关联性比较强的数据时表现得不是太好。

附:

信息增益算法
介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,表示“一个系统的混乱程度”。系统的不确定性越高,熵就越大。假设集合中的变量X={x1,x2…xn},它对应在集合的概率分别是P={p1,p2…pn}。那么这个集合的熵表示为:

举一个的例子:对游戏活跃用户进行分层,分为高活跃、中活跃、低活跃,游戏A按照这个方式划分,用户比例分别为20%,30%,50%。游戏B按照这种方式划分,用户比例分别为5%,5%,90%。那么游戏A对于这种划分方式的熵为:

同理游戏B对于这种划分方式的熵为:

游戏A的熵比游戏B的熵大,所以游戏A的不确定性比游戏B高。用简单通俗的话来讲,游戏B要不就在上升期,要不就在衰退期,它的未来已经很确定了,所以熵低。而游戏A的未来有更多的不确定性,它的熵更高。
介绍完熵的概念,我们继续看信息增益。为了便于理解,我们还是以一个实际的例子来说明信息增益的概念。假设有下表样本
!

第一列为QQ,第二列为性别,第三列为活跃度,最后一列用户是否流失。我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大?我们通过计算信息熵可以解决这个问题。
按照分组统计,我们可以得到如下信息:

其中Positive为正样本(已流失),Negative为负样本(未流失),下面的数值为不同划分下对应的人数。那么可得到三个熵:
整体熵:

性别熵:

性别信息增益:

同理计算活跃度熵:

活跃度信息增益:

活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。在做特征选择或者数据分析的时候,我们应该重点考察活跃度这个指标。
信息增益率
信息增益率=信息增益/属性熵
基尼系数算法
例子
数据集的属性有3个,分别是有房情况,婚姻状况和年收入,其中有房情况和婚姻状况是离散的取值,而年收入是连续的取值。拖欠贷款者属于分类的结果。

对于有房情况这个属性,它是离散型数据,那么按照它划分后的Gini系数计算如下

对于婚姻状况属性,它也是离散型数据,它的取值有3种,按照每种属性值分裂后Gini系数计算如下

年收入属性,它的取值是连续的,那么连续的取值采用分裂点进行分裂。如下

根据这样的分裂规则CART算法就能完成建树过程 。

决策树ID3、C4.5和CART算法例子详解相关推荐

  1. 决策树ID3,C4.5,CART算法及实现

    文章目录 一.决策树 1.画法 2.决策树的剪枝 3.挑西瓜决策树 3.1利用信息增益选择最优划分属性 3.2python代码实现 二.sk-learn库对西瓜数据集,分别进行ID3.C4.5和CAR ...

  2. Python算法教程第一章知识点:利用插入元素的例子详解list之本质

    声明:由于中译本翻译过于冗余,所以将有用处的知识点罗列出来. 微信公众号:geekkr 本文目录:一.利用插入元素的例子详解list之本质 </br> 一.利用插入元素的例子详解list之 ...

  3. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  4. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  5. JavaScript数组结构与算法——数组详解(中)

    迭代器方法 在上篇中,我们探讨了很多数组方法,接下来总结一下最后一组方法--迭代器方法.这些方法对数组的每个元素应用一个函数,可以返回一个值.一组值.或者一个新数组. 1.不生成新数组的迭代器方法 以 ...

  6. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  7. 共识算法-Mencius详解

    共识算法-Mencius详解 一.背景 二.算法实现 三.算法时延 一.背景 paxos存在(1)负载不均衡,如:leader节点的计算(cpu.内存等计算资源)和网络(acceptor间除了转发请求 ...

  8. DDA画线算法+代码详解-直线扫描算法之一

    #DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...

  9. prim算法(普里姆算法)详解

    prim算法(普里姆算法)详解 了解了什么是最小生成树后,本节为您讲解如何用普里姆(prim)算法查找连通网(带权的连通图)中的最小生成树. 普里姆算法查找最小生成树的过程,采用了贪心算法的思想.对于 ...

最新文章

  1. PyTorch 常用代码段示例整理
  2. C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式...
  3. android studil打断点_Android Studio你不知道的调试技巧
  4. 03-kubeadm初始化Kubernetes集群
  5. 程序员写了段代码,自称完美! 网友: 我现在还在改你的Bug
  6. 一个关于HINT中指定索引查询的问题
  7. 计算机系统计算机,计算机系统与计算机化系统的区别
  8. Python实现人工神经网络逼近股票价格
  9. 【BZOJ】1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
  10. kali linux 清华源_Kali Linux 更新源
  11. 重新连接共享打印机报错0x00000002
  12. 没有你 万般精彩皆枉然
  13. 编程语言常见符号合集分享
  14. Unity画面像素化shader
  15. Java生成动态GIF图片
  16. 流式保护器在文物建筑物内的电气防火应用
  17. 计算机启动异常卡顿,解决开机卡顿的问题,电脑卡在开机界面的解决办法
  18. 支付宝支付-扫码支付详解
  19. 当TFT LCD液晶屏出现残影时该如何解决?
  20. CppUnit Cookbook中文版

热门文章

  1. java 实现 AHP
  2. 缘与情历来缠缠绕绕,缘分与爱情相依并存
  3. python怎么通过手机号定位_python 通过手机号识别出对应的微信性别(实例代码)
  4. 安卓手机安全支付之界面设计
  5. MessageBox 输入框限制字数
  6. php 手机号 正则表达式
  7. EasyAR识别框程序
  8. linux怎么看一个端口是否可用,LINUX中查看某个端口是否被占用的方法
  9. Qt Quick 5.2 开发笔记3-------qml界面之自定义TitleBar
  10. java joinpoint教程_aop 中joinpoint的使用方法