机器学习(二)决策树

决策树

定义

分类决策树模型是一种描述对实例进行分类的树形结构。决策树由节点(node)和有向边(directed edge)组成。节点有两种类型:内部节点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归的对实例进行测试并分类,直至达到叶节点。最后将实例分到叶结点的类中。(下面给出一个简单的例子)

 

接下来大家应该都会有疑问,该按照什么次序来选择变量呢?

要解决这个问题我们要学决策树有关的算法,主要有ID3、C4.5、CART算法,下面我们通俗易懂的过一遍

ID3

要学习ID3算法,首先要了解《信息论》里面的信息增益概念,学习信息增益之前先简单了解熵是什么

熵这个概念最早起源于物理学,在物理学中是用来度量一个热力学系统的无序程度,而在信息学里面,熵是对不确定性的度量。在1948年,香农引入了信息熵(information entropy),将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。所以信息熵可以被认为是系统有序化程度的一个度量。

相关公式

所以上面的该按照什么次序来选择变量呢?ID3算法根据信息增益准则的特征选择方法是:对训练数据集D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

ID3算法的核心是在决策树各个节点上应用 信息增益 准则选择特征,递归的构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归的调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。ID3相当于用极大似然法进行概率模型的选择。

ID3算法的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有4种取值,那么数据将被切分成4份。一旦按照某特征切分后,该特征在之后的算法执行过程中将不会再起作用;另一种方法是二元切分法,即每次把数据集切分成两份。如果数据的某特征值等于切分所要求的值,那么这些数据将进入左子树,反之则进入右子树。

除了切分过于迅速外,ID3算法还存在另一个问题,它不能直接出来连续型特征。只有事先将连续型特征转为离散型,才能在ID3中使用。 但这种转换过程会破坏连续型变量的内在性质。而使用 二元切分法 则易于对树构建过程中进行调整以处理连续型特征。具体的处理方法是: 如果特征值大于给定值就走左子树,否则走右子树。另外二元切分法也节省了树的构建时间。 同时,ID3算法对于缺失值的情况没有考虑。

简单例子

到这里,大部分的小伙伴还是有点懵,先别慌,看下面一个简单的利用ID3算法产生决策树例子就懂了

1.计算根节点的信息熵

本例中正例(好瓜)占 8/17,反例占 9/17 ,根结点的信息熵为:

2.计算各个特征的信息增益,选取最大的

计算当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益

色泽有3个可能的取值:{青绿,乌黑,浅白}

D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6

D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6

D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5

计算出用“色泽”划分之后所获得的3个分支结点的信息熵为:

由此可得“色泽”的信息增益为:

类似的,我们可以计算出其他属性的信息增益,选取信息增益最大的进行划分,这里算的纹理的信息增益最大,所以第一次划分选着纹理,在递归使用算法计算子节点的分裂属性,最终可以得到整个决策树

ID3算法的缺点:

(1)不能对连续数据进行处理,只能通过连续数据离散化进行处理;

(2)采用信息增益进行数据分裂容易偏向取值较多的特征,准确性不如信息增益率;

(3)缺失值不好处理。

(4)没有采用剪枝,决策树的结构可能过于复杂,出现过拟合。

小疑问

可能有一些小伙伴会有疑问,ID3对于连续情景,最佳分离点应该在哪里?

C4.5

首先我们在了解了ID3算法前提上就很快了解C4.5算法了,C4.5是ID3算法的一种改进,我们上面知道,ID3在分裂过程中会更倾向于选择因子数较多的变量,这其实会使得模型往过拟合方向走,为了改进不足,C4.5采用信息增益率的方法,它是信息增益和特征熵的比值,特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益偏向取值较多的特征的问题。简单来说就是加了一个分裂惩罚,分裂多的分母就会大。

相关公式

其实算的步骤和分裂步骤和ID3差不多,只不过ID3分裂时候选信息增益最大分裂而C4.5选择信息增益率最大来分裂,下面我们看一下信息增益率的简单计算例子

CART

我们要学习CART算法首先要了解GINI指数,我们知道ID3是根据信息增益来分裂的,C4.5是根据信息增益率来分裂,而我们这里讨论的CART是根据基尼指数来进行分裂的

GINI指数

CART的分支标准建立在GINI指数这个概念上,GINI指数主要是度量数据划分的不纯度,是介于0~1之间的数。GINI值越小,表明样本集合的纯净度越高;GINI值越大表明样本集合的类别越杂乱。直观来说,GINI指数反映了从数据集中随机抽出两个样本,其类别不一致的概率。衡量出数据集某个特征所有取值的Gini指数后,就可以得到该特征的Gini Split info,也就是GiniGain。不考虑剪枝情况下,分类决策树递归创建过程中就是每次选择GiniGain最小的节点做分叉点,直至子数据集都属于同一类或者所有特征用光了。
相关公式

注意

CART树是二叉树,所以只有两个分支,所以对特征值中无论离散型还是连续性我们都要将特征分成两种情况,怎么解决呢?

离散型

如果特征的值是离散的,并且是具有两个以上的取值,则CART算法会考虑将目标类别合并成两个超类别(双化)。因为CART树是二叉树,所以对于有N(N≥3)个取值的离散特征,在处理时也只能有两个分支,这就要通过组合创建二取值序列并取GiniGain最小者作为树分叉决策点。例如,某特征值具有[‘young’,’middle’,’old’]三个取值,那么二分序列会有如下3种可能性:[((‘young’,), (‘middle’, ‘old’)), ((‘middle’,), (‘young’, ‘old’)), ((‘old’,), (‘young’, ‘middle’))]。
离散型简单例子

现在来看有房情况这个特征,那么按照它划分后的Gini指数计算如下: 

而对于婚姻状况特征来说,它的取值有3种,按照每种属性值分裂后Gini指标计算如下: 

连续性

如果特征的取值范围是连续的,则CART算法需要把连续属性转换为离散属性再进行处理。如果有N条样本,那么我们有N-1种离散化的方法:<=vjvj的分到左子树,>vjvj的分到右子树。取这N-1种情况下GiniGain最小的离散化方式。

连续性简单例子

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

剪枝的概念及原由

分析CART的递归建树过程,不难发现它实质上存在着一个数据过度拟合问题。在决策树构造时,由于训练数据中的噪音或孤立点,许多分枝反映的是训练数据中的异常,使用这样的判定树对类别未知的数据进行分类,分类的准确性不高。因此试图检测和减去这样的分支,检测和减去这些分支的过程被称为树剪枝。树剪枝方法用于处理过分适应数据问题。通常,这种方法使用统计度量,减去最不可靠的分支,这将导致较快的分类,提高树独立于训练数据正确分类的能力。

剪枝的分类

前剪枝
预剪枝是在决策树的生成过程中,对每个结点划分前先做评估,如果划分不能提升决策树的泛化性能,就停止划分并将此节点记为叶节点;

后剪枝

后剪枝是在决策树构造完成后,自底向上对非叶节点进行评估,如果将其换成叶节点能提升泛化性能,则将该子树换成叶节点。

当然啦,不能随便剪,会有不同的方法来衡量,可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。

关于前后剪枝大家可以看一遍写的不错的博客

https://blog.csdn.net/leaf_zizi/article/details/83380081

下面我们来看剪枝直观的效果

CART中采用代价复杂度剪枝(CCP,我们来了解一下

该算法为子树Tt定义了代价(cost)和复杂度(complexity),以及一个可由用户设置的衡量代价与复杂度之间关系的参数α,其中,代价指在剪枝过程中因子树Tt被叶节点替代而增加的错分样本,复杂度表示剪枝后子树Tt减少的叶结点数,α则表示剪枝后树的复杂度降低程度与代价间的关系,定义为:

其中,

|N1|:子树Tt中的叶节点数;

R(t):结点t的错误代价,计算公式为R(t)=r(t)*p(t),

r(t)为结点t的错分样本率,p(t)为落入结点t的样本占所有样本的比例;

R(Tt):子树Tt错误代价,计算公式为R(Tt)=∑R(i),i为子树Tt的叶节点。

CCP剪枝算法分为两个步骤:

1.对于完全决策树T的每个非叶结点计算α值,循环剪掉具有最小α值的子树,直到剩下根节点。在该步可得到一系列的剪枝树{T0,T1,T2......Tm},其中T0为原有的完全决策树,Tm为根结点,Ti+1为对Ti进行剪枝的结果;

2.从子树序列中,根据真实的误差估计选择最佳决策树。

C4.5悲观剪枝(PEP)

剪枝处理通过主动去掉一些分支来降低决策树分支太多,来防止训练样本学习地太好(过拟合,把训练集自身的一些特点当做所有数据都具有的一般特性)的发生。在C4.5算法中,采用了悲观剪枝(PEP算法)的方法,使用训练集生成决策树,又用训练集来进行剪枝。 悲观剪枝主要通过递归估算每个内部节点所覆盖样本节点的误判率,然后假设需要进行剪枝操作,则剪枝后该内部节点会变成一个叶子节点,该叶子节点的类别为原内部节点的最优叶子节点所决定。计算比较剪枝前后该节点的错误率来决定是否进行剪枝。

关于悲观剪枝发现有一个不错的博客,大家可以看,里面有简单的例子

https://www.cnblogs.com/starfire86/p/5749334.html

猜你喜欢

转载自blog.csdn.net/LuYi_WeiLin/article/details/85566969