[搜索树算法]C4.5算法,个人笔记



算法概述:

(他是一种决策树诱导算法)

C4.5算法是在有监督条件下,诱导生成一组从属性值到类别的映射,并通过该映射来分类新的数据集的一种机器学习算法。他可以从训练数据中生长出一棵决策树,并通过剪枝操作弱化其依赖性,使其能够更好的拟合新数据、对新数据进行结果预测。

一个简单的实例理解C4.5算法的作用:

通过天气状况预测是否下雨。预测属性(有/无云、有/无日)->结果属性(下雨/不下雨)

首先获得这一个月内关于这三个属性的统计数据; 然后根据这些数据(训练集)运行 C4.5 算法。 C4.5 算法大体分两步,具体写在后面; 算法结果得到一组从有没有云、有没有太阳,到下不下雨的属性映射; 根据这些属性,拿明天的情况对号入座,如:有太阳,没有云— >( 是个人都知道不下雨,但机器不知道, C4.5 算法的作用就是告诉机器来学到这个经验。 )

可以这么说:

C4.5就是让机器从过往经验中,学习到预测未来的能力,尽管这个能力可能不精确”

      需要注意以下几点:他是需要训练的、他可能是需要验证的(在剪枝操作的时候)、他的预测是有错误率,但也有容错率的。

 

工作原理:

      (决策树诱导模式递归)

      C4.5拿到训练集数据后怎么办呢,找规律。

作为一个选择算法,当然希望选择出的结果尽可能精确,而如何通过有限的几个属性来提高选择的精度,如何对这几个属性进行先后顺序的排列,就是C4.5算法的第一个重点问题。人可以通过看某一个属性和决策属性的关联程度,来大致判断该属性对于决策的影响程度,如:假设当你看到一个月内有云和下雨几乎没有什么“杂质”(有云就下雨),而有太阳和下雨却是五五开(有太阳并不影响下不下雨),那么在做决策——估计明天下不下雨的时候,肯定优先考虑有没有云这个选项。

 

机器同样有这样的考量,他将这种对决策结果的影响程度称之为信息增益。(实际使用的是信息增益率)信息增益的计算方法为:

决策熵条件熵

    决策熵:用于决策的属性的熵,具体本例就是下不下雨这个属性;

      条件熵:任取的训练集中的某一属性,本例分别取云的情况太阳的情况。(注意此处没有说有没有云,有没有日,因为有云,没有云,有日,没有日是具体的属性值,而进行信息增益计算时,考虑的是属性列,碰巧本例属性列只包含两个属性,因此可以用TF表示)

下面写一个具体的算式:

      信息增益(云层) =(Rain?) – [比重(有云) * (有云且下雨) +比重(没云) *(没云且下雨)]

      (Rain?) = [- P(下雨) * log2为底P(下雨)] + [ - P(不下雨) * log2为底P(不下雨)]

      >负的某属性值在全部属性值中的频率*该频率的对数,然后将所有属性值结果求和,就是该属性列的熵。条件熵的P则是在某条件下,某事件发生的频率(此处用到了频率估计概率的知识)

 

然后分别计算每一个属性列对于决策属性的信息增益,信息增益最大的那个,自然就是我们构造决策树时的最佳属性,该最佳属性就成为决策树的第一个分支。(贪婪选择)

接着就可以在分支上递归进行算法了,选择下一个最佳属性(但不再选择上一步已经选择的那个属性,原因:在当前这个分支上,那个属性已经是“纯的”了,即所有当前分支的这个属性,都是相同值),建立下一个分支,直到终止。(终止条件后面说)

注意,在不同子树选择到的最佳属性可能不是相同的,如左子树选择有没有太阳作为下一个最佳属性,右子树可能选择空气湿度作为最佳属性建立分支。(原因:进行一次分支时,数据集分裂为两个子集,在不同子集上自然可能有不同的分布情况)。但并非一定是不同的,也存在碰巧几个子树都选择某属性作为下一分支条件的情况。

 

而上文提到,C4.5其实使用的是信息增益率作为分支考量,为什么呢?信息增益率又是什么东西呢?

为什么用信息增益率呢?这里不妨将例子中的日期作为一个有效属性来试试。一个月内日期自然是全都不相同的,30个不同日期,每一个都成为一条分支,且分支的数据全都是“纯的”且仅含一个实例集(那当然了,一天要么下了雨要么不下雨)那么你对日期的信息增益进行计算,就会得到一个惊人的结果(闲得慌可以算算,反正我没算都知道肯定他最大)。显然是不合理的嘛。信息增益趋向于选择分支更多的属性,你把子集分的越细,他越喜欢选你。

而信息增益率又是什么呢?增益率,A属性信息增益与A属性的熵的比值。(注意是A属性,跟决策属性没有半毛钱联系,单单纯纯的A属性的熵)为什么取这个熵来做比值就能抵消掉上文提到的分支细带来的影响呢?这是一个数学题啊少年,负的2为底x的对数是一个减函数,又因为P一定小于1,所以明显P越小,这个log越大,几个很大很大的数相加,自然而然的熵也变大,分支越细熵越大,拿他当分母,数当然就变小了。

 

上面考虑的属性都是离散的,XOR或者描述性质的(如颜色,红橙黄绿青蓝紫,他是不连续的属性值)。针对连续属性,比如实数,处理方法如下:

连续值当然不可能一个一个取,他需要选择一个阈值X,然后将实例集分为大于X,小于等于X两个子树。阈值选取即选取合适的切分点,选取方式为先对数值从小到大排序,然后在分别选取相继的两个值中间作为切分点,计算其信息增益(这里不使用信息增益率,不解释,同学们,考点要记[敲黑板]),有N个实例就要进行N-1次计算,取最大的信息增益,此时的切分点就是应取的切分点,然后再针对该切分点计算信息增益率,并和其他属性比较,选择最大的信息增益率作为子树分支条件。

 

上文是决策树的生长过程,他是递归的一个算法调用。何时停止生长?为了求取精确,我们自然需要树尽可能的生长完全,即当某子树的实例集为“纯”的时候(这个子树包含的实例的全部决策属性都相同),停止生长。或者:当前分支的实例总数低于规定的阈值(前面也说了,不能太过拟合训练集,不然没办法做预测,适当的让他不精确一点也好)。

 

完成生长后如何选择叶节点的属性呢?选择占最大比例的类别作为当前叶子节点的类别。(当然如果是纯的叶节点那就直接取就行了,不纯的就要取含量最多的,尽量确保叶节点纯度)

 

算法特性:

      (决策树剪枝,用于预测)

完成剪枝之后的决策树无法再被还原成原来的树。

摘录:前面的算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan教授试验,在数据集中,过拟合的决策树的错误率比经过简化的决策树的错误率要高。

上文生成的决策树不能用于预测,说白了就是过度拟合原始训练集,需要剪枝操作来去依赖。它通常是在树完全生成后进行的,采用自下而上的方式。(又称后剪枝操作,因为是在树生成后开始的剪枝;预剪枝操作是在树生成过程中添加限制,使其不能完全生长(也就是提早结束生长),C4.5使用的是后剪枝操作。)

剪枝方法分两类,一类需要一个新的测试数据集,包括1.cost-complexitypruning基于成本复杂度的剪枝,和2.Reducederror pruning错误消减剪枝;另一类基于原始的训练集进行剪枝,3.Pessimistic pruning悲观剪枝。

1.Cost-Complexity Pruning(CCP、代价复杂度)

CCP方法包含两个步骤:

1:从原始决策树T0开始生成一个子树序列{T0T1T2...Tn},其中Ti+1是从Ti总产生,Tn为根节点(每个树都是把前一个树的某个或者某些子树替换成叶子节点)

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

在步骤一中,生成子树序列{T0T1T2...Tn}的基本思想是从T0开始,裁剪Ti中关于训练数据集合误差增加最小的分支来得到Ti+1。实际上当一棵树T在结点t出剪枝时,它的误差增加直观上认为是:

其中R(t)为在结点t的子树被裁剪后结点t的误差,R(Tt)为在结点t的子树没被裁剪时子树T的误差。不过剪枝后T的叶子树减少了|L(Ti)|-1,其中|L(Ti)|为子树Ti的叶子树,也就是说T的复杂性降低。因此考虑到树的复杂性因素,树分支被裁剪后误差增加率可以由下式决定:

Ti+1就是选择Ti中具有最小\alpha值所对应的剪枝树

如何从第一步骤产生的子树序列{T0T1T2...Tn}中选择出最佳决策树是CCP方法的第二步骤的关键。通常可以采用V-交叉验证(V-foldCross-Validation)和基于独立剪枝数据集两种方法,这两种方法可以参考(Classification And Regression Trees,Breiman et.al)。当使用基于独立数据集剪枝时,和REP方法相比,CCP选择出来的最有决策树,不是从原始决策树T的所有可能子树中得到,所以有可能会找到到最有决策树。

 

2. Reduced-Error Pruning(REP,错误率降低剪枝)

该剪枝方法考虑将树上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:

1:删除以此结点为根的子树

2:使其成为叶子结点

3:赋予该结点关联的训练数据的最常见分类

4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点

(就是说把一个中间节点作为叶子,把他的子树的数据集合起来,作为他的数据集,然后算这个叶子节点的错误率,如果验证的性能比原来的好或者不好不坏,就删掉子树,把它作为叶子,是一个自下而上的过程)

因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪“有害”为止(有害是指修剪会减低验证集合的精度)

REP是最简单的后剪枝方法之一,不过在数据量比较少的情况下,REP方法趋于过拟合而较少使用。这是因为训练数据集合中的特性在剪枝过程中被忽略,所以在验证数据集合比训练数据集合小的多时,要注意这个问题。

尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。

 

*摘录:

3.Pessimistic Error Pruning(PEP,悲观剪枝)

先计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项式分布,并计算它的标准差。对于给定的置信区间,采用下界估计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略能够非常接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法尽管不是统计有效的,但是在实践中有效。

PEP为了提高对测试集合的预测可靠性,PEP对误差估计增加了连续性校正(ContinuityCorrection)PEP方法认为,如果:

 

成立,则Tt应该被剪枝,上式中: 

其中,e(t)为结点t出的误差;i为覆盖Tt的叶子结点;Nt为子树Tt的叶子树;n(t)为在结点t处的训练集合数量。PEP采用自顶向下的方式,如果某个非叶子结点符合上面的不等式,就裁剪掉该叶子结点。该算法被认为是当前决策树后剪枝算法中经度比较高的算法之一,但是饿存在有缺陷。首先,PEP算法是唯一使用Top-Down剪枝策略,这种策略会导致与先剪枝出现同样的问题,将该结点的某子节点不需要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。

虽然PEP方法存在一些局限性,但是在实际应用中表现出了较高的精度,。两外PEP方法不需要分离训练集合和验证机和,对于数据量比较少的情况比较有利。再者其剪枝策略比其它方法相比效率更高,速度更快。因为在剪枝过程中,树中的每颗子树最多需要访问一次,在最坏的情况下,它的计算时间复杂度也只和非剪枝树的非叶子节点数目成线性关系。

 

特殊情况:

      缺失值处理:

三种情况:

1.属性a含有缺失值,要计算其属性增益率,做法:忽略;选最常用的(离散)或者均值(连续);依据含缺失值实例的比重来估计不含缺失值时应该是多少增益率;填充新值或依据现有值推算确定缺失值;

2.已经选定属性a为分支条件,对于属性a缺失的实例,做法:忽略;取最常用的填充;按照已知属性训练集在子树分裂的比例来拆分缺失实例,(一个子树分一点,与子树实例树成正比);直接把他赋给所有子树;专门为缺失值建立一个分支;确定缺失值最可能的取值情况;

3.对生成好的决策树进行新数据的分类时,对于新实例存在属性缺失,做法:若有单独的缺失分支,走这一支;走最常用分支;确定最有可能的取值;走所有分支,并计算概率;不再进行分支测试,直接给他赋最有可能的类别。

你可能感兴趣的:(DateMiner)