决策树(ID3,C4.5,CART)原理以及实现

决策树

决策树是一种基本的分类和回归方法.决策树顾名思义,模型可以表示为树型结构,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布.

[图片上传失败...(image-2e6565-1543139272117)]

决策树的中间节点可以看做是对一种特征的判断,也是符合上一次判断特征某种取值的数据集,根节点代表所有数据集;叶子节点看做是判断所属的类别.

决策树学习通常包括3个步骤: 特征选择. 决策树生成和决策树剪枝.

目前常用的决策树算法有ID3, C4.5 和CART.

特征选择

在数据集中的所有特征列表中,选择分类效果最好的特征,或者说让分类效果尽可能的"纯",通俗的说就是让划分的每个结果的尽可能属于同一个类别,都是自己人. 那么, 分类效果最好,或者说纯度,怎么定义? 用什么衡量特征的分类效果呢? 不同的决策树算法采用不同的衡量指标.比如说,ID3采用信息增益,C4.5采用信息增益比率,CART分类回归树当用于分类时,采用Gini指数,用于回归问题时采用均方差差[计算划分之前的均方差,划分之后的均方差,再做差运算]. 无论是哪种指标,本质上,都是比较用特征划分前后两种状态之间的差异变化,变化越明显越好,而各种指标是对这种差异变化的量化. 但是不同的指标会有不同的倾向性,这种倾向性从指标计算公式上可以发现,而倾向性又会引出不同的问题,进而产生不同的优化方法.

另一方面,最佳的特征的选择,总是需要对所有特征进行一次遍历,分别计算每种特征的划分效果,比较求最优特征的最佳特征划分值.

信息增益

计算信息增益之前,需要先引出信息熵的概念.熵是信息论中的一个非常重要的概念,信息熵的计算,对于一个数据集D,其中N中类别的第k类样本所占比例为pk,则数据集D的信息熵:

\(Ent(D)= -\sum_{k=1}^{N}p_k log_2 p_k\)

从信息熵的计算公式可以知道,Ent(D)的取值范围在[0, \(log_2n\)], 最小,或者说节点最纯时[都是同一个类别],为0;最大,最混乱时[每种类别比例都相等],为\(log_2n\).

知道了信息熵的计算公式,那么划分前,计算数据集的信息熵, 依据特征f的n种取值划分后的n个节点,分别计算信息熵,然后依据各个节点数据集的比率,加权平均,计算划分后的总的信息熵,前后两次做差,得到这次划分的信息增益,用来衡量特征f的划分效果如何.

信息增益:
信息增益表示得知特征f的信息而使得类Y的信息的不确定性较少的程度.

\(Gain(D,f) = Ent(D) - \sum_{i=1}^{n} \frac{|D_i|}{|D|}Ent(D_i)\)

信息增益越大,特征划分效果越好. 信息增益指标,趋向于选择取值数目多的特征.[个人观点:特征取值越多,划分到每个子节点的数据越少,一定程度上,纯度越高,混乱程度越低,熵取值越小,进而,信息增益越大.比如说,ID特征,因为ID是唯一的,所有划分到每个ID取值节点上也就一个数据点,纯度100%,熵为0.]

信息增益比率

\(GainRatio(D,f)=\frac{Gain(D,f)}{IV(f)}\)

其中,
\(IV(f) = -\sum_{v=1}^{V}\frac{|D_v|}{|D|}log_2\frac{|D_v|}{|D|}\)

\(D_v\)表示特征f取值为v的数据子集.

因为信息增益会倾向于选择特征取值多的特征,所以,我们对多取值特征进行惩罚,除以特征f的固有值[或者说特征f的信息熵,f的信息熵越大,相应f的取值情况越多,惩罚力度越大].

Gini指数

假设数据集D有K个类,样本点属于第k类的概率为pk,则概率分布的基尼指数定义为:

\(Gini(D)=\sum_{k=1}^Kp_k(1-p_k) =1 - \sum_{k=1}^Kp_k^2\)

知道了gini指数的计算公式,计算划分前的gini指数,划分后,计算各个节点的gini指数值,然后根据划分后子节点的数据比例进行加权求和,得到划分后的总gini指数,最后对两次结果做差,得到特征f的划分效果, 差值越大,分类效果越好.

均方差MSE[和,不平均]

和分类时相似,计算划分前节点的均方差,划分后计算子节点的均方差,依据数据比例加权平均,再计算两次结果差值,差值越大越好.

MAE也可以用作特征选择指标,和MSE类似.

决策树生成

决策树本质上也是一棵树,所以符合数据结构中树的一般性构造过程,也就是递归.

既然是递归构建过程,首先要明白的是递归终止条件,否则就会陷入死循环.那么决策树的终止条件是什么呢?决策树中符合终止条件时,停止继续划分,生成叶节点.

如果是分类树:

  1. 如果节点数据全是同一类别,停止递归[没有必要了,都是自己人];
  2. 如果特征列表为空,停止递归[在分类问题中,一般情况下,每种划分特征只会用一次,用完就扔了---负心汉];
  3. 如果所有样本在所有特征上取值都相同,停止递归[特征没用,不具有区分度---所有特征上取值都相同,千篇一律]

如果是回归树,回归树通常会设定自定义的参数,比如均方差变化最小值,每个节点容忍的最小样本数,相应的条件:

  1. 均方差变化太小[小于预定义的阈值];
  2. 划分后节点的样本量太少[小于预定义的阈值,比如只有2,3个,小猫两三只没有必要继续划分了];
[终止条件]检测数据集中的每个子项是否属于同一分类,or 特征集为空:

    If so:  return  类标签

    Else:
        寻找划分数据集的最好特征(--基于信息增益)
        划分数据集
        创建分支结点
            for    每个划分的子集
                调用自己,并增加返回结果到分支结点中

        return    分支结点

上面伪代码中存在一个问题, 类标签怎么确定?
如果叶子节点都属于同一类别,那么给定所属类别即可;如果叶子节点数据属于不同的类别,大家进行投票决定,服从多数人的利益[少数服从多数].

树剪枝

因为在决策树的构建过程中,可能会存在过拟合现象,或者说决策树深度太深,太过于复杂;因此,我们可以对决策树进行剪枝处理.剪枝又分为预剪枝和后剪枝.

预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,如果当前的划分不能带来决策树泛化性能的提升[泛化性能可以用错误率,或者说均方差衡量],则停止划分将当前节点标记为叶节点.

后剪枝过程是一个不断尝试的过程:找到叶子节点,尝试合并[将叶子节点的双亲变成叶子节点],比较合并前后的变化效果.变化效果需要定量分析,这个数据量指标分类问题可以使用错误率,回归树可以使用均方差, 而指标的计算需要数据,因此我们需要一定的测试数据,然后使用测试数据在已经生成的决策树上进行不断测试,假如合并后比合并前效果好,分类问题上就是错误率降低了,回归问题上均方差减少了,我们就进行合并处理[或者说是剪枝处理].

其他问题

决策树使用范围,或者说对数据集的要求: 标称数据或数值型数据.本质上,决策树只适用于标称型数据[也就是离散数据],但如果是连续数据[在特征取值上连续],我们需要进行离散处理.不同类型的决策树处理问题不同,有的决策树需要对数据进行预先离散化处理;但有的决策树本身可以处理连续数据.

决策树在生成过程中会遇到各种各样的问题.有数据集的问题,也有决策树本身的问题,而决策树本身也有自己的适用范围,不可能适用于所有问题[一招鲜吃遍天impossible].比如说:

  • 连续数据: 离散化处理;
  • 空缺数据: 如果在某个特征上数据存在空缺值,怎么处理? 我们可以先将取特征上非空的数据子集,当做非空数据处理,然后将特征取值为空记录按照子节点数据的比率划分到所有子节点上.
  • etc.

具体问题具体分析,依据不同的任务,数据集的不同特点选择适合的算法模型.

代码实现

repository 欢迎fork,star.

原文地址:https://www.cnblogs.com/ysugyl/p/10016461.html

时间: 2024-08-25 01:39:23

决策树(ID3,C4.5,CART)原理以及实现的相关文章

《机器学习实战》基于信息论的三种决策树算法(ID3,C4.5,CART)

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包含对其中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的所有算法源代码和算法所用到的源文件,有需要的留言 如需转载请注明出处,谢谢 ======================================

机器学习总结(八)决策树ID3,C4.5算法,CART算法

本文主要总结决策树中的ID3,C4.5和CART算法,各种算法的特点,并对比了各种算法的不同点. 决策树:是一种基本的分类和回归方法.在分类问题中,是基于特征对实例进行分类.既可以认为是if-then规则的集合,也可以认为是定义在特征空间和类空间上的条件概率分布. 决策树模型:决策树由结点和有向边组成.结点一般有两种类型,一种是内部结点,一种是叶节点.内部结点一般表示一个特征,而叶节点表示一个类.当用决策树进行分类时,先从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到子结点.而

决策树---ID3算法(介绍及Python实现)

决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no sunny 80 90 TRUE no overcast 83 86 FALSE yes rainy 70 96 FALSE yes rainy 68 80 FALSE yes rainy 65 70 TRUE no overcast 64 65 TRUE yes sunny 72 95 FALSE

javascript实现朴素贝叶斯分类与决策树ID3分类

今年毕业时的毕设是有关大数据及机器学习的题目.因为那个时间已经步入前端的行业自然选择使用JavaScript来实现其中具体的算法.虽然JavaScript不是做大数据处理的最佳语言,相比还没有优势,但是这提升了自己对与js的理解以及弥补了一点点关于数据结构的弱点.对机器学习感兴趣的朋友还是去用 python,最终还是在学校的死板论文格式要求之外,记录一下实现的过程和我自己对于算法的理解.源码在github:https://github.com/abzerolee/ID3_Bayes_JS开始学习

[梁山好汉说IT] 熵的概念 &amp; 决策树ID3如何选择子树

记录对概念的理解,用梁山好汉做例子来检验是否理解正确. 1. 事物的信息和信息熵 a. 事物的信息(信息量越大确定性越大): 信息会改变你对事物的未知度和好奇心.信息量越大,你对事物越了解,进而你对事物的好奇心也会降低,因为你对事物的确定性越高.如果你确定一件事件的发生概率是100%,你认为这件事情的信息量为0——可不是吗,既然都确定了,就没有信息量了:相反,如果你不确定这件事,你需要通过各种方式去了解,就说明这件事是有意义的,是有信息量的. b. 信息熵:为了抽象上述模型,聪明的香农总结出了信

决策树ID3算法[分类算法]

ID3分类算法的编码实现 1 <?php 2 /* 3 *决策树ID3算法(分类算法的实现) 4 */ 5 6 /* 7 *把.txt中的内容读到数组中保存 8 *$filename:文件名称 9 */ 10 11 //-------------------------------------------------------------------- 12 function gerFileContent($filename) 13 { 14 $array = array(NULL); 15

决策树(主要针对CART)的生成与剪枝

这次主要想写两篇,一篇把决策树的相关思想和方法解释清楚,另外一个说一下ensemble形式的决策树,random forest,依据主要是breiman的论文. 这篇讲决策树(主要以cart为例,因为random forest的大多实现也是根据cart) 1.cart的生成. cart的全称是classification and regression tree,意为分类回归树.也就是说这类决策树既可以解决分类问题,也能解决回归问题.因此针对分类树和回归树,cart有两种生成方式.这里要注意,树是

数据挖掘之决策树ID3算法(C#实现)

决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般来说陆生动物是没有鳃的(记得应该是这样的,如有错误欢迎指正).所以玩这种游戏,提问的顺序很重要,争取每次都能够获得尽可能多的信息量. AllElectronics顾客数据库标记类的训练元组 RID age income student credit_rating Class: buys_comput

决策树——ID3

参考网址:https://www.cnblogs.com/further-further-further/p/9429257.html ID3算法 最优决策树生成 -- coding: utf-8 -- """ Created on Thu Aug 2 17:09:34 2018 决策树ID3的实现 @author: weixw """ from math import log import operator 原始数据 def createDat