数据挖掘十大算法(二)------决策树算法

 

一、决策树模型算法

决策树模型算法是一类算法,不单单指的一个算法,最基本也是最主要的是Hunt算法、ID3算法、C4.5算法和CART算法。

决策树算法本质上还是解决分类问题。

分类问题总述:给定一个数据集,我们需要训练出(或建立出)一个模型 f 。当出现一组新的特征向量时,预测(或判断)拥有这样一组新特征向量的对象是属于哪个类别。

决策树分类:对实例进行分类的树形结构。决策树包含节点(node)和有向边组成。节点的类型有两种:内部节点、叶子节点。

内部节点为一个特征或属性的测试条件,叶子节点表示一个分类。

决策树算法包括训练、测试两个阶段

①、训练阶段:用一定的标准和规则将训练集分割为几个子集,然后再以相同的规则去分割每个子集递归处理,直到每个子集只含有属于同一类的样本时停止。训练过程中,每个分割节点需要保存好分类的属性号

②、测试阶段:将测试样本从根节点开始进行判别,看该样本属于哪个子节点,同样递归地执行下去,直到该样本被分到叶节点中为止,而此时该样本就属于当前叶节点的类别。

决策数是一种监督学习算法。更细分的有二叉决策树和多叉数,更细分的操作还有构造和剪枝。

二、Hunt算法

Hunt算法采用局部最优策略构建决策树,它是 ID3、C4.5和CART算法的基础。

Hunt算法思想:以递归的方式建立决策树。  Dt 是与 t 节点相关的训练集,y1,y2,y3 为类别,递归如下:

(1)如果 Dt 中所有的数据都属于一个类别,则 t 为叶子节点,归属于 yt类别。

(2)如果 Dt 中的数据属于多个类别,则选择一个属性测试条件(选择一个属性来划分),将 Dt 划分成较小的子集。根据测试条件划分的每个输出,创建子节点,将数据分类。若还不满足(1),则继续递归划分。

总结:通俗点就是如果数据集有其他分类,选择一个属性划分,直到将数据集划分成每一个类只包含属于自己类的数据。

三、ID3算法

ID3算法的特点在于以信息增益为准则,选择信息增益最大的属性作为决策属性来划分数据集

  • ID3算法要求特征必须为离散化
  • 信息增益可以用信息熵,而不是GINI系数(基尼系数)来计算
  • 选择信息增益最大的特征,作为树的根节点。

信息增益与信息熵

信息熵:指了解一件事情所需要付出的信息量是多少,该事件不确定性越大,则想要完全了解它所需要的信息量越大信息熵也越大。即表示随机变量的不确定性。不确定性越大,信息熵越大。

信息熵公式:

数据挖掘十大算法(二)------决策树算法_第1张图片

 总结:信息熵就是一件事每个类别信息I(Xi)乘以它的发生的概率p(Xi)

信息增益:

第一种解释:信息增益是针对一个一个特征而言的,就是看一个特征T,系统有它和没它的信息量是多少,二者的差值就是特征 T 给系统带来的信息量。就是所谓的信息增益。

第二种解释:用划分前(父节点)的不纯度和划分后(子女节点)的不纯度的来衡量属性分裂的测试结果,该指标就是信息增益。也就是熵的差。若当前特征信息增益越大,则该特征的选择性越好

数据挖掘十大算法(二)------决策树算法_第2张图片

 

ID3算法的核心思想:在划分每一个非叶子节点之前,先计算每一个属性所带来的信息增益,选择信息增益最大的属性来划分,因为信息增益越大,区分样本能力越强,越具有代表性,这是一种自顶向下的贪心策略

ID3算法的缺点:

①由于 ID3 算法采用的信息增益来选择特征属性,而信息增益倾向于选择取值较多的属性,这种情况下这类属性不会提供太多有价值的信息,反而会有影响特征属性的划分。

② ID3 算法只能对离散属性的数据集构造决策树,较为单一。

ID3 算法的优点:方法简单、计算量小、理论清晰、学习能力较强、比较适用于处理规模较大的学习问题。

四、C4.5 算法

由于信息增益的缺点,C4.5 改进了 ID3算法:

①采用信息增益率来选择属性。②在决策树构造的同时进行剪枝操作。③避免了树的过度拟合情况。④可以对不完整属性和连续型数据进行处理。⑤针对数据构成形式,提升了算法的普适性。

(1)、信息增益率:(百度,后期补充)

数据挖掘十大算法(二)------决策树算法_第3张图片

(2)、处理连续型属性和离散型属性

实质上,C4.5 和ID3 都是处理离散型属性的算法。当属性为离散型时,C4.5 可以直接使用,不用对数据进行离散化。当属性为连续属性时,需要对数据进行离散化处理

(3)、核心思想:将属性 A 的所有属性值 N 按照升序排序,然后将属性 A 的 N 属性值分成两个部分(共有 N-1 种分法),计算每一种二分结果的信息增益。详细流程如下:

①、将属性A 的 N 个属性值排序(x1,x2....xn)

②、将 N 个属性值二分(这个二分并不是数据结构中的二分算法,而是简单的划分为两部分),共有 N-1 中划分情况。例如在第 i 种划分中,其二分阈值 θi = [xi + x(i+1)] / 2 分为(x1,x2....xi)和(x i+1.....xn)

③、分别计算 N-1 中二分结果的信息增益,选择信息增益最大的二分结果最为属性 A 的划分结果,并记录二分阈值。

(4)、剪枝处理——PEP(Pessimistic Error Pruning)剪枝法

由于决策树的建立完全依赖于训练样本,因此决策树对训练样本可以完美的拟合,会导致过拟合的情况出现。采用剪枝处理避免过拟合。剪枝方法分为预剪枝和后剪枝两大类。

①、预剪枝:在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生,实用性不强,因为很难精确的判断何时终止树的生长。

②、后剪枝:在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。后剪枝方法又分为两种,一类是把训练数据集分成树的生长集和剪枝集;另一类算法则是使用同一数据集进行决策树生长和剪枝。常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。 

C4.5 采用 PEP 剪枝法,是一种自上而下的剪枝法。根据剪枝前后的错误率来判定是否进行子树的修剪,因此不需要单独的剪枝数据集。(具体PEP剪枝法见百度)

(5)、缺失属性值的处理 

训练样本集中有可能会出现一些样本缺失了一些属性值,待分类样本中也会出现这样的情况。缺失属性的样本集一般会导致三个问题:

① 、C4.5 采用计算属性的信息增益率来选择分裂属性,若样本中缺少一部分属性,则该如何计算信息增益率?

解决方法:若某些样本的属性值未知,那么计算某属性的信息増益率时忽略掉缺失了此属性的样本;或者通过此属性的样本中出现频率最高的属性值,賦值给缺失了此属性的样本。 

②、当已经确定了某属性作为分裂属性时,样本集根据该属性的值来进行分支时,但对于那些该属性的值为未知的样本,应该将它分支到哪一棵子树上?

解决方法:假设属性A已被选择作为决策树中的一个分支节点,在对样本集进行分支的时候,对于那些属性A的值未知的样本,可以不处理那些属性A未知的样本,忽略掉它们;根据属性A的其他样本的取值,对未知样本进行赋值;为缺失属性A的样本单独创建一个分支,但这导致模型复杂度增加,不建议这样处理。

③、在决策树已经构建完成后,如果待分类样本中有些属性值缺失,则该样本的分类过程如何进行?

解决方法:若待分类样本的属性A的值未知,可以这样处理:待分类样本在到达属性A的分支结点时结束分类过程,此样本所属类别为属性A的子树中概率最大的类别;或者把待分类样本的属性A赋予一个最常见的值,然后继续分类过程。

C4.5 算法的优点:

①、通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足。

②、能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理。

③、构造决策树之后进行剪枝操作。

④、能够处理具有缺失属性值的训练数据。

C4.5 算法的缺点:

①、在构造数的过程中,对数据集进行多次的顺序扫描和排序,导致算法效率低。尤其在处理连续属性值的训练样本时。

②、在选择分裂属性时没有考虑到条件属性间的相关性,只计算了数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。

参考学习博客:https://blog.csdn.net/zhihua_oba/article/details/70632622

五、CART (Classification And Regresssion Tree)算法

顾名思义,CART是分类回归树算法,即主要有分类树和回归树两种。其次,CART是一个二叉树问题,即总是有两种选择,而不像 ID3、C4.5 算法有多种选择。分类树和回归树,二者所用的准则略有差别:回归树是拟合问题,更关心拟合效果的好坏,此处用的是均方误差准则;分类树是分类问题,更像是离散变量的概率估计,用与熵类似的Gini系数进行度量。

上述强调 CART算法 只能生成二叉决策树,所以在每一步的决策时只能 ‘是’ 或者 ‘否’ 两种选择。即使一个特征属性有多个取值,也是把数据分为两个部分。

算法的两个步骤:①、将样本递归划分构建决策树。②、用验证数据进行剪枝。

CART算法原理:设 x1、x2、x3.....xn 为样本的 n 个属性,y代表所属类别。CART通过递归的方式将 n 维空间划分为不重叠的矩阵:

①、选择一个连续属性 ni ,然后选择该属性里的一个具体的值 vi ,vi 将 ni 分为了两部分,一部分的值大于 vi ,一部分的值小于 vi ,而对于非连续属性来说,只有等于 vi 和不等于 vi 两种情况(下述例子中有具体表现)。

②、递归处理,将上面得到的两部分按照步骤①重新选取一个属性继续划分,直到将所有属性 n 都划分完全。

举个具体的例子来说明:https://blog.csdn.net/baimafujinji/article/details/53269040#commentBox

数据挖掘十大算法(二)------决策树算法_第4张图片

 首先在上述数据集中,属性有是否有房,婚姻状况,年收入三个,拖欠贷款者属于分类的结果。计算 {是否有房,婚姻状况,年收入} 三个属性的Gini系数增益(但三个属性的Gini系数是基于拖欠贷款者结果的Gini系数求出来的),取Gini系数增益值最大的属性作为决策树的根节点属性。

拖欠贷款者的Gini系数:

 现在计算特征属性的Gini系数,是否有房的Gini系数:

 婚姻状况的基尼系数(有三个,我们取最大的一个,即 {married} | {single,divorced} 划分的情况)

 年收入的Gini系数(年收入为连续特征属性,采用二分阈值,并不是求这一次,而是省略了其他计算)

相当于年收入的Gini系数要计算 9次 每一个中点划分一次,求一次Gini系数。我们发现年收入的Gini系数最大也是 0.12 ,和婚姻状况 特征属性一样,则选择首先出现的属性作为第一次划分。

计算Gini系数有两个问题需要注意:①是否有房,婚姻状况是离散属性,年收入是连续属性。求Gini系数的方式有点不同,连续属性先按升序排序,再采用二分阈值(取中间值)的方式(同C4.5算法,也有二分阈值)。②观察婚姻状况属性,它有三个选择。但还是按照离散属性的划分有三种情况:

  • {married} | {single,divorced}
  • {single} | {married,divorced}
  • {divorced} | {single,married}

分别计算三种情况的Gini系数,选择Gini系数增益最大的作为划分结果,也就是{married} | {single,divorced}

Gini系数计算省略,所以婚姻状况Gini系数最大,作为根节点,其次下来是 是否有房 ,最后为年收入。

数据挖掘十大算法(二)------决策树算法_第5张图片

 第一次计算划分结果如上,接下来,采用同样的方法,计算剩下属性的Gini系数(此时是否拖欠贷款的各有3个records),根节点的Gnin系数

 在右子树中single、divorced中,有贷款的3个,无贷款的3个。所以是否拖欠贷款的Gini系数要重新计算,如上。

继续依次计算剩余属性的Gini系数

 年收入的Gini系数:

数据挖掘十大算法(二)------决策树算法_第6张图片

 是否有房的Gini系数为0.25,年收入最大也是0.25,取先出现的属性作为划分节点。第二次构建决策树

数据挖掘十大算法(二)------决策树算法_第7张图片

 再第三次计算,single、divorced 并且无房的还有4个数值,70K,85K,90K,95K,再做Gini系数计算最后的决策树为

数据挖掘十大算法(二)------决策树算法_第8张图片

 决策树很容易发生过拟合,也就是由于对train数据集适应得太好,反而在test数据集上表现得不好。这个时候我们要么是通过阈值控制终止条件避免树形结构分支过细,要么就是通过对已经形成的决策树进行剪枝来避免过拟合。另外一个克服过拟合的手段就是基于Bootstrap的思想建立随机森林(Random Forest)。

参考学习博客:https://blog.csdn.net/baimafujinji/article/details/53269040#commentBox 

决策树的三大算法基本总结完成,但还是缺少了很多需要补充的知识,后期会不断补充,便于自己学习、记忆。

 

你可能感兴趣的:(算法分析)